决策树
决策树是一种基本的分类和回归方法;决策树的学习通常包括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<n T a = a i + a i + 1 2 ; 1 ≤ i < nTa= T a = {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.998 E n t ( D ) = − 8 17 ∗ l o g 2 8 17 − 9 17 ∗ l o g 2 9 17 = 0.998
计算条件熵:
对于密度小于0.381的样本中,共有4个样本,其中有0个正例,4个反例:
Ent(D|a≤0.381)=−04∗log204−44∗log244=0 E n t ( D | a ≤ 0.381 ) = − 0 4 ∗ l o g 2 0 4 − 4 4 ∗ l o g 2 4 4 = 0
对于密度大于0.381的样本中,共13个样本,其中有8个正例,5个反例:
Ent(D|a>0.381)=−−813∗log2813−513∗log2513=0.961 E n t ( D | a > 0.381 ) = − − 8 13 ∗ l o g 2 8 13 − 5 13 ∗ l o g 2 5 13 = 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.735 E n t ( D | A , T a = 0.381 ) = 4 17 ∗ E n t ( D | a ≤ 0.381 ) + 13 17 ∗ E n t ( D | a > 0.381 ) = 0.735
计算信息增益:
Gain(D|A,0.381)=Ent(D)−Ent(D|A,Ta=0.381)=0.263 G a i n ( D | A , 0.381 ) = E n t ( D ) − E n t ( D | A , T a = 0.381 ) = 0.263
第四步:选择信息增益最大的划分点作为密度的划分点:
Gain(D,A)=maxt∈TaGain(D,A,t) G a i n ( D , A ) = m a x t ∈ T a G a i n ( D , A , t )
刚好0.381划分点信息增益最大,所以选择0.381为密度的划分点.
1.2、缺失值处理
现实任务中常会遇到不完整样本,即样本的某些属性值缺失,如果简单地放弃不完整样本,仅使用无缺失值的样本来进行学习,显然对数据信息的极大的浪费。
公式:
Gain(D,A)=p∗Gain(D′,A);p为无缺失值的样本占总样本的比例 G a i n ( D , A ) = p ∗ G a i n ( D ′ , A ) ; p 为 无 缺 失 值 的 样 本 占 总 样 本 的 比 例
例如色泽属性,1、3、5存在缺失值,假设每个样本的权重是一样的, D′ D ′ 为无缺失值的样本,那么:
Gain(D,A)=1417∗Gain(D′,A) G a i n ( D , A ) = 14 17 ∗ G a i n ( D ′ , A )
2、划分选择
在构造决策树时,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,因此我们需要选择划分的特征。
2.1、ID3算法
信息熵:是度量样本集合纯度最常用的一种指标,信息熵越小,纯度越高;
假设当前样本集合D分n类,其中第k类样本所占的比例为
pk
p
k
,则D的信息熵为:
Ent(D)=−∑k=1npk∗log2pk E n t ( D ) = − ∑ k = 1 n p k ∗ l o g 2 p k
条件熵:
假设当前样本集合D中,特征A有m个类别,其中第k个类的样本集合为
Di
D
i
,样本所点的比例为
pk
p
k
,则集合D中特征A的条件熵为:
Ent(D|A)=∑i=1m(pk∗Ent(Di)) E n t ( D | A ) = ∑ i = 1 m ( p k ∗ E n t ( D i ) )
信息增益:特征A对训练数据集D的信息增益Gain(D,A),定义为集合D的经验熵与特征A给定条件下D的经验条件熵之差;选择信息增益最高的特征作为划分特征。
Gain(D,A)=Ent(D)−Ent(D,A) G a i n ( D , A ) = E n t ( D ) − E n t ( D , A )
2.2、C4.5算法
增益率
有这样一个情况,假设样本集共有n个数据,而特征A也有n个类别,那特征A的信息增益达到了最大,但这样构造的决策树却不具有泛化能力,无法对新样本进行有效的预测,因此在C4.5算法中,使用增益率来选择划分的特征。一般地,特征取值越多,IV(A)就越大。
Gain_ratio(D,A)=Gain(D,A)IV(A) G a i n _ r a t i o ( D , A ) = G a i n ( D , A ) I V ( A )
其中,IV(A)=−∑v=IVpv∗log2pv 其 中 , I V ( A ) = − ∑ v = I V p v ∗ l o g 2 p v
例如触感属性,可取值“硬滑”和“软粘”两个,样本中“硬滑”占比 1217 12 17 ,“软粘”占比 517 5 17 :
IV(触感)=−1217∗log21217−517∗log2517=0.874 I V ( 触 感 ) = − 12 17 ∗ l o g 2 12 17 − 5 17 ∗ l o g 2 5 17 = 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}
通过公式计算切分点的 c1 c 1 、 c2 c 2 值:
c1=average∑i=1yi|xi∈R1 c 1 = a v e r a g e ∑ i = 1 y i | x i ∈ R 1
c2=average∑i=1yi|xi∈R2 c 2 = a v e r a g e ∑ i = 1 y i | x i ∈ R 2对于硬滑切分点, c1 c 1 是非硬滑样本输出值的平均值; c2 c 2 是硬滑样本输出值的平均值。
c1(硬滑)=15(0.318+0.215+0.237+0.211+0.042)=0.205 c 1 ( 硬 滑 ) = 1 5 ( 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.216 c 2 ( 硬 滑 ) = 1 12 ( 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 | 硬滑 | 软粘 |
---|---|---|
c1 c 1 | 0.205 | 0.216 |
c2 c 2 | 0.216 | 0.205 |
计算损失函数
l=∑xi∈R1(yi−c1)2+∑xj∈R2(yj−c2)2 l = ∑ x i ∈ R 1 ( y i − c 1 ) 2 + ∑ x j ∈ R 2 ( y j − c 2 ) 2
s | 硬滑 | 软粘 |
---|---|---|
l | 0.229 | 0.229 |
最小损失函数的划分点,就是该特征的最优划分点;在这里,(触感,硬滑) = (触感,软粘),这是肯定的,回归树算法本来就是生成二叉树的,而触感的输入空间只有“硬滑”和“软粘”两个,所以它们的损失函数是相等的。
密度
根据“密度”特征的值,对样本进行排序,然后计算切分点集合:
Ta=ai+ai+12;1≤i<n T a = a i + a i + 1 2 ; 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}
计算切分点的 c1 c 1 、 c2 c 2 值:
c1=average∑i=1yi|xi∈R1 c 1 = a v e r a g e ∑ i = 1 y i | x i ∈ R 1
c2=average∑i=1yi|xi∈R2 c 2 = a v e r a g e ∑ i = 1 y i | x i ∈ R 2
例如s = 0.352, R1 R 1 = {x|x<0.325}, R2 R 2 = {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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
c1 c 1 | 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 |
c2 c 2 | 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)2 l = ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 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 l l 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.229 l ( 触 感 , ∗ ) = 0.229
显然, l(密度,0.682)< l ( 密 度 , 0.682 ) < l_{(触感,*)} ,因此选择(密度,0.682)作为第一个划分对。2.3.2、分类树
CART分类决策树使用“基尼指数”来选择划分属性,“基尼指数”越小,则数据集的纯度越高。
假设数据集D分m类,第k类的样本比例为 pk p k ,则数据集D的基尼指数(跟ID3算法中的信息熵的作用一样):
Gini(D)=∑k=1,k′≠kmpk∗pk′=1−∑k=1mp2k G i n i ( D ) = ∑ k = 1 , k ′ ≠ k m p k ∗ p k ′ = 1 − ∑ k = 1 m p k 2特征A的基尼指数(跟ID3算法中的条件熵的作用一样):
Gini_index(D,a)=∑v=1v|Dv||D|Gini(Dv) G i n i _ i n d e x ( D , a ) = ∑ v = 1 v | D v | | D | G i n i ( D v )选择基尼指数最小的属性作为划分属性即:
a∗=argmina∈AGini_index(D,a) a ∗ = a r g m i n a ∈ A G i n i _ i n d e x ( D , a )2.3.3、CART剪枝
3、剪枝
在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,很容易造成“过拟合”。而剪枝是决策树学习算法对付“过拟合”的主要手段,剪枝又分为预剪枝和后剪枝。
3.1、预剪枝
预剪枝是指在决策树生成过程中,对每个结点在划分前进行评估,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。下面介绍几种预剪枝方法:a、最大深度:
决策树的最大深度指树根和叶子之间的最大长度;
b、每片叶子的最小样本数:
在分裂节点时,很有可能一片叶子上有 99 个样本,而另一片叶子上只有 1 个样本;这将使我们陷入困境,并造成资源和时间的浪费;如果想避免这种问题,我们可以设置每片叶子允许的最小样本数;这个数字可以被指定为一个整数,也可以是一个浮点数;如果它是整数,它将表示这片叶子上的最小样本数;如果它是个浮点数,它将被视作每片叶子上的最小样本比例。
c、每次分裂的最小样本数:
这个参数与每片叶子上的最小样本树相同,只不过是应用在节点的分裂当中。
d、最大特征数:
有时,我们会遇到特征数量过于庞大,而无法建立决策树的情况。在这种状况下,对于每一个分裂,我们都需要检查整个数据集中的每一个特征。这种过程极为繁琐。而解决方案之一是限制每个分裂中查找的特征数。如果这个数字足够庞大,我们很有可能在查找的特征中找到良好特征(尽管也许并不是完美特征)。然而,如果这个数字小于特征数,这将极大加快我们的计算速度。
e、验证集精度:
在每个可以划分的结点,计算划分前和划分后在验证集上的精度,如果划分前的精度高于划分后的精度,那么停止该结点的划分,前将该结点标记为叶结点。
3.2、后剪枝
后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。a、损失函数
计算某个结点剪枝前后的损失函数,如果剪枝后的损失函数更小,则标记该结点为叶结点。
设叶结点的个数为|T|,t为叶结点,该叶结点有 Nt N t 个样本点:
l(T)=∑t=1|T|NtEntt(D)+a|T| l ( T ) = ∑ t = 1 | T | N t E n t t ( D ) + a | T |
Entt(D) E n t t ( D ) 是叶结点t的信息熵;
a≥0,较大的a促使选择较简单的树,较小的a促使选择较复杂的树;b、验证集精度:
计算某个结点剪枝前后的精度,计算剪枝前和剪枝后在验证集上的精度,如果剪枝后的精度高于剪枝前的精度,那么前将该结点标记为叶结点。
4、随机森林
随机森林也是决策树学习算法对付“过拟合”的手段之一,但这里不详细介绍,以后在集成方法中再介绍。
5、sklearn中的决策树
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(x_values, y_values)