决策树详解&&python基于Kaggle的Titanic数据实现决策树分类
决策树详解&&python基于Kaggle的Titanic数据实现决策树分类
前段时间忙了好多东西,快放暑假了,有几门课程要结课交大作业,然后又准备了一下实习的面试,还有一个目标检测的比赛项目要做,初定的是用Mask-RCNN模型来做,在gpu上跑真的各种坑,给定的coco数据格式怎么都规范不了,如果后期不换模型我就再写一篇博客排排坑,不过概率可能也不是太大。今天来再看一遍机器学习最基础的决策树算法,然后做一个用决策树去分析泰坦尼克号成员生还概率的小实验,这就是今天博客的全部内容了。程序员的生命的意义在于控制输入和输出的相对平衡~
一 决策树算法详解
1.前期准备
决策树是属于机器学习监督学习分类算法中比较简单的一种,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。 是通过一系列规则对数据进行分类的过程。
决策树是一种基本的分类与回归方法。决策树模型呈树形结构,在分类问题中,表示基于特征对样本进行分类的过程。目前常用的决策树算法有ID3算法、改进的C4.5算法和CART算法,本章将会介绍决策树之ID3算法。
实验目的准备
- 学习了解决策树概念、特点
- 学习掌握ID3算法原理、特点、与决策树的流程
- 学习掌握信息熵、条件熵、信息增益的定义、计算公式
- python实现ID3算法的详解,以及基于Kaggle的Titanic数据实现决策树分类
实验准备
服务器端:python3.6以上、Jupyter Notebook 客户端:Google Chrome浏览器
2.决策树概述
2.1 决策树
决策树与树结构类似,具有树形结构。每个内部节点表示一个属性的测试,每个分支代表一个测试输出,每个叶子节点代表一种类别。如上图一样。 分类树(决策树)常用于机器学习的分类,是一种监督学习方法。由树的分支对该类型的对象依靠属性进行分类。每个决策树可以依靠对源数据库分割进行数据测试,递归修剪树。知道一个单独的类被应用于某一分支,不能进行分割,递归完成。
特点:
- 多层次的决策树形式易于理解。
- 只适用于标称行数据,连续性数据处理的不好。
2.2 ID3算法原理
在信息论中,期望信息越小,那么信息增益就越大,从而纯度就越高。ID3算法的核心是信息墒,在决策树各级节点上选择属性时,用信息增益作为属性的选择标准,使得在每一个非节点进行测试时,能获得关于被测试记录最大的类别信息。认为增益高的是好属性,易于分类。每次划分选取信息增益最高的属性作为划分标准,进行重复,直至生成一个能完美分类训练样历的决策树。
具体方法是:从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。ID3相当于用极大似然法进行概率模型的选择。
简单理解:
如上图,
前两个是属性,可以记为[‘no surfacing’,‘flippers’]。则可以简单的构建决策树如下:
根据两个属性可以判断是否属于鱼类。
2.3 ID3的特点
优点:理论清晰,方法简单,学习能力较强
缺点
- 信息增益的计算比较依赖于特征数目比较多的特征
- ID3为非递增算法
- ID3为单变量决策树
- 抗糙性差
2.4信息熵
在概率论中,信息熵给了我们一种度量不确定性的方式,是用来衡量随机变量不确定性的,熵就是信息的期望值。若待分类的事物可能划分在N类中,分别是 ????1,????2,……,????????,每一种取到的概率分别是????1,????2,……,????????,那么数据集D的熵就定义为:
????(????)=−∑????=1|????|????????????????????????????
从定义中可知:0≤????(????)≤????????????(????)
当随机变量只取两个值是,即D的分布为????=(????=1)=????,????(????=0)=1−????,0≤????≤1,则熵为:
????(????)=−????????????????2????−(1−????)????????????2(1−????)
熵值越高,随机变量的不确定性越大,则数据混合的种类越高,其蕴含的含义是一个变量可能的变化越多(反而跟变量具体的取值没有任何关系,只和值的种类多少以及发生概率有关),它携带的信息量就越大。
条件熵(局部,现象发生的前提下的熵)
假设有随机变量(????,????),其联合概率分布为:
????(????=????????,????=????????)=????????????,????=1,2,…,????,????=1,2,…????
则条件熵????(????|????)表示在已知随机变量X的条件下随机变量Y的不确定性,其定义为X在给定条件下Y的条件概率分布的熵对X的数学期望:
????(????|????)=∑????=1????????????????(????|????=????????)
当信息熵和条件熵中的概率由数据估计得到时(如极大似然估计),所对应的信息熵熵与条件熵分别称为经验熵和经验条件熵。若概率为0,令0log0=0
信息增益
定义:信息增益(information gain)表示得知特征X的信息后,而使得Y的不确定性减少的程度。定义为:
????????????????(????,????)=????(????)−????(????|????)
即集合D的经验熵????(????)与特征A给定条件下D的经验条件熵????(????|????)之差。
理解:选择划分后信息增益大的作为划分特征,说明使用该特征后划分得到的子集纯度越高,即不确定性越小。因此我们总是选择当前使得信息增益最大的特征来划分数据集。
缺点:信息增益偏向取值较多的特征(原因:当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分后的熵更低,即不确定性更低,因此信息增益更大)。
信息增益准则的特征选择方法
对数据集D,计算每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。
2.5 ID3算法和决策树的流程
- 数据准备:需要对数值型数据进行离散化
- ID3算法构建决策树:
- 如果数据类别完全相同,则停止划分。
- 否则,继续划分:
- 计算信息墒和信息增益来选择最好的数据集划分方法
- 划分数据集
- 创建分支节点
- 对每个分支进行判定类别相同。相同停止划分,不同则按照上述方法进行划分。
二 基于Kaggle的Titanic数据实现决策树分类
数据源:泰坦尼克号旅客信息(训练数据:特征信息和是否存活;测试数据:特征信息),数据集介绍可以参照实验5。
直接使用python中自带的sklearn 中自带的决策树分类器 DecisionTreeClassifier
clf = DecisionTreeClassifier(criterion=‘entropy’)
sklearn 中只实现了 ID3 与 CART 决策树,在构造 DecisionTreeClassifier 类时,其中有一个参数是 criterion,意为标准。
它决定了构造的分类树是采用 ID3 分类树,还是 CART 分类树,对应的取值分别是 entropy 或者 gini
entropy: 基于信息熵,也就是 ID3 算法,实际结果与 C4.5 相差不大;
gini:默认参数,基于基尼系数。criterion=gini 时,实际上执行的是 CART 。
在构造决策树分类器后,我们可以使用 fit 方法让分类器进行拟合,使用 predict 方法对新数据进行预测,得到预测的分类结果,也可以使用 score 方法得到分类器的准确率。
fit(feactures,labels) 通过特征矩阵,分类标识,让分类器进行拟合
predict(feactures) 返回预测结果
score(feactures,labels) 返回准确率
1.数据探索
-
使用 info() 了解数据表的基本情况:行数、列数、每列的数据类型、数据完整度
-
使用 describe() 了解数据表的统计情况:总数、平均值、标准差、最小值、最大值等
import pandas as pd
# 数据加载,直接从互联网读入数据
titanic=pd.read_csv('./dataset/titanic.txt')
# 使用 info() 了解数据表的基本情况:行数、列数、每列的数据类型、数据完整度
# 使用 describe() 了解数据表的统计情况:总数、平均值、标准差、最小值、最大值等
titanic.info()
titanic.describe()
2.特征选择
特征选择也就是选择会影响分类结果的因素有哪些?乘客编号passengerid和乘客姓名name这种无规律无意义的数据不用选择,船舱cabin数据缺失较严重不选择,根据我们对这场事故的了解,sex, age, pclass这些都很有可能是决定幸免与否的关键因素。
# 特征选择
X=titanic[['pclass','age','sex']]
y=titanic['survived']
#对当前选择的特征进行探查
X.info()
我们发现 age这个字段的数据有缺失,age 为年龄字段,是数值型,补充age里的数据,使用平均数或者中位数都是对模型偏离造成最小影响的策略。
X['age'].fillna(X['age'].mean(),inplace=True)
# 对补完的数据重新探查。
X.info()
3.数据分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state = 33)
4.特征转换
特征值中很多为字符串,这样分析起来不方便,所以我们将字符串转换为数字。eg:sex列中为male,female转换为单独的列,并用0或1来表示是否存在.
我们使用 sklearn 特征选择中的 DictVectorizer 类,用它将可以处理符号化的对象,将符号转成数字 0/1 进行表示
转换特征后,我们发现凡是类别型的特征都单独剥离出来,独成一列特征,数值型的则保持不变。
Sex 列变成了“Sex=female”“Sex=male”两列。
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
X_train = vec.fit_transform(X_train.to_dict(orient='records'))#to_dict:内部转化为字典,外层封装成列表
print (vec.feature_names_)
# 同样需要对测试数据的特征进行转换。
X_test=vec.transform(X_test.to_dict(orient='record'))
5.决策树模型训练数据学习并且运用
现在我们使用ID3算法,所以设置 criterion=‘entropy’,使用 fit 进行训练,将特征值矩阵和分类标识结果作为参数传入。
from sklearn.tree import DecisionTreeClassifier # 从sklearn.tree中导入决策树分类器
dtc = DecisionTreeClassifier()
dtc.fit(X_train,y_train) # 使用分割到的训练数据进行模型学习
y_predict = dtc.predict(X_test) # 用训练好的决策树模型对测试特征数据进行预测。
print(y_predict)
6性能评估,决策树模型对泰坦尼克号乘客是否生还的预测性能
from sklearn.metrics import classification_report
print(dtc.score(X_test,y_test))
print(classification_report(y_test,y_predict,target_names=['died','survived']))
相对于其他学习模型 ,决策树在模型描述上有着巨大的优势,决策树逻辑推理非常直观,可解释性,方便模型的可视化,所以无需进行量化甚至标准化的,决策树与K近邻模型不一样,仍然需要参数,需要花费更多的时间训练数据。
小结&&每日一句
后面还会更新更多基础的机器学习模型~
每日一句
如果问我思念多重,不重的,像一座秋山的落叶。
——简嫃《私房书》
上一篇: Python数据挖掘——决策树