决策树(分类)及具体案例操作

  • 一、决策树(分类)算法
    • (1)算法原理(类似于“分段函数”)
    • (2)决策树的变量类型
    • (3)量化纯度
    • (4)基本步骤
    • (5)决策树的优缺点
  • 二、决策树(分类)具体案例操作
    • (1)导入数据
    • (2)特征选择
    • (3)数据清洗
    • (4)划分训练集测试集
    • (5)利用分类决策树算法建立模型
    • (6)性能评估
    • 参考文献:

一、决策树(分类)算法

决策树是一种树形结构,为人们提供决策依据,决策树可以用来回答 yes 和 no 问题,它通过树形结构将各种情况组合都表示出来,每个分支表示一次选择(选择 yes 还是 no),直到所有选择都进行完毕,最终给出正确答案。


其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

(1)算法原理(类似于“分段函数”)

通过训练数据构建决策树,可以高效的对未知的数据进行分类。机器学习中,决策树是一个预测模型,代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象属性,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。

(2)决策树的变量类型

① 数字型( Numeric ):变量类型是整数或浮点数。用“ >= ”,“ > ”,“ < ”或“ <= ”作为分割条件(排序后,利用已有的分割情况,可以优化分割算法的时间复杂度)。

② 名称型( Nominal ):类似编程语言中的枚举类型,变量只能重有限的选项中选取。使用“ = ”来分割。

(3)量化纯度

选择一个合适的特征作为判断节点,可以快速的分类,减少决策树的深度。决策树的目标就是把数据集按对应的类标签进行分类。

评估分割点的好坏方法是:如果一个分割点可以将当前的所有节点分为两类,使得每一类都很“纯”,也就是同一类的记录较多,那么就是一个好分割点(构建决策树采用贪心算法,只考虑当前纯度差最大的情况作为分割点)。

最理想的情况是,通过特征的选择能把不同类别的数据集贴上对应类标签,即特征选择的目标使得分类后的数据集比较纯。如何衡量一个数据集纯度,这里就需要引入数据纯度函数:

如果记录被分为 n 类,每一类的比例 P(i) = 第 i 类的数目/总数目。

① 基尼不纯性( Gini Impurity )

② 熵( Entropy )

③ 错误率( Error )

注意:上面的三个公式均是值越大,表示越 “不纯”,越小表示越“纯”。三种公式只需要取一种即可,实践证明三种公司的选择对最终分类准确率的影响并不大,一般使用熵公式。

④ 纯度差,也称为信息增益( Information Gain )

其中, I 代表不纯度(即 ①、②、③ 中任一种),K 代表分割的节点数,一般 K = 2 。vj 表示子节点中的记录数目。该公式实际上就是当前节点(父节点)的不纯度减去子节点不纯度的加权平均数,权重由子节点记录数与当前节点(父节点)记录数的比例决定。

信息增益越大说明这个特征或者这个属性是有利于我们预测的,应当使用该特征生成叶节点。

(4)基本步骤

决策树构建的基本步骤如下:

① 开始,将所有记录看作一个节点;

② 遍历每个变量的每一种分割方式,找到最好变量及其相应的分割点;

③ 分割成两个节点 N1 和 N2 (或多个);

④ 对 N1 和 N2 分别继续执行 ② 和 ③ 步,直到每个节点足够“纯”为止。

(5)决策树的优缺点

优点:

① 决策树模型可以读性好,具有描述性,有助于人工分析。决策树易于理解和实现,人们在在学习过程中不需要使用者了解很多的背景知识,这同时是它的能够直接体现数据的特点,只要通过解释后都有能力去理解决策树所表达的意义。

② 效率高,决策树只需要一次构建,反复使用。

③ 对于决策树,数据的准备往往是简单或者是不必要的,而且能够同时处理数据型和常规型属性,在相对短的时间内能够对大型数据源做出可行且效果良好的结果。

④ 易于通过静态测试来对模型进行评测,可以测定模型可信度;如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。

缺点:

① 对连续性的字段比较难预测。

② 对有时间顺序的数据,需要很多预处理的工作。

③ 当类别太多时,错误可能就会增加的比较快。

二、决策树(分类)具体案例操作

本文以“泰坦尼克号沉船事故”数据集为例,采用决策树模型预测乘客是否遇难。

(1)导入数据

# 导入 pandas 用于数据分析
import pandas as pd# 利用 pandas 的 read_csv 模块直接从互联网收集泰坦尼克号乘客数据
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')# 观察一下前几行数据,可以发现,数据种类各异,数值型、类别型,甚至还有缺失数据
titanic.head()

# 使用 pandas ,数据都转入 pandas 独有的 dataframe 格式(二维数据表格),直接使用 info() ,查看数据的统计特性
titanic.info()


通过上面的输出结果可以知道该数据集的信息资料,该数据集共有 1313 条乘客信息,共 11 个特征,数据种类各异,有些是数值类型的,有些则是字符串,并且有些特征数据是完整的(如 pclass、name、survived、sex ),有些则是缺失的(如 age 等)。

(2)特征选择

# 机器学习有一个不太被初学者重视,并且耗时,但是十分重要的一环,特征的选择,
# 这个需要基于一些背景知识。
# 根据我们对这场事故的了解,sex, age, pclass 这些都很有可能是决定幸免与否的关键因素
X = titanic[['pclass', 'age', 'sex']]y = titanic['survived']# 对当前选择的特征进行探查
X.info()

(3)数据清洗

借由上面的输出,我们设计如下几个数据处理的任务:

① age 这个数据列,只有 633个,需要补完。

② sex 与 pclass 两个数据列的值都是类别型的,需要转化为数值特征,用 0/1 代替。

# 首先我们补充 age 里的数据,使用平均数或者中位数都是对模型偏离造成最小影响的策略
X['age'].fillna(X['age'].mean(), inplace=True)# 对补完的数据重新探查
X.info()


由此可见,age 特征缺失值填补完成。

(4)划分训练集测试集

# 从 sklearn.cross_validation 里选择导入 train_test_split 用于数据分割
from sklearn.model_selection import train_test_split# 从使用 train_test_split ,利用随机种子 random_state 采样 25% 的数据作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state = 33)

(5)利用分类决策树算法建立模型

因为部分数据特征还没有数字化的度量,因此在使用决策树进行分类之前要将他们转化为特征向量,代码如下:

# 使用 scikit-learn.feature_extraction 中的特征转换器
from sklearn.feature_extraction import DictVectorizervec = DictVectorizer(sparse=False)# 转换特征后,我们发现凡是类别型的特征都单独剥离出来,独成一列特征,数值型的则保持不变
X_train = vec.fit_transform(X_train.to_dict(orient='record'))print(vec.feature_names_)# 同样需要对测试数据的特征进行转换
X_test = vec.transform(X_test.to_dict(orient='record'))

转换后的数据如下所示:

接下来即可运用决策树分类器建立模型:

# 从 sklearn.tree 中导入决策树分类器
from sklearn.tree import DecisionTreeClassifier# 使用默认配置初始化决策树分类器
dtc = DecisionTreeClassifier()# 使用分割到的训练数据进行模型学习
dtc.fit(X_train, y_train)# 用训练好的决策树模型对测试特征数据进行预测
y_predict = dtc.predict(X_test)

(6)性能评估

# 从sklearn.metrics 导入 classification_report
from sklearn.metrics import classification_report# 输出预测准确性
print(dtc.score(X_test, y_test))# 输出更加详细的分类性能
print(classification_report(y_predict, y_test, target_names = ['died', 'survived']))


由上面的结果可知,决策树模型总体在测试集上预测的准确性为 78.1155015198% 。详细的性能指标进一步说明该模型在预测遇难者方面性能较好,但在预测生还者上,精确率较差,需要改进。

相比其他模型,决策树在模型描述上优势较大,其推断逻辑非常直观,具有清晰的可解释性,也方便了模型的可视化。因此在使用决策树模型时无需考虑对数据的量化和标准化,但决策树模型任属于参数模型,需要花费较多时间来训练数据。

注意:对于分类型的变量要将其进行转化,使每一类型均可选择,如:‘sex’ 变量变为 ‘sex=female’ 和 ‘sex=male’ ,‘pclass’ 变量变为 ‘pclass=1st’ , ‘pclass=2nd’ 和 ‘pclass=3rd’ 。数值型变量(如 ‘age’ )无需做此转化,决策树如下图:

参考文献:

[1] 范淼,李超.Python 机器学习及实践[M].清华大学出版社, 北京, 2016.

[2] 使用决策树实现分类

[3]经典分类算法——决策树算法(ID3)

[4]分类算法-----决策树

[5]决策树分类算法

[6]算法杂货铺-----分类算法之决策树

[7]决策树学习的笔记

[8]百度百科决策树

[9]决策树算法

[10]Kaggle 竞赛平台的解答

python机器学习——决策树(分类)及“泰坦尼克号沉船事故”数据集案例操作相关推荐

  1. 数据分享|PYTHON用决策树分类预测糖尿病和可视化实例

    全文下载链接:http://tecdat.cn/?p=23848 在本文中,决策树是对例子进行分类的一种简单表示.它是一种有监督的机器学习技术,数据根据某个参数被连续分割.决策树分析可以帮助解决分类和 ...

  2. python决策树怎么选择_机器学习|决策树分类与python实现

    目录: 1.决策树简介 2.决策树生成 a) 选择标准--熵 b) 信息增益--ID3算法 c) 信息增益率--C4.5算法 d) Gini系数--CART算法 e) 评价标准--评价函数 3.剪枝操 ...

  3. 机器学习-决策树分类算法与应用

    1. 决策树分类算法原理 1.1 概述 决策树(decision tree)--是一种被广泛使用的分类算法. 相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置 在实际应用中,对于探 ...

  4. python实现决策树分类模型(小白入门超简单实战)

    注:由于我不喜欢研究机器学习的原理而更关注于实战,所以本文只讲解python实现决策树模型的代码. 数据集:Iris(鸢尾花卉数据集),是一类多重变量分析的数据集.数据集包含150个数据样本,分为3类 ...

  5. 1,514人罹难,泰坦尼克号沉船事故背后的数据统计如何?

    泰坦尼克号是一艘英国皇家邮轮,在其服役时间是全世界最大的海上船舶,号称"永不沉没"."梦幻之船".其头等舱在设计上追求舒适和奢华的最高水准,设有健身房.游泳池. ...

  6. python实现决策树分类 mnist数据集

    文章目录 1.原理介绍 2.实验过程 2.1导入库 2.2加载数据集 2.3可视化目标分布情况 2.4对训练变量和目标变量的数据进行分解 2.5划分训练集和验证集 2.6训练模型和结果 2.7进行测试 ...

  7. python根据品种散点图鸢尾花_[Python机器学习]鸢尾花分类 机器学习应用

    1.问题简述 假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣.她收集了每朵鸢尾花的一些测量数据: 花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果的单位都是厘米. 她还有一些鸢尾花的测量数据, ...

  8. Python机器学习-多元分类的5种模型

    最近上了些机器学习的课程,于是想透过Kaggle资料集来练习整个资料科学专案的流程,在模型训练阶段,虽然听过许多分类模型,但不是很了解其各别的优缺点与适合的使用时机,所以想来整理一篇文章,统整上课学习 ...

  9. 【机器学习算法】手动Python实现KNN分类算法,并用iris数据集检验模型效果

    目录 一.KNN算法Python实现 1.导入包 2. 画图,展示不同电影在图上的分布 3.训练样本和待测样本准备 4.计算待测样本点到每个训练样本点的距离 5.查找离待测样本点最近的K个训练样本点的 ...

最新文章

  1. Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析
  2. swift 中拨电话的实现
  3. Pandas数据排序,人人都能学会的几种方法
  4. (11) nginx + keepalived 双机热备
  5. 【GIS风暴】GeoJSON数据格式案例全解
  6. leetcode530. 二叉搜索树的最小绝对差
  7. php遍历子分类的函数,emlog程序获取主分类下的所有子分类ID函数
  8. SpringBoot异常处理以及对数据正确性的检查
  9. 关于SQL语句中分号的问题
  10. linux下ftp权限控制
  11. java hibernate 包_hibernatejar包官方下载-Hibernate.jar包下载 --pc6下载站
  12. 我读《非暴力沟通》- 马歇尔 *卢森堡 - 区分观察和评论
  13. word排版快捷指令_Word怎么快速排版?这12招Word排版小技巧,3分钟完成一个Word文档...
  14. Yann Martell《少年 pi 的奇幻漂流》
  15. 计算机未来职业规划英语作文,我未来的计划英语作文(通用10篇)
  16. Linux 中实用但很小众的 11 个炫酷终端命令
  17. hadoop成功启动后,重新formatamp;nbs…
  18. 旧版微信内置浏览器x5核心无法打开,安装内核提示“内核下载失败115→115”,有相同情况吗
  19. python中loc和iloc
  20. 计蒜客--天上的星星

热门文章

  1. 交通标志牌的检测与识别
  2. 为什么软件测试人员都不通过QQ、微信、邮件上报Bug?
  3. python mkl 锐龙 cpu_Matlab 升级适配 AMD 锐龙,满血性能轻松提升 60%
  4. 软件测试项目实战案例分解,跟着我一步一步操作【人力资源管理系统】
  5. Redis数据库常用命令(超级详细)
  6. 自己 总结 一些 学习上 鼓励自己的 话~共勉哟
  7. 三角形的几何公式大全_2020高中数学必备公式大全
  8. 教你在 Ubuntu 安装 uTorrent
  9. 只要7步,就能将任何魔方6面还原(留着以后教孩子玩)
  10. 解决tar: Error is not recoverable: exiting now