数据分析实战 45 讲
陈旸
清华大学计算机博士
85359 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

19丨决策树(下):泰坦尼克乘客生存预测

在前面的两篇文章中,我给你讲了决策树算法。决策树算法是经常使用的数据挖掘算法,这是因为决策树就像一个人脑中的决策模型一样,呈现出来非常直观。基于决策树还诞生了很多数据挖掘算法,比如随机森林(Random forest)。
今天我来带你用决策树进行项目的实战。
决策树分类的应用场景非常广泛,在各行各业都有应用,比如在金融行业可以用决策树做贷款风险评估,医疗行业可以用决策树生成辅助诊断,电商行业可以用决策树对销售额进行预测等。
在了解决策树的原理后,今天我们用 sklearn 工具解决一个实际的问题:泰坦尼克号乘客的生存预测。

sklearn 中的决策树模型

首先,我们需要掌握 sklearn 中自带的决策树分类器 DecisionTreeClassifier,方法如下:
clf = DecisionTreeClassifier(criterion='entropy')
到目前为止,sklearn 中只实现了 ID3 与 CART 决策树,所以我们暂时只能使用这两种决策树,在构造 DecisionTreeClassifier 类时,其中有一个参数是 criterion,意为标准。它决定了构造的分类树是采用 ID3 分类树,还是 CART 分类树,对应的取值分别是 entropy 或者 gini:
entropy: 基于信息熵,也就是 ID3 算法,实际结果与 C4.5 相差不大;
gini:默认参数,基于基尼系数。CART 算法是基于基尼系数做属性划分的,所以 criterion=gini 时,实际上执行的是 CART 算法。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(81)

  • 最新
  • 精选
  • 一只眼看世界
    还有个问题 决策树怎么读? 就是每个方框内的数据都代表什么意思呢?

    作者回复: 你可以看下输出的决策树的图形,有几个数值你需要了解: 比如类似 X[7]<=0.5 这种就是告诉你这个节点,选择的属性是X[7],阈值是0.5。 当<=0.5的时候,决策进入到左子树,当>0.5的时候,决策进入到右子树。 entropy实际上代表了信息不纯度,这个数值越大,代表纯度越低。 samples代表的是这个节点的样本数,比如samples=891,就代表这个节点一般有891个样本。然后value这个数组会告诉你这个样本集是如何分布的,比如value=[549,342],即891个样本,有549个为True,也就是X[7]<=0.5,还有342个样本为False,即这些样本的X[7]>0.5 好了,然后继续上面的分裂过程,直到叶子节点,纯度越来越高,最终归为同一个类别时,纯度最高,entropy=0,此时样本都为同一个类别,也就是按照这条线路可以得到的最终分类结果。 所以你能看到:决策树的使用,就是从根节点开始,然后属性划分,当<=阈值时走左子树,>阈值时走右子树,最终在叶子节点可以得到分类的结果。你指的每个方框里的entropy, samples, vale都是中间的计算结果。 这样解释决策图的使用不知道是否理解,希望对你能有帮助。

    45
  • 小熊猫
    fit 从一个训练集中学习模型参数,其中就包括了归一化时用到的均值,标准偏差等,可以理解为一个训练过程。 transform: 在fit的基础上,对数据进行标准化,降维,归一化等数据转换操作 fit_transform: 将模型训练和转化合并到一起,训练样本先做fit,得到mean,standard deviation,然后将这些参数用于transform(归一化训练数据),使得到的训练数据是归一化的,而测试数据只需要在原先fit得到的mean,std上来做归一化就行了,所以用transform就行了。

    编辑回复: 总结的很好。需要注意的是,transform和fit_transform虽然结果相同,但是不能互换。因为fit_transform只是 fit+transform两个步骤合并的简写。而各种分类算法都需要先fit,然后再进行transform。所以如果把fit_transform替换为transform可能会报错。

    2
    26
  • 每天晒白牙
    # 依赖包从 cmd中 pip install即可 import pandas as pd import numpy as np from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import cross_val_score from sklearn import tree import graphviz # 数据加载 train_data = pd.read_csv('D:/workspace/study/python/Titanic_Data/train.csv') test_data = pd.read_csv('D:/workspace/study/python/Titanic_Data/test.csv') # 数据探索 print(train_data.info()) print('-'*30) print(train_data.describe()) print('-'*30) print(train_data.describe(include=['O'])) print('-'*30) print(train_data.head()) print('-'*30) print(train_data.tail()) # 数据清洗 # 使用平均年龄来填充年龄中的 nan 值 train_data['Age'].fillna(train_data['Age'].mean(), inplace=True) test_data['Age'].fillna(test_data['Age'].mean(), inplace=True) # 使用票价的均值填充票价中的 nan 值 train_data['Fare'].fillna(train_data['Fare'].mean(), inplace=True) test_data['Fare'].fillna(test_data['Fare'].mean(), inplace=True) # 使用登录最多的港口来填充登录港口的 nan 值 train_data['Embarked'].fillna('S', inplace=True) test_data['Embarked'].fillna('S', inplace=True) # 特征选择 features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked'] train_features = train_data[features] train_labels = train_data['Survived'] test_features = test_data[features] dvec = DictVectorizer(sparse=False) train_features = dvec.fit_transform(train_features.to_dict(orient='record')) print(dvec.feature_names_) # 决策树模型 # 构造 ID3 决策树 clf = DecisionTreeClassifier(criterion='entropy') # 决策树训练 clf.fit(train_features, train_labels) # 模型预测 & 评估 test_features=dvec.transform(test_features.to_dict(orient='record')) # 决策树预测 pred_labels = clf.predict(test_features) # 决策树准确率 acc_decision_tree = round(clf.score(train_features, train_labels), 6) print(u'score 准确率为 %.4lf' % acc_decision_tree) # K 折交叉验证统计决策树准确率 print(u'cross_val_score 准确率为 %.4lf' % np.mean(cross_val_score(clf, train_features, train_labels, cv=10))) # 决策树可视化 dot_data = tree.export_graphviz(clf, out_file=None) graph = graphviz.Source(dot_data) graph.view()

    作者回复: Good Job

    4
    25
  • 不做键盘侠
    Fare似乎没有缺失值?

    编辑回复: 训练集train_data中Fare没有缺失值,测试集test_data中Fare有缺失值。 通过print(test_data.info()) 可以看到,所以train_data可以补用填充,而test_data需要对缺失值做处理。

    4
    17
  • Lambert
    # 决策树可视化 from sklearn import tree import graphviz dot_data = tree.export_graphviz(clf, out_file=None) graph = graphviz.Source(dot_data) graph.render("tree") graph.view('graph')

    作者回复: Good Job

    2
    9
  • 柚子
    关于graphviz:我用的是anaconda,通过在anaconda prompt界面输入 conda install python-graphviz 可以直接安装graphviz

    作者回复: 可以的

    2
    8
  • 上官
    Carbin缺失率分别为 77% 和 78%, Age\Fare有缺失值,这都是在哪儿判断出来的?

    编辑回复: 在数据探索的过程中,我们可以通过打印train_data.info()和test_data.info()得出。 你能看到训练集train_data中一共有891行数据,其中Cabin有204个非空数据。同理,测试集test_data中一共有418行数据,其中Cabin有91个非空数据。所以Cabin缺失率分别是77%和78%。同理,你能看到训练集和测试集中的Age字段有缺失值(即空值),测试集中的Fare有缺失值。

    8
  • 听妈妈的话
    https://github.com/apachecn/kaggle/tree/master/competitions/getting-started/titanic 我个人认为这里的预测方案写的更加详细一点,大家可以参考一下

    作者回复: 不错的分享

    3
    7
  • hh
    老师的课太值了,请问老师还有其他课吗,真是干货满满

    编辑回复: 多谢支持,后续有和数据相关的课程。 数据分析中的知识点比较多,同时也需要一些基础。所以课程中,有些基础的内容会省略,虽然专栏前面有3节关于python的内容,不过还是需要一定的python基础。另外每篇文章篇幅有限,我会尽量在讲解算法使用的基础上,进行一个完整的项目交付。很多使用细节和体会,还需要你通过日常的学习慢慢进行总结。

    7
  • 笔落惊风雨
    我表示真的没看明白 来回来看5遍了

    编辑回复: 我上传了完整的代码到GitHub上。你可以先自己运行一遍。如果有哪个模块不理解的,你可以加到微信群里,和我单独交流。也可以直接加我微信 cylearn123。

    5
收起评论
显示
设置
留言
81
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部