数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17314 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

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

陈旸 2019-01-25
在前面的两篇文章中,我给你讲了决策树算法。决策树算法是经常使用的数据挖掘算法,这是因为决策树就像一个人脑中的决策模型一样,呈现出来非常直观。基于决策树还诞生了很多数据挖掘算法,比如随机森林(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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(55)

  • ken
    经典入门案例,浅入但没有提供完整的代码和说明,缺少拓展,对包调用的逻辑方法也不够完整。
    是一次手把手练习的实操过程,但有点不上不下的,完全没python基础的可能连sklearn也不知道,有点工程基础的,又没有理论拓展说明,未免鸡肋。

    当然,本人可能严格了。
    2019-01-25
    4
    86
  • 每天晒白牙
    # 依赖包从 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()
    2019-01-30
    15
  • 程序员小熊猫
    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可能会报错。

    2019-02-18
    1
    12
  • 不做键盘侠
    Fare似乎没有缺失值?

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

    2019-02-05
    2
    12
  • MachineLP
    这讲的确需要在精进一些哦,还有后续应该如何通过更好的数据分析进行效果提升也没有体现,感觉这才是关键,并不是简单跑个模型而已。
    2019-01-27
    1
    9
  • 一只眼看世界
    还有个问题 决策树怎么读? 就是每个方框内的数据都代表什么意思呢?

    作者回复: 你可以看下输出的决策树的图形,有几个数值你需要了解:
    比如类似 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都是中间的计算结果。
    这样解释决策图的使用不知道是否理解,希望对你能有帮助。

    2019-07-03
    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有缺失值。

    2019-01-25
    7
  • 听妈妈的话
    我想问Fare是怎么看出来有缺失的呀,数目是891呀
    2019-03-20
    5
  • hh
    老师的课太值了,请问老师还有其他课吗,真是干货满满

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

    2019-02-17
    5
  • 旭霁
    安装 graphviz 工具,并设置好环境变量后,发现还是出错,加了下边两行代码后得以解决。

    import os
    os.environ["PATH"] += os.pathsep + 'D:/Program Files (x86)/Graphviz2.38/bin/'

    在 Windows 中,只需在开头添加这两行,其中 'D:/ Program Files(x86)/Graphviz2.38/bin/' 将替换为 bin 文件所在的地址。
    2019-03-27
    1
    4
  • 听妈妈的话
    https://github.com/apachecn/kaggle/tree/master/competitions/getting-started/titanic
    我个人认为这里的预测方案写的更加详细一点,大家可以参考一下
    2019-03-21
    1
    4
  • 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')
    2019-02-27
    4
  • mickey
    # encoding=utf-8
    import pandas as pd
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.tree import DecisionTreeClassifier
    import numpy as np
    from sklearn.model_selection import cross_val_score

    # 数据加载
    train_data = pd.read_csv('./Titanic_Data/train.csv')
    test_data = pd.read_csv('./Titanic_Data/test.csv')

    # 数据探索
    print(train_data.info())
    print(train_data.describe())
    print(train_data.describe(include=['O']))
    print(train_data.head())
    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值
    # print(train_data['Embarked'].value_counts())
    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'))

    # 构造ID3决策树
    clf = DecisionTreeClassifier(criterion='entropy')

    # 决策树训练
    clf.fit(train_features, train_labels)

    # 得到决策树准确率
    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)))
    2019-01-25
    3
  • 笔落惊风雨
    我表示真的没看明白 来回来看5遍了

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

    2019-02-26
    2
  • Python
    这两个函数最后得出的结果完全一样,但实际上用法有所不同。如果一定要两个一起用,那肯定是得先
    fit_transforms,再transforms,不然就会报错。fit_transforms实际上是fit()和transforms()这两个函数的集合

    编辑回复: 对的,如果大家刚接触sklearn,这个是需要注意的地方之一。

    2019-01-25
    2
  • pythonzwd
    咨询一下,就是那个是否生存的结果如何生成出来
    2019-03-22
    1
  • JackWu
    import numpy as np
    import pandas as pd
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import cross_val_score
    from pandas import DataFrame
    # 数据加载
    train_data = pd.read_csv('../data/train.csv')
    test_data = pd.read_csv('../data/test.csv')
    # 数据清洗
    # 使用平均年龄来填充年龄中的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值
    # print(train_data['Embarked'].value_counts())
    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'))
    # 构造ID3决策树
    clf = DecisionTreeClassifier(criterion='entropy')
    # 决策树训练
    clf.fit(train_features, train_labels)
    # 得到决策树准确率
    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)))
    test_features=dvec.transform(test_features.to_dict(orient='record'))
    # 决策树预测
    pred_labels = clf.predict(test_features)
    print(pred_labels)
    features1 = ['PassengerId','Name']
    df1=test_data[features1]
    df1['label'] = pred_labels
    print(df1)
    最后面这几行是我添加的, 我想把predict的结果跟passenger id关联起来,不知道这样做行不行(主要是顺序问题,如果顺序都是乱的,拼接肯定不行),请老师点评。
    score准确率为 0.9820
    cross_val_score准确率为 0.7791
    [0 0 1 1 1.....]
    ------
         PassengerId Name label
    0 892 Kelly, Mr. James 0
    2019-02-14
    1
  • szm
    那个问如何将预测的结果写入到test.csv中的? 直接test_data['Survived'] = pred_labels就可以了。
    2019-01-28
    1
  • 乐天
    安装 Graphviz 库需要下面的几步:

    这个是如何下载安装呢,还是不太懂
    2019-01-28
    1
  • JingZ
    Mac下配置graphviz

    安装brew

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    安装graphviz:

    brew install graphviz
    ---------------------

    #决策树可视化
    from sklearn import tree
    import pydotplus
    from sklearn.externals.six import StringIO
    dot_data = StringIO()
    tree.export_graphviz(clf, out_file=dot_data)
    graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
    graph.write_pdf("Titanic.pdf")
    2019-01-26
    1
收起评论
55
返回
顶部