基于决策树的泰坦尼克号幸存者分析

作者: 皮皮大 | 来源:发表于2020-01-10 17:16 被阅读0次

    基于决策树泰坦尼克号幸存者进行分析

    • 缺失值的处理

    • 将字符型数据转成数值型

    • 特征属性数据和标签属性的分离

    • 决策树的建模

    • 网格搜索的建立

    导入模块

    import numpy as np 
    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib inline
    import seaborn as sns
    sns.set() # setting seaborn default for plots
    
    from sklearn.tree import DecisionTreeClassifier    # 分类决策树
    from sklearn.model_selection import GridSearchCV   # 网格搜索
    from sklearn.model_selection import train_test_split # 训练集和测试集的划分
    from sklearn.model_selection import cross_val_score  # 交叉验证模块
    

    导入数据

    data = pd.read_csv("/Users/peter/data-visualization/train.csv")  
    

    查看数据信息

    image

    删除缺失值

    # 去掉缺失值过多的列 Cabin (直接删掉),以及和观测判断来说和预测的y没有关系的列(Name, Ticket)
    data.drop(["Cabin", "Name", "Ticket"], inplace=True, axis=1)
    

    中值填充

    某个字段缺失值不是太多,使用中值填充

    # Age属性用中值填充
    data['Age'] = data['Age'].fillna(data['Age'].mean())  
    
    image

    如果只是很少部分的缺失值,比如Embarked字段,直接dropna

    data = data.dropna()   # 只要是存在的缺失值都给删掉
    data.info()
    
    image

    将属性的值转成数值型

    Python不能直接处理字符串数据,需要转成数值型

    • Embark中存在["S", "C", "Q"]3种结果:现将结果转成列表,再从列表中取出对应的索引(数字)
    • Sex字段中存在["male", "female"]2种结果:只有两个结果的情形,通过bool值来解决
    # 方法1
    # 属性的结果存在多个不同的取值
    labels = data["Embarked"].unique().tolist()  # ["S", "C", "Q"]
    # 将Embarked属性中的 ["S", "C", "Q"]转成0,1,2
    data['Embarked']= data['Embarked'].apply(lambda x: labels.index(x))   
    
    
    # 方法2
    data["Sex"] = (data["Sex"] == "male").astype("int")  # 先获取bool值,再将bool值转成0-1
    
    # 方法3:通过loc来实现
    # data.loc[:, "Sex"] = (data["Sex"] == "male").astype("int")
    
    image image

    特征属性和标签的分离

    根据某个属性将数据分成特征数据和标签数据(最后的预测值或者输出值)

    x = data.iloc[:, data.columns != "Survived"]
    y = data.iloc[:, data.columns == "Survived"]
    

    随机划分数据后的索引还原

    # 划分训练集和测试集
    Xtrain, Xtest, ytrain, ytest = train_test_split(x, y, test_size=0.3)
    
    for i in [Xtrain, Xtest, ytrain, ytest]:
        i.index = range(i.shape[0])  # shape属性的第一个元素就是索引的总个数
    
    image image

    决策树的建模过程

    clf = DecisionTreeClassifier(random_state=25)
    clf = clf.fit(Xtrain, ytrain)
    score = clf.score(Xtest, ytest)
    score
    
    # 交叉验证
    clf = DecisionTreeClassifier(random_state=25)
    score = cross_val_score(clf, x, y, cv=10).mean()  # 10次交叉验证求均值,结果降低
    score   
    

    学习曲线

    tr = []  # 两个空列表用来存储训练得到的两个分数
    te = []
    for i in range(10):
        clf = DecisionTreeClassifier(random_state=25   # 实例化模型,设定决策树的最大深度
                                    ,max_depth=i+1
                                    ,criterion="entropy"  # 默认是基尼系数。一般情况下,entropy是欠拟合的情况下才使用
                                    )
        clf = clf.fit(Xtrain, ytrain)  # fit训练过程
        score_tr = clf.score(Xtrain, ytrain)  # 训练集score
        score_te = cross_val_score(clf, x, y, cv=10).mean()   # 测试集分数,取均值
        tr.append(score_tr)
        te.append(score_te)
        
    print(max(te))
    plt.plot(range(1,11), tr, color="red", label="train")  # x,y,颜色,label
    plt.plot(range(1,11), te, color="blue", label="test")
    plt.xticks(range(1,11)) # 横坐标范围固定在1-10
    plt.legend()  # 图例
    plt.show()
    
    image

    网格搜索demo

    gini_threholds = np.linspace(0, 0.5, 20)   # gini:0-0.5
    #entropy_threholds = np.linspace(0,1,20)  entropy:0-1
    
    # 参数
    parameter = {
        "criterion":("gini", "entropy")
        ,"splitter":("best", "random")
        ,"max_depth":[*range(1,10)]
        ,"min_samples_leaf":[*range(1,50,5)]
        ,"min_impurity_decrease":gini_threholds
    }
    
    # 网格搜索
    clf = DecisionTreeClassifier(random_state=25)
    GS = GridSearchCV(clf, parameter, cv=10)  # 同时满足fit,score,交叉验证3种功能
    GS = GS.fit(Xtrain, ytrain)
    
    # 2个重要的属性
    GS.best_params_   # 显示属性的最好组合结果
    GS.best_score_   
    
    image

    相关文章

      网友评论

        本文标题:基于决策树的泰坦尼克号幸存者分析

        本文链接:https://www.haomeiwen.com/subject/btlmactx.html