决策树
决策树是一种基本的分类和回归方法;决策树的学习通常包括3个步聚:特征选择、决策树的生成和决策树的修剪。

1、数据处理
1.1、连续值处理
我们知道,决策树是通过离散属性来生成的,但实际任务中常会遇到连续属性,因为有必要处理连续值。
下面是西瓜的数据集:
编号 | 色泽 | 触感 | 密度 | 好瓜 |
---|---|---|---|---|
1 | - | 硬滑 | 0.697 | 是 |
2 | 乌黑 | 硬滑 | 0.774 | 是 |
3 | 乌黑 | 硬滑 | 0.634 | 是 |
4 | 青绿 | 软粘 | 0.608 | 是 |
5 | - | 软粘 | 0.556 | 是 |
6 | 青绿 | 软粘 | 0.403 | 是 |
7 | 乌黑 | 硬滑 | 0.481 | 是 |
8 | 乌黑 | 软粘 | 0.437 | 是 |
9 | 乌黑 | 硬滑 | 0.666 | 否 |
10 | 青绿 | 硬滑 | 0.243 | 否 |
11 | 浅白 | 硬滑 | 0.245 | 否 |
12 | 浅白 | 硬滑 | 0.343 | 否 |
13 | - | 硬滑 | 0.639 | 否 |
14 | 浅白 | 硬滑 | 0.657 | 否 |
15 | 乌黑 | 硬滑 | 0.360 | 否 |
16 | 浅白 | 软粘 | 0.593 | 否 |
17 | 青绿 | 硬滑 | 0.719 | 否 |
对于密度来说是一个连续值,那如何寻找密度的划分点?如何计算密度的信息增益?
第一步:排序,按照样本数据的密度大小进行排序(共17个数据):
{0.243, 0.245, 0.343, 0.360, 0.403, 0.437, 0.481, 0.556, 0.593, 0.608, 0.634, 0.639, 0.657, 0.666, 0.697,0.719, 0.774}
第二步:根据公式计算划分点集合(共16个数据):
Ta=ai+ai+12;1≤i<nTa=ai+ai+12;1≤i<nTa=Ta= {0.244, 0.294, 0.351, 0.381, 0.420, 0.459, 0.518, 0.574, 0.600, 0.621, 0.636, 0.648, 0.661, 0.681, 0.708, 0.746}
第三步:根据公式计算每个划分点的信息增益:
以0.381划分点为例,
计算信息熵:
数据集中共17个样本,其中有8个正例,9个反例:
Ent(D)=−817∗log2817−917∗log2917=0.998Ent(D)=−817∗log2817−917∗log2917=0.998
计算条件熵:
对于密度小于0.381的样本中,共有4个样本,其中有0个正例,4个反例:
Ent(D|a≤0.381)=−04∗log204−44∗log244=0Ent(D|a≤0.381)=−04∗log204−44∗log244=0
对于密度大于0.381的样本中,共13个样本,其中有8个正例,5个反例:
Ent(D|a>0.381)=−−813∗log2813−513∗log2513=0.961Ent(D|a>0.381)=−−813∗log2813−513∗log2513=0.961
样本中,密度小于0.381的样本数共4个,大于0.381的样本数共13个:
Ent(D|A,Ta=0.381)=417∗Ent(D|a≤0.381)+1317∗Ent(D|a>0.381)=0.735Ent(D|A,Ta=0.381)=417∗Ent(D|a≤0.381)+1317∗Ent(D|a>0.381)=0.735
计算信息增益:
Gain(D|A,0.381)=Ent(D)−Ent(D|A,Ta=0.381)=0.263Gain(D|A,0.381)=Ent(D)−Ent(D|A,Ta=0.381)=0.263
第四步:选择信息增益最大的划分点作为密度的划分点:
Gain(D,A)=maxt∈TaGain(D,A,t)Gain(D,A)=maxt∈TaGain(D,A,t)
刚好0.381划分点信息增益最大,所以选择0.381为密度的划分点.
1.2、缺失值处理
现实任务中常会遇到不完整样本,即样本的某些属性值缺失,如果简单地放弃不完整样本,仅使用无缺失值的样本来进行学习,显然对数据信息的极大的浪费。
公式:
Gain(D,A)=p∗Gain(D′,A);p为无缺失值的样本占总样本的比例Gain(D,A)=p∗Gain(D′,A);p为无缺失值的样本占总样本的比例
例如色泽属性,1、3、5存在缺失值,假设每个样本的权重是一样的,D′D′为无缺失值的样本,那么:
Gain(D,A)=1417∗Gain(D′,A)Gain(D,A)=1417∗Gain(D′,A)
2、划分选择
在构造决策树时,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,因此我们需要选择划分的特征。
2.1、ID3算法
信息熵:是度量样本集合纯度最常用的一种指标,信息熵越小,纯度越高;
假设当前样本集合D分n类,其中第k类样本所占的比例为pkpk,则D的信息熵为:
Ent(D)=−∑k=1npk∗log2pkEnt(D)=−∑k=1npk∗log2pk
条件熵:
假设当前样本集合D中,特征A有m个类别,其中第k个类的样本集合为DiDi,样本所点的比例为pkpk,则集合D中特征A的条件熵为:
Ent(D|A)=∑i=1m(pk∗Ent(Di))Ent(D|A)=∑i=1m(pk∗Ent(Di))
信息增益:特征A对训练数据集D的信息增益Gain(D,A),定义为集合D的经验熵与特征A给定条件下D的经验条件熵之差;选择信息增益最高的特征作为划分特征。
Gain(D,A)=Ent(D)−Ent(D,A)Gain(D,A)=Ent(D)−Ent(D,A)
2.2、C4.5算法
增益率
有这样一个情况,假设样本集共有n个数据,而特征A也有n个类别,那特征A的信息增益达到了最大,但这样构造的决策树却不具有泛化能力,无法对新样本进行有效的预测,因此在C4.5算法中,使用增益率来选择划分的特征。一般地,特征取值越多,IV(A)就越大。
Gain_ratio(D,A)=Gain(D,A)IV(A)Gain_ratio(D,A)=Gain(D,A)IV(A)
其中,IV(A)=−∑v=IVpv∗log2pv其中,IV(A)=−∑v=IVpv∗log2pv
例如触感属性,可取值“硬滑”和“软粘”两个,样本中“硬滑”占比12171217,“软粘”占比517517:
IV(触感)=−1217∗log21217−517∗log2517=0.874IV(触感)=−1217∗log21217−517∗log2517=0.874
2.3、CART算法
ID3和C4.5算法只都是生成分类树,而CART算法即可生成分类树,也可以生成回归树,CART算法生成的树都是二叉树。
2.3.1、回归树(最小二乘回归树)
当数据的输出变量是连续值时,我们需要构造回归树。下面以例子的型式讲解如何生成回归树。如下例子,{触感,密度}是特征变量,{含糖率}是输出变量:
编号 | 触感 | 密度 | 含糖率 |
---|---|---|---|
1 | 硬滑 | 0.697 | 0.460 |
2 | 硬滑 | 0.774 | 0.376 |
3 | 硬滑 | 0.634 | 0.264 |
4 | 软粘 | 0.608 | 0.318 |
5 | 软粘 | 0.556 | 0.215 |
6 | 软粘 | 0.403 | 0.237 |
7 | 硬滑 | 0.481 | 0.149 |
8 | 软粘 | 0.437 | 0.211 |
9 | 硬滑 | 0.666 | 0.091 |
10 | 硬滑 | 0.243 | 0.267 |
11 | 硬滑 | 0.245 | 0.057 |
12 | 硬滑 | 0.343 | 0.099 |
13 | 硬滑 | 0.639 | 0.161 |
14 | 硬滑 | 0.657 | 0.198 |
15 | 硬滑 | 0.360 | 0.370 |
16 | 软粘 | 0.593 | 0.042 |
17 | 硬滑 | 0.719 | 0.103 |
例子中,“触感”特征是离散值,且输入空间只有两个值,“密度”特征是连接值,下面我将通过例子,找出第一个划分对(v,s)(v,s),v是特征,s是切分点;
触感
触感的输入空间为{硬滑,软粘},样本中对应该的输出集合:
硬滑:{0.460, 0.376, 0.264, 0.149, 0.091, 0.267, 0.057, 0.099, 0.161, 0.198, 0.370, 0.103}
软粘:{0.318, 0.215, 0.237, 0.211, 0.042}
通过公式计算切分点的c1c1、c2c2值:
c1=average∑i=1yi|xi∈R1c1=average∑i=1yi|xi∈R1
c2=average∑i=1yi|xi∈R2c2=average∑i=1yi|xi∈R2对于硬滑切分点,c1c1是非硬滑样本输出值的平均值;c2c2是硬滑样本输出值的平均值。
c1(硬滑)=15(0.318+0.215+0.237+0.211+0.042)=0.205c1(硬滑)=15(0.318+0.215+0.237+0.211+0.042)=0.205
c2(硬滑)=112(0.460+0.376+0.264+0.149+0.091+0.267+0.057+0.099+0.161+0.198+0.370+0.103)=0.216c2(硬滑)=112(0.460+0.376+0.264+0.149+0.091+0.267+0.057+0.099+0.161+0.198+0.370+0.103)=0.216
s | 硬滑 | 软粘 |
---|---|---|
c1c1 | 0.205 | 0.216 |
c2c2 | 0.216 | 0.205 |
计算损失函数
l=∑xi∈R1(yi−c1)2+∑xj∈R2(yj−c2)2l=∑xi∈R1(yi−c1)2+∑xj∈R2(yj−c2)2
s | 硬滑 | 软粘 |
---|---|---|
l | 0.229 | 0.229 |
最小损失函数的划分点,就是该特征的最优划分点;在这里,(触感,硬滑) = (触感,软粘),这是肯定的,回归树算法本来就是生成二叉树的,而触感的输入空间只有“硬滑”和“软粘”两个,所以它们的损失函数是相等的。
密度
根据“密度”特征的值,对样本进行排序,然后计算切分点集合:
Ta=ai+ai+12;1≤i<nTa=ai+ai+12;1≤i<n
候选切分点集合:T密度T密度 = {0.244, 0.294, 0.352, 0.382, 0.420, 0.459, 0.519, 0.575, 0.601, 0.621, 0.637, 0.648, 0.662, 0.682, 0.708, 0.747}
计算切分点的c1c1、c2c2值:
c1=average∑i=1yi|xi∈R1c1=average∑i=1yi|xi∈R1
c2=average∑i=1yi|xi∈R2c2=average∑i=1yi|xi∈R2
例如s = 0.352,R1R1 = {x|x<0.325},R2R2 = {x|x>0.325};
s | 0.244 | 0.294 | 0.352 | 0.382 | 0.420 | 0.459 | 0.519 | 0.575 | 0.601 | 0.621 | 0.637 | 0.648 | 0.662 | 0.682 | 0.708 | 0.747 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
c1c1 | 0.267 | 0.162 | 0.141 | 0.198 | 0.206 | 0.207 | 0.199 | 0.201 | 0.183 | 0.197 | 0.203 | 0.199 | 0.199 | 0.191 | 0.209 | 0.203 |
c2c2 | 0.209 | 0.220 | 0.228 | 0.217 | 0.216 | 0.216 | 0.223 | 0.224 | 0.246 | 0.236 | 0.232 | 0.246 | 0.258 | 0.313 | 0.240 | 0.376 |
计算损失函数:
l=∑xi∈R1(j,s)(yi−c1)2+∑xi∈R2(j,s)(yi−c2)2l=∑xi∈R1(j,s)(yi−c1)2+∑xi∈R2(j,s)(yi−c2)2
s 0.244 0.294 0.352 0.382 0.420 0.459 0.519 0.575 0.601 0.621 0.637 0.648 0.662 0.682 0.708 0.747 ll 0.227 0.224 0.211 0.229 0.230 0.230 0.228 0.228 0.213 0.223 0.227 0.222 0.219 0.193 0.228 0.202
显然,当s=0.682时,损失函数最小,所以密度的最优切分点为0.682。
选择最优切分对:
l(触感,∗)=0.229l(触感,∗)=0.229
显然,l(密度,0.682)<l(密度,0.682)<l_{(触感,*)} ,因此选择(密度,0.682)作为第一个划分对。2.3.2、分类树
CART分类决策树使用“基尼指数”来选择划分属性,“基尼指数”越小,则数据集的纯度越高。
假设数据集D分m类,第k类的样本比例为pkpk,则数据集D的基尼指数(跟ID3算法中的信息熵的作用一样):Gini(D)=∑k=1,k′≠kmpk∗pk′=1−∑k=1mp2kGini(D)=∑k=1,k′≠kmpk∗pk′=1−∑k=1mpk2特征A的基尼指数(跟ID3算法中的条件熵的作用一样):
Gini_index(D,a)=∑v=1v|Dv||D|Gini(Dv)Gini_index(D,a)=∑v=1v|Dv||D|Gini(Dv)选择基尼指数最小的属性作为划分属性即:
a∗=argmina∈AGini_index(D,a)a∗=argmina∈AGini_index(D,a)2.3.3、CART剪枝
3、剪枝
在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,很容易造成“过拟合”。而剪枝是决策树学习算法对付“过拟合”的主要手段,剪枝又分为预剪枝和后剪枝。
3.1、预剪枝
预剪枝是指在决策树生成过程中,对每个结点在划分前进行评估,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。下面介绍几种预剪枝方法:a、最大深度:
决策树的最大深度指树根和叶子之间的最大长度;
b、每片叶子的最小样本数:
在分裂节点时,很有可能一片叶子上有 99 个样本,而另一片叶子上只有 1 个样本;这将使我们陷入困境,并造成资源和时间的浪费;如果想避免这种问题,我们可以设置每片叶子允许的最小样本数;这个数字可以被指定为一个整数,也可以是一个浮点数;如果它是整数,它将表示这片叶子上的最小样本数;如果它是个浮点数,它将被视作每片叶子上的最小样本比例。
c、每次分裂的最小样本数:
这个参数与每片叶子上的最小样本树相同,只不过是应用在节点的分裂当中。
d、最大特征数:
有时,我们会遇到特征数量过于庞大,而无法建立决策树的情况。在这种状况下,对于每一个分裂,我们都需要检查整个数据集中的每一个特征。这种过程极为繁琐。而解决方案之一是限制每个分裂中查找的特征数。如果这个数字足够庞大,我们很有可能在查找的特征中找到良好特征(尽管也许并不是完美特征)。然而,如果这个数字小于特征数,这将极大加快我们的计算速度。
e、验证集精度:
在每个可以划分的结点,计算划分前和划分后在验证集上的精度,如果划分前的精度高于划分后的精度,那么停止该结点的划分,前将该结点标记为叶结点。
3.2、后剪枝
后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。a、损失函数
计算某个结点剪枝前后的损失函数,如果剪枝后的损失函数更小,则标记该结点为叶结点。
设叶结点的个数为|T|,t为叶结点,该叶结点有NtNt个样本点:
l(T)=∑t=1|T|NtEntt(D)+a|T|l(T)=∑t=1|T|NtEntt(D)+a|T|
Entt(D)Entt(D)是叶结点t的信息熵;
a≥0,较大的a促使选择较简单的树,较小的a促使选择较复杂的树;b、验证集精度:
计算某个结点剪枝前后的精度,计算剪枝前和剪枝后在验证集上的精度,如果剪枝后的精度高于剪枝前的精度,那么前将该结点标记为叶结点。
4、随机森林
随机森林也是决策树学习算法对付“过拟合”的手段之一,但这里不详细介绍,以后在集成方法中再介绍。
5、sklearn中的决策树
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(x_values, y_values)