• 【阿旭机器学习实战】【13】决策树分类模型实战:泰坦尼克号生存预测


    【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。

    本文用机器学习中的决策树分类模型对泰坦尼克号生存项目进行预测。

    关于决策树的详细介绍及原理参见前一篇博文【阿旭机器学习实战】【12】决策树基本原理及其构造与使用方法.

    决策树分类模型实战:泰坦尼克号生存预测

    导入数据集并查看基本信息

    import pandas as pd
    
    • 1
    titanic = pd.read_csv("../data/titanic.txt")
    titanic.head()
    
    • 1
    • 2
    row.namespclasssurvivednameageembarkedhome.destroomticketboatsex
    011st1Allen, Miss Elisabeth Walton29.0000SouthamptonSt Louis, MOB-524160 L2212female
    121st0Allison, Miss Helen Loraine2.0000SouthamptonMontreal, PQ / Chesterville, ONC26NaNNaNfemale
    231st0Allison, Mr Hudson Joshua Creighton30.0000SouthamptonMontreal, PQ / Chesterville, ONC26NaN(135)male
    341st0Allison, Mrs Hudson J.C. (Bessie Waldo Daniels)25.0000SouthamptonMontreal, PQ / Chesterville, ONC26NaNNaNfemale
    451st1Allison, Master Hudson Trevor0.9167SouthamptonMontreal, PQ / Chesterville, ONC22NaN11male
    # 打印数据集表头
    titanic.columns
    
    • 1
    • 2
    Index(['row.names', 'pclass', 'survived', 'name', 'age', 'embarked',
           'home.dest', 'room', 'ticket', 'boat', 'sex'],
          dtype='object')
    
    • 1
    • 2
    • 3

    数据字段的含义:

    数据集中有12 个字段,每一个字段的名称和含义如下
    PassengerId:乘客 ID
    Survived:是否生存
    Pclass:客舱等级
    Name:乘客姓名
    Sex:性别
    Age:年龄
    SibSp:在船兄弟姐妹数/配偶数
    Parch:在船父母数/子女数
    Ticket:船票编号
    Fare:船票价格
    Cabin:客舱号
    Embarked:登船港口

    选择属性:通过分析发现某些属性(如:name)和是否生还没有关系

    选择特征并进行特征处理

    # 我们选择"pclass","age","sex"这三个主要特征进行模型训练
    x = titanic[["pclass","age","sex"]]
    y = titanic[["survived"]]
    
    • 1
    • 2
    • 3

    补全缺失值

    x.isnull().any()
    
    • 1
    pclass    False
    age        True
    sex       False
    dtype: bool
    
    • 1
    • 2
    • 3
    • 4
    # 查看缺失
    x.info()
    
    • 1
    • 2
    
    RangeIndex: 1313 entries, 0 to 1312
    Data columns (total 3 columns):
    pclass    1313 non-null object
    age       633 non-null float64
    sex       1313 non-null object
    dtypes: float64(1), object(2)
    memory usage: 30.9+ KB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    # 分析发现年龄缺失了一半,如果全都丢弃,数据损失过多
    # 丢弃不行需要填补,用所有年龄的平均值来填补
    x["age"].fillna(x["age"].mean(),inplace=True)
    
    
    • 1
    • 2
    • 3
    • 4
    D:\anaconda3\lib\site-packages\pandas\core\generic.py:5430: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame
    
    See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
      self._update_inplace(new_data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
    
    • 1
    x_train[:10]
    
    • 1
    pclassagesex
    12203rd31.194181female
    1741st46.000000male
    1441st35.000000female
    1511st46.000000male
    3912nd18.000000male
    5632nd25.000000male
    12603rd31.194181male
    4282nd6.000000female
    5802nd36.000000female
    3442nd26.000000male

    特征处理:对特征进行向量化

    from sklearn.feature_extraction import DictVectorizer
    
    • 1
    vec = DictVectorizer(sparse=False)#sparse=False意思是不产生稀疏矩阵
    
    • 1
    # 非数字类型的特征向量化
    x_train = vec.fit_transform(x_train.to_dict(orient="record"))
    
    • 1
    • 2
    x_train[:5]
    
    • 1
    array([[31.19418104,  0.        ,  0.        ,  1.        ,  1.        ,
             0.        ],
           [46.        ,  1.        ,  0.        ,  0.        ,  0.        ,
             1.        ],
           [35.        ,  1.        ,  0.        ,  0.        ,  1.        ,
             0.        ],
           [46.        ,  1.        ,  0.        ,  0.        ,  0.        ,
             1.        ],
           [18.        ,  0.        ,  1.        ,  0.        ,  0.        ,
             1.        ]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    x_train.shape
    
    • 1
    (984, 6)
    
    • 1
    x_test = vec.fit_transform(x_test.to_dict(orient="record"))
    
    • 1
    x_test.shape
    
    • 1
    (329, 6)
    
    • 1

    创建决策树模型,训练预测

    dt = DecisionTreeClassifier()
    
    • 1
    dt.fit(x_train,y_train)
    
    • 1
    DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                max_features=None, max_leaf_nodes=None,
                min_impurity_decrease=0.0, min_impurity_split=None,
                min_samples_leaf=1, min_samples_split=2,
                min_weight_fraction_leaf=0.0, presort=False, random_state=None,
                splitter='best')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    y_pre = dt.predict(x_test)
    
    • 1
    y_pre[:10],y_test[:10]
    
    • 1
    (array([0, 0, 1, 0, 1, 0, 0, 0, 0, 0], dtype=int64),       survived
     908          0
     822          0
     657          1
     856          0
     212          1
     641          1
     305          0
     778          1
     818          1
     1179         0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    dt.score(x_test,y_test)
    # score也成为准确性,只能从宏观上查看到一个模型的准确程度
    
    • 1
    • 2
    0.7872340425531915
    
    • 1

    性能评测报告

    from sklearn.metrics import classification_report
    
    • 1
    print(classification_report(y_pre,y_test,target_names=["died","servived"]))
    
    • 1
                 precision    recall  f1-score   support
    
           died       0.92      0.78      0.84       244
       servived       0.56      0.81      0.66        85
    
    avg / total       0.83      0.79      0.80       329
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    性能评测报告的相关指标:

    比如两个类别A和B,预测的情况会有四种:True A、True B、False A、False B
    1、准确率(score):模型预测的正确的概率:score = (True A+True B)/(True A + True B + False A +False B)
    2、精确率:表示的是每一个类别预测准确的数量占所有预测为该类别的数量的比例:precision_a = True A / (True A + False A)
    3、召回率:表示的每一个类别预测正确的数量占这里类别真正数量的比例:recall_a = True A / (True A + False B)
    4、F1指标:F1_a = 2/(1/precision_a + 1/recall_a) = 2*(precision_a*recall_a)/(precision_a+recall_a) 调和平均数,F1指标指的就是精确率和召回率的调和平均数,除了把精确率和召回率平均,还可以给两个指标相近的模型以较高的评分;
    【注意】如果精确率和召回率差距太大,模型就不具备参考价值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果内容对你有帮助,感谢点赞+关注哦!

    欢迎关注我的公众号:阿旭算法与机器学习,共同学习交流。
    更多干货内容持续更新中…

  • 相关阅读:
    Python中拟合线性方程(最小二乘法)
    Vue Router
    服务器租用机房机房的类型应该如何选择
    Linux进程创建、进程终止、进程等待、进程程序替换
    springboot+文达云课堂 毕业设计-附源码210908
    MindFusion.Java Swing Pack 2022图表控件
    * 论文笔记 【Wide & Deep Learning for Recommender Systems】
    msvcr120.dll丢失是什么意思,快速修复msvcr120.dll丢失的问题的方法分享
    十六、CANdelaStudio深入-CDD与CDDT的差异(新建自定义服务)
    实验六 并行口8255的使用—LED静态显示
  • 原文地址:https://blog.csdn.net/qq_42589613/article/details/127653667