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

一、决策树(分类)算法

决策树是一种树形结构,为人们提供决策依据,决策树可以用来回答 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 DictVectorizer

vec = 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 竞赛平台的解答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值