决策树

本文详细介绍了决策树的基本概念、特征选择方法、连续值及缺失值处理、不同算法的区别、剪枝技术以及随机森林等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

决策树

决策树是一种基本的分类和回归方法;决策树的学习通常包括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;1i<nTa=ai+ai+12;1≤i<n

Ta=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)=817log2817917log2917=0.998Ent(D)=−817∗log2817−917∗log2917=0.998


计算条件熵:
对于密度小于0.381的样本中,共有4个样本,其中有0个正例,4个反例:
Ent(D|a0.381)=04log20444log244=0Ent(D|a≤0.381)=−04∗log204−44∗log244=0

对于密度大于0.381的样本中,共13个样本,其中有8个正例,5个反例:
Ent(D|a>0.381)=813log2813513log2513=0.961Ent(D|a>0.381)=−−813∗log2813−513∗log2513=0.961

样本中,密度小于0.381的样本数共4个,大于0.381的样本数共13个:
Ent(D|A,Ta=0.381)=417Ent(D|a0.381)+1317Ent(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)=maxtTaGain(D,A,t)Gain(D,A)=maxt∈TaGain(D,A,t)

刚好0.381划分点信息增益最大,所以选择0.381为密度的划分点.

1.2、缺失值处理
现实任务中常会遇到不完整样本,即样本的某些属性值缺失,如果简单地放弃不完整样本,仅使用无缺失值的样本来进行学习,显然对数据信息的极大的浪费。

公式:

Gain(D,A)=pGain(D,A)pGain(D,A)=p∗Gain(D′,A);p为无缺失值的样本占总样本的比例

例如色泽属性,1、3、5存在缺失值,假设每个样本的权重是一样的,DD′为无缺失值的样本,那么:

Gain(D,A)=1417Gain(D,A)Gain(D,A)=1417∗Gain(D′,A)

2、划分选择

在构造决策树时,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,因此我们需要选择划分的特征。

2.1、ID3算法

信息熵:是度量样本集合纯度最常用的一种指标,信息熵越小,纯度越高;
假设当前样本集合D分n类,其中第k类样本所占的比例为pkpk,则D的信息熵为:

Ent(D)=k=1npklog2pkEnt(D)=−∑k=1npk∗log2pk

条件熵:
假设当前样本集合D中,特征A有m个类别,其中第k个类的样本集合为DiDi,样本所点的比例为pkpk,则集合D中特征A的条件熵为:

Ent(D|A)=i=1m(pkEnt(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=IVpvlog2pv其中,IV(A)=−∑v=IVpv∗log2pv

例如触感属性,可取值“硬滑”和“软粘”两个,样本中“硬滑”占比12171217,“软粘”占比517517

IV()=1217log21217517log2517=0.874IV(触感)=−1217∗log21217−517∗log2517=0.874


2.3、CART算法
ID3和C4.5算法只都是生成分类树,而CART算法即可生成分类树,也可以生成回归树,CART算法生成的树都是二叉树。

2.3.1、回归树(最小二乘回归树)
当数据的输出变量是连续值时,我们需要构造回归树。下面以例子的型式讲解如何生成回归树。如下例子,{触感,密度}是特征变量,{含糖率}是输出变量:

编号触感密度含糖率
1硬滑0.6970.460
2硬滑0.7740.376
3硬滑0.6340.264
4软粘0.6080.318
5软粘0.5560.215
6软粘0.4030.237
7硬滑0.4810.149
8软粘0.4370.211
9硬滑0.6660.091
10硬滑0.2430.267
11硬滑0.2450.057
12硬滑0.3430.099
13硬滑0.6390.161
14硬滑0.6570.198
15硬滑0.3600.370
16软粘0.5930.042
17硬滑0.7190.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}

通过公式计算切分点的c1c1c2c2值:

c1=averagei=1yi|xiR1c1=average∑i=1yi|xi∈R1

c2=averagei=1yi|xiR2c2=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硬滑软粘
c1c10.2050.216
c2c20.2160.205

计算损失函数

l=xiR1(yic1)2+xjR2(yjc2)2l=∑xi∈R1(yi−c1)2+∑xj∈R2(yj−c2)2
s硬滑软粘
l0.2290.229

最小损失函数的划分点,就是该特征的最优划分点;在这里,(触感,硬滑) = (触感,软粘),这是肯定的,回归树算法本来就是生成二叉树的,而触感的输入空间只有“硬滑”和“软粘”两个,所以它们的损失函数是相等的。

密度
根据“密度”特征的值,对样本进行排序,然后计算切分点集合:

Ta=ai+ai+12;1i<nTa=ai+ai+12;1≤i<n

候选切分点集合:TT密度 = {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}

计算切分点的c1c1c2c2值:

c1=averagei=1yi|xiR1c1=average∑i=1yi|xi∈R1

c2=averagei=1yi|xiR2c2=average∑i=1yi|xi∈R2

例如s = 0.352,R1R1 = {x|x<0.325},R2R2 = {x|x>0.325};
s0.2440.2940.3520.3820.4200.4590.5190.5750.6010.6210.6370.6480.6620.6820.7080.747
c1c10.2670.1620.1410.1980.2060.2070.1990.2010.1830.1970.2030.1990.1990.1910.2090.203
c2c20.2090.2200.2280.2170.2160.2160.2230.2240.2460.2360.2320.2460.2580.3130.2400.376

计算损失函数:

l=xiR1(j,s)(yic1)2+xiR2(j,s)(yic2)2l=∑xi∈R1(j,s)(yi−c1)2+∑xi∈R2(j,s)(yi−c2)2
s0.2440.2940.3520.3820.4200.4590.5190.5750.6010.6210.6370.6480.6620.6820.7080.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.682)=0.193
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,kkmpkpk=1k=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=argminaAGini_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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值