1 概述
1.1 决策树是如何工作的
1.2 构建决策树
1.2.1 ID3算法构建决策树
1.2.2 简单实例
1.2.3 ID3的局限性
1.3 C4.5算法 & CART算法
1.3.1 修改局部最优化条件
1.3.2 连续变量处理手段
1.4 sklearn中的决策树
2 DecisionTreeClassifier与红酒数据集
2.1 重要参数
2.1.1 criterion
2.1.2 random_state & splitter
2.1.3 剪枝参数
2.1.4 目标权重参数
2.2 重要属性和接口
3 DecisionTreeRegressor
3.1 重要参数,属性及接口
criterion
3.2 实例:一维回归的图像绘制
4 实例:泰坦尼克号幸存者的预测
5 决策树的优缺点
6 附录
6.1 分类树参数列表
6.2 分类树属性列表
6.3 分类树接口列表
Bonus Chapter I 实例:分类树在合成数集上的表现
1 概述
1.1 决策树是如何工作的
决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。
我们来简单了解一下决策树是如何工作的。决策树算法的本质是一种图结构,我们只需要问一系列问题就可以对数据进行分类了。比如说,来看看下面这组数据集,这是一系列已知物种以及所属类别的数据:
我们现在的目标是,将动物们分为哺乳类和非哺乳类。那根据已经收集到的数据,决策树算法为我们算出了下面的这棵决策树:
假如我们现在发现了一种新物种Python,它是冷血动物,体表带鳞片,并且不是胎生,我们就可以通过这棵决策树来判断它的所属类别。
可以看出,在这个决策过程中,我们一直在对记录的特征进行提问。最初的问题所在的地方叫做根节点,在得到结论前的每一个问题都是中间节点,而得到的每一个结论(动物的类别)都叫做叶子节点。
关键概念:节点
根节点:没有进边,有出边。包含最初的,针对特征的提问。
中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。
叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签。
*子节点和父节点:在两个相连的节点中,更接近根节点的是父节点,另一个是子节点。
决策树算法的核心是要解决两个问题:
1)如何从数据表中找出最佳节点和最佳分枝?
2)如何让决策树停止生长,防止过拟合?
几乎所有决策树有关的模型调整方法,都围绕这两个问题展开。接下来,我们就来了解一下决策树背后的原理。
1.2构建决策树
接下来讨论如何根据已有的数据集来建立有效的决策树。原则上讲,任意一个数据集上的所有特征都可以被拿来分枝,特征上的任意节点又可以自由组合,所以一个数据集上可以发展出非常非常多棵决策树,其数量可达指数级。在这些树中,总有那么一棵树比其他的树分类效力都好,那样的树叫做”全局最优树"。
关键概念:全局最优,局部最优
全局最优:经过组合形成的,整体来说分类效果最好的模型;
局部最优:每一次分枝的时候都向着更好的分类效果分枝,但无法确认如此生成的树在全局上是否是最优的。
要在这么多棵决策树中去一次性找到分类效果最佳的那一棵是不可能的,如果通过排列组合来进行筛选,计算量过于大而且低效,因此我们不会这样做。相对的,机器学习研究者们开发了一些有效的算法,能够在合理的时间内构造出具有一定准确率的次最优决策树。这些算法基本都执行”贪心策略",即通过局部的最优来达到我们相信是最接近全局最优的结果。
关键概念:贪心算法
通过实现局部最优来达到接近全局最优结果的算法,所有的树模型都是这样的算法。
最典型的决策树算法是Hunt算法,该算法是由Hunt等人提出的最早的决策树算法。现代,Hunt算法是许多决策树算法的基础,包括ID3、C4.5和CART等。Hunt算法诞生时间较早,且基础理论并非特别完善,此处以应用较广、理论基础较为完善的ID3算法的基本原理开始,讨论如何利用局部最优化方法来创建决策模型。
1.2.1 ID3算法构建决策树
ID3算法原型见于J.R Quinlan的博士论文,是基础理论较为完善,使用较为广泛的决策树模型,在此基础上J.RQuinlan进行优化后,陆续推出了C4.5和C5.0决策树算法,后二者现已称为当前最流行的决策树算法,我们先从ID3开始讲起,再讨论如何从ID3逐渐优化至C4.5。
为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,而衡量这个“最佳”的指标叫做“不纯度”。不纯度基于叶子节点来计算的,所以树中的每个节点都会有一个不纯度,并且子节点的不纯度一定是低于父节点的,也就是说,在同一棵决策树上,叶子节点的不纯度一定是最低的。
重要概念:不纯度
决策树的每个叶子节点中都会包含一组数据,在这组数据中,如果有某一类标签占有较大的比例,我们就说叶子节点“纯”,分枝分得好。某一类标签占的比例越大,叶子就越纯,不纯度就越低,分枝就越好。 如果没有哪一类标签的比例很大,各类标签都相对平均,则说叶子节点”不纯“,分枝不好,不纯度高。
这个其实非常容易理解。分类型决策树在叶子节点上的决策规则是少数服从多数,在一个叶子节点上,如果某一类标签所占的比例较大,那所有进入这个叶子节点的样本都回被认为是这一类别。具体来说,如果90%根据规则进入叶子节点的样本都是类别0(叶子比较纯),那新进入叶子节点的测试样本的类别也很有可能是0。但是,如果51%的样本是0,49%的样本是1(极端情况),叶子节点还是会被认为是0类叶子节点,但此时此刻进入这个叶子的测试样本点几乎有一半的可能性应该是类别1。从数学上来说,类分布为(0,100%)的结点具有零不纯性,而均衡分布(50%,50%)的结点具有最高的不纯性。如果叶子本身不纯,那测试样本就很有可能被判断错误,相对的叶子越纯,那样本被判断错误的可能性就越小。
通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上。若我们定义 t代表决策树的某节点,Dt是 t节点所对应的数据集,设p(i|t) 表示给定结点 t中属于类别 i 的样本所占的比例,这个比例越高,则代表叶子越纯。
【练习】从下面的图来看,哪个不纯度最高?哪个不纯度最低?
怎样计算不纯度?
对于节点不纯度的计算和表示方法因决策树模型而异,但不管不纯度的度量方法如何,都是由误差率衍生而来,其计算公式如下:
误差率越低,则纯度越高。由此还衍生出了其他两个常用指标,一个是ID3中Information gain(信息增益)的计算方法可用Entropy推导,即最为人熟知的信息熵,又叫做香农熵,其计算公式如下:
其中c表示叶子节点上标签类别的个数,c-1表示标签的索引。注意在这里,是从第0类标签开始计算,所以最后的标签类别应该是总共c个标签,c-1为最后一个标签的索引。在计算Entropy时设定log20 = 0。
另一个指标则是Gini(基尼)指数,主要用于CART决策树的纯度判定中,其计算公式如下:
假设在二分类问题中各节点呈现如下分布,则可进一步计算上述三指数的结果
能够看出,三种方法本质上都相同,在类分布均衡时(即当p=0.5时)达到最大值,而当所有记录都属于同一个类时(p等于1或0)达到最小值。换而言之,在纯度较高时三个指数均较低,而当纯度较低时,三个指数都比较大,且可以计算得出,嫡在0-1区间内分布,而Gini指数和分类误差均在0-0.5区间内分布,三个指数随某变量占比增加而变化的曲线如下所示:
决策树最终的优化目标是使得叶节点的总不纯度最低,即对应衡量不纯度的指标最低。
ID3采用信息熵来衡量不纯度,此处就先以信息嫡为例进行讨论。ID3最优条件是叶节点的总信息熵最小,因此ID3决策树在决定是否对某节点进行切分的时候,会尽可能选取使得该节点对应的子节点信息熵最小的特征进行切分。换而言之,就是要求父节点信息熵和子节点总信息熵之差要最大。对于ID3而言,二者之差就是信息增益,即Information gain。
但这里需要注意,一个父节点下可能有多个子节点,而每个子节点又有自己的信息熵,所以父节点信息熵和子节点信息熵之差,应该是父节点的信息熵-所有子节点信息熵的加权平均。其中,权重是使用单个叶子节点上所占的样本量比上父节点上的总样本量来确定的一个权重。
而父节点和子节点的不纯度下降数可由下述公式进行计算:
I(.)是给定结点的不纯性度量(即是基尼系数或者信息上),N是父结点上的样本数,k是这一层上子节点的个数,NVj)是与子结点相关联的样本个数。决策树算法通常选择最大化增益△的测试条件,因为对任何分枝过程来说,
(parent)都是一个不变的值(因为此时父节点已经存在并且不可修改),所以最大化增益等价于最小化子结点的不纯性衡量的加权平均。最后,当选择熵(entropy)作为公式的不纯性度量时,烯的差就是所谓信息增益(Information gain)△info。
接下来对此进行举例说明。
1.2.2 简单实例
假设现在有如下数据集,是一个消费者个人属性和信用评分数据,标签是“是否会发生购买电脑行为",仍然是个而分类问题,在此数据集之上我们使用ID3构建决策树模型,并提取有效的分类规则。
1.2.3 ID3的局限性
1.3 C4.5算法&CART算法
1.3.1 修改局部最优化条件
1.3.2 连续变量处理手段
1.4 sklearn中的决策树
模块sklearn.tree
sklearn中决策树的类都在”tree“这个模块之下。这个模块总共包含五个类:
我们会主要讲解分类树和回归树,并用图像呈现给大家。
sklearn的基本建模流程
在那之前,我们先来了解一下sklearn建模的基本流程。
在这个流程下,分类树对应的代码是:
from sklearn import tree #导入需要的模块
clf = tree.DecisionTreeClassifier() #实例化
clf = clf.fit(X_train,y_train) #用训练集数据训练模型
result = clf.score(X_test,y_test) #导入测试集,从接口中调用需要的信息
2 DecisionTreeClassifier与红酒数据集
class sklearn.tree.DecisionTreeClassifier (criterion=’gini’, splitter=’best’,
max_depth=None,min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_features=None,random_state=None,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None,class_weight=None, presort=False)
2.1 重要参数
2.1.1 criterion
为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个“最佳”的指标叫做“不纯度”。通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上。
不纯度基于节点来计算,树中的每个节点都会有一个不纯度,并且子节点的不纯度一定是低于父节点的,也就是说,在同一棵决策树上,叶子节点的不纯度一定是最低的。
Criterion这个参数正是用来决定不纯度的计算方法的。sklearn提供了两种选择:
输入”entropy“,使用信息熵(Entropy)
输入”gini“,使用基尼系数(Gini Impurity)
其中 t 代表给定的节点, i 代表标签的任意分类, p(i|t) 代表标签分类 i 在节点 t 上所占的比例。注意,当使用信息熵时,sklearn实际计算的是基于信息熵的信息增益(Information Gain),即父节点的信息熵和子节点的信息熵之差。
比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据