(五)决策树(DecisionTrees)的原理和实现

本文围绕决策树展开,介绍其结构,由节点、边和叶子组成。阐述决策树可解决分类和回归问题,ID3、C4.5用于分类,CART可用于分类和回归。还讲解了决策树实现的数学原理,如信息增益、信息增益率、基尼指数等,最后提到可通过sklearn的CART树实现。

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

(五)决策树

本系列重点在浅显易懂,快速上手。不进行过多的理论讲解:也就是不去深究what,而是关注how。全文围绕以下三个问题展开:

1)长什么样?

2)解决什么问题?

3)怎么实现?

​ 3.1)从数学讲,原理

​ 3.2)从代码上讲,如何掉包实现

长什么样

决策树由节点和边和叶子组成,如下面的树,蓝绿色块是节点,表示特征,蓝色线条是边,表示条件,带小人图的终端是叶子表示模型的最终的输出值。这个树表示的是如果一个人年龄大于等于15岁,就划分到右边的叶子,这个人就是妈妈或者奶奶或者爷爷。如果年龄小于15岁,划分到左侧节点,再接着划分,当时男孩时划分到最左侧,就表示男孩,当时女孩是划分到右侧表示女孩。

在这里插入图片描述

解决什么问题

决策树有三种:ID3、C4.5、CART树,其中ID3、C4.5可以解决分类问题,CART树可以解决分类和回归问题。

分类问题如下:x1到x4x1到x4x1x4为特征,y为目标变量,y是离散的有1和0两种类型。通过特征来预测目标变量y的类型。

x1x2x3x4y
5.52.64.41.21
531.60.20
5.72.84.51.31
5.13.41.50.20
6.33.34.71.61

回归为题如下:x1到x13x1到x13x1x13为特征,y为目标变量,y是连续值。通过特征来预测目标变量y的值。

x1x2x3x4x5x6x7x8x9x10x11x12x13y
0.01182.3100.546.5865.24.09129615.3396.94.9824
0.0307.0700.476.4278.94.97224217.8396.99.1421.6
0.0307.0700.477.1861.14.97224217.8392.834.0334.7
0.0302.1800.46745.86.06322218.7394.632.9433.4
0.0702.1800.467.1554.26.06322218.7396.95.3336.2

怎么实现

数学原理

通过上图可以看出来,决策树就是通过不断的形成分支来实现最终的分类,一个待预测的数据从根部开始,沿着分支逐级向下,最终可以被分类到一个叶子节点,次叶子节点的值就是当前待预测数据的预测值。

那么问题是,用哪个特征作为节点去分支,当然不是随机的。按方法就分为了以上三种决策树:ID3、C4.5、CART树。ID3树以信息增益作为属性的选择标准,C4.5以信息增益率作为属性的选择标准,CART树以基尼指数作为属性的选择标准。

下面逐一解释上面的几个方法。

信息增益

先从介绍信息熵开始:

1)信息熵:

信息熵是考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望,系统越有序,熵越小,系统越混乱,熵越大。

H(X)=E(I(X))=∑i=1qpilog⁡21pi=−∑i=1qpilog⁡2pi H\left(X\right)=E\left(I\left(X\right)\right)=\sum_{i=1}^{q}p_{i}\log_{2}\frac{1}{p_{i}}=-\sum_{i=1}^{q}p_{i}\log_{2}p_{i} H(X)=E(I(X))=i=1qpilog2pi1=i=1qpilog2pi

X是特征,q是特征的值,p表示当前特征取q的概率,例如下表的特征x1:x1有5和6两个值,取5的概率是2/5,取6的概率是3/5,所以x1的信息熵为:

H(X1)=−(2/5∗log2(2/5)+3/5∗log2(3/5))=0.97095 H(X1) = -(2/5*log_2(2/5)+3/5*log_2(3/5)) = 0.97095 H(X1)=(2/5log2(2/5)+3/5log2(3/5))=0.97095

x1x2y
621
530
621
530
631
2)联合熵

H(X,Y)=−∑i=1np(xi,yi)logp(xi,yi) H(X,Y)=-\sum_{i=1}^np(x_i,y_i)logp(x_i,y_i) H(X,Y)=i=1np(xi,yi)logp(xi,yi)
以x1和x2为例,取到(6,2)的概率为2/5,取(6,3)的概率为1/5,取(5,2)的概率为0,取(5,3)的概率为2/5.

则:

H(x1,x2)=−(2/5∗log2(2/5)+1/5∗log2(1/5)+0∗log2(0)+2/5∗log2(2/5))=1.5219 H(x1,x2) = -(2/5*log_2(2/5)+1/5*log_2(1/5)+0*log_2(0)+2/5*log_2(2/5))=1.5219 H(x1,x2)=(2/5log2(2/5)+1/5log2(1/5)+0log2(0)+2/5log2(2/5))=1.5219

3) 条件熵

条件熵 H(Y|X) 表示在已知随机变量 X 的条件下随机变量 Y 的不确定性。条件熵 H(Y|X)定义为X给定条件下Y的条件概率分布的熵对X的数学期望:

H(Y∣X)=∑xp(x)H(Y∣X=x)=−∑xp(x)∑yp(y∣x)logp(y∣x)=−∑x∑yp(x,y)logp(y∣x)=−∑x,yp(x,y)logp(y∣x) \begin{aligned} H(Y|X)& =\sum_xp(x)H(Y|X=x) \\ &=-\sum_xp(x)\sum_yp(y|x)logp(y|x) \\ &=-\sum_x\sum_yp(x,y)logp(y|x) \\ &=-\sum_{x,y}p(x,y)logp(y|x) \\ \end{aligned} H(YX)=xp(x)H(YX=x)=xp(x)yp(yx)logp(yx)=xyp(x,y)logp(yx)=x,yp(x,y)logp(yx)

或者

H(Y∣X)=∑j=1P(X=vj)H(Y∣X=νj)=∑xP(x)H(Y∣x)=∑xp(x)(−∑yp(y∣x)log(p(y∣x)))=−∑x∑yp(x)p(y∣x)log(p(y∣x))=−∑x∑yp(x,y)log(p(x,y)p(x))=−∑x∑yp(x,y)log(p(x,y))−[−∑x(∑yp(x,y))log(p(x))]=H(X,Y)−[−∑xp(x)log(p(x))]=H(X,Y)−H(X) \begin{aligned} H(Y\mid X& {\big)}=\sum_{j=1}P{\big(}\mathbf{X}=\mathbf{v}_{j}{\big)}H{\big(}Y\mid X=\nu_{j}{\big)}=\sum_{x}P{\big(}\mathbf{x}{\big)}H{\big(}Y{\big|}x{\big)} \\ &=\sum_{x}p(x)\biggl(-\sum_{y}p(y\mid x)\mathrm{log}\bigl(p\bigl(y\mid x\bigr)\bigr)\biggr)=-\sum_{x}\sum_{y}p\bigl(x\bigr)p\bigl(y\mid x\bigr)\mathrm{log}\bigl(p\bigl(y\mid x\bigr)\bigr) \\ &=-\sum_x\sum_yp(x,y)\mathrm{log}{\left(\frac{p(x,y)}{p(x)}\right)} \\ &=-\sum_x\sum_yp(x,y)\mathrm{log}\bigl(p\bigl(x,y\bigr)\bigr)-\biggl[-\sum_x\biggl(\sum_yp\bigl(x,y\bigr)\biggr)\mathrm{log}\bigl(p\bigl(x\bigr)\bigr)\biggr] \\ &=H\bigl(X,Y\bigr)-\biggl[-\sum_{x}p\bigl(x\bigr)\mathrm{log}\bigl(p\bigl(x\bigr)\bigr)\biggr]=H\bigl(X,Y\bigr)-H\bigl(X\bigr) \end{aligned} H(YX)=j=1P(X=vj)H(YX=νj)=xP(x)H(Yx)=xp(x)(yp(yx)log(p(yx)))=xyp(x)p(yx)log(p(yx))=xyp(x,y)log(p(x)p(x,y))=xyp(x,y)log(p(x,y))[x(yp(x,y))log(p(x))]=H(X,Y)[xp(x)log(p(x))]=H(X,Y)H(X)

以x1和x2为例:

H(x2∣x1)=∑x1p(x1)H(x2∣x1) H(x2|x1) =\sum_{x_1}p(x_1)H(x_2|x_1) H(x2∣x1)=x1p(x1)H(x2x1)

x1取5的概率为2/5,此时x2的取值为[3,3], 熵为−(1∗log2(1))=0-(1*log2(1))=0(1log2(1))=0

x1取6的概率为3/5,此时x2的取值为[2,2,3],熵为−(1/3∗log2(1/3)+2/3∗log2(2/3))=0.9183-(1/3*log2(1/3)+2/3*log2(2/3))=0.9183(1/3log2(1/3)+2/3log2(2/3))=0.9183

H(x2∣x1)=∑x1p(x1)H(x2∣x1)=2/5∗0+3/5∗0.9183=0.55098 \begin{aligned} H(x2|x1)&=\sum_{x_1}p(x_1)H(x_2|x_1)\\ &=2/5*0 + 3/5*0.9183\\ &=0.55098 \end{aligned} H(x2∣x1)=x1p(x1)H(x2x1)=2/50+3/50.9183=0.55098

3)信息增益

信息增益(information gain),表示存在某种条件 X,它使得条件熵 H(Y|X)尽可能的小,(也就是“不确定性”减少的多),即当引入信息 X之后,事物 Y的熵变小了。信息增益记为:

g(Y∣X)=H(Y)−H(Y∣X) g(Y\mid X)=H(Y)-H(Y\mid X) g(YX)=H(Y)H(YX)

画图表示上面几个概念的关系如下:
在这里插入图片描述

左边的椭圆代表H(X),右边的椭圆代表H(Y),中间重合的部分就是我们的互信息或者信息增益I(X,Y),左边的椭圆去掉重合部分就是H(X|Y),右边的椭圆去掉重合部分就是H(Y|X)-两个椭圆的并就是H(X,Y)

ID3构建的决策树可以是二叉树也可以不是二叉树。例如XI为离散型变量,有5和6两个值,构建的就是二叉树,如果x1有3个值,构建的就是3叉树,当然也可以构建二叉树,按某个值划分为“属于当前值”和“不属于当前值”两个类型。如果为连续型变量可以认为的划分一个分割点,分割点左侧的为一类,右侧的为一类,构建决策树。也可以对连续值进行分箱,构建成多叉树。

信息增益率

在ID3算法的基础上,进行算法优化提出的一种算法(C4.5),使用信息增益率来取代ID3中的信息增益。信息增益率的计算方式如下,

Gain(X)=H(Y)-H⁡(Y ∣ X)Gain_ratio(X)=Gain(X)H(X) \begin{gathered} Gain(X)=\operatorname{H\big(Y\big)-H}(Y\:|\:\mathrm{X}) \\ Gain\_ratio\Big(X\Big)=\frac{Gain\Big(X\Big)}{H\Big(X\Big)} \end{gathered} Gain(X)=H(Y)-H(YX)Gain_ratio(X)=H(X)Gain(X)

基尼Gini指数
CART分类树

CART(Classification And Regression Trees,分类回归树)算法,不仅可以作为分类树,还可以作为回归树。采用的是Gini指数(选Gini指数最小的特征)作为分裂标准,同时它也是包含后剪枝操作。

基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。

基尼指数(基尼不纯度)=样本被选中的概率"样本被分错的概率

具体公式如下,增益的计算方式和上面的方式一样,只是换了一个符号而以,

Gini=1−∑i=1nP(i)2Gain=Gini(Y)−Gini(Y ∣ X) \begin{aligned}Gini&=1-\sum_{i=1}^nP(i)^2\\ Gain&=\mathrm{Gini}(\mathrm{Y})-\mathrm{Gini}(Y\:|\:\mathrm{X})\end{aligned} GiniGain=1i=1nP(i)2=Gini(Y)Gini(YX)

以x1为例,则x1的基尼指数(基尼不纯度)为,x1有两个取值5和6,取5的概率为2/5,取6的概率为3/5,则:

Gini(x1)=1−(2/5)2−(3/5)2=0.48 Gini(x1) = 1-(2/5)^2 - (3/5)^2=0.48 Gini(x1)=1(2/5)2(3/5)2=0.48

CART回归树

回归树也是二叉树,只不特征的选择方式发生了变化,如下:

R(j,s)=min⁡j,s[min⁡ci∑x∈Ri(j,s)(yi−c1)2+min⁡c2∑x∈R2(j,s)(yi−c2)2] R(j,s) = \min_{j,s}\Biggl[\min_{c_{i}}\sum_{x\in R_{i}(j,s)}\left(y_{i}-c_{1}\right)^{2}+\min_{c_{2}}\sum_{x\in R_{2}(j,s)}\left(y_{i}-c_{2}\right)^{2}\Biggr] R(j,s)=j,smin[ciminxRi(j,s)(yic1)2+c2minxR2(j,s)(yic2)2]

j表示特征,s表示特征j的某个具体值,y表示样本的y值,c表示当前叶子内所有样本y的均值。就是下图的意思:

在这里插入图片描述

x1x2y
6629624
7823521
6123534
4523533
5423536

以x1划分,

​ 55划分时,分到左侧的y值有[33,36],均值为34.5,分到右侧的有[24,21,34],均值为26.3

​ 65划分时,分到左侧的y值有[34,33,36],均值为34.3,分到右侧的有[24,21],均值为22.5

以x2划分,

​ 250划分时,分到左侧的y值有[21,34,33,36],均值为31,分到右侧的有[24]
R(X1,55)=(33−34.5)2+(36−34.5)2+(24−26.3)2+(21−26.3)2+(34−26.3)2=97.17R(X1,65)=(34−34.3)2+(33−34.3)2+(36−34.3)2+(24−22.5)2+(21−22.5)2=9.17R(X2,250)=(21−31)2+(34−31)2+(33−31)2+(36−31)2+(24−24)2=138 R(X1,55) =(33-34.5)^2+(36-34.5)^2+(24-26.3)^2+(21-26.3)^2+(34-26.3)^2=97.17\\ R(X1,65) =(34-34.3)^2+(33-34.3)^2+(36-34.3)^2+(24-22.5)^2+(21-22.5)^2=9.17\\ R(X2,250) =(21-31)^2+(34-31)^2+(33-31)^2+(36-31)^2+(24-24)^2=138\\ R(X1,55)=(3334.5)2+(3634.5)2+(2426.3)2+(2126.3)2+(3426.3)2=97.17R(X1,65)=(3434.3)2+(3334.3)2+(3634.3)2+(2422.5)2+(2122.5)2=9.17R(X2,250)=(2131)2+(3431)2+(3331)2+(3631)2+(2424)2=138
R(x1,65)最小,所以以x1的65为第一个划分节点,下面继续以这种方法进行划分。停止条件,一般可以设定当树的深度达到一定深度或者叶子节点的y得数量小于某个数时停止。

这里需要注意得一点时,id3和c4.5树可以不是二叉树,而cart树是二叉树,且id3和c4.5树在划分时,特征不复用。而cart树得特征可以复用。

sklearn掉包实现

这里需要说明得是,sklearn中得决策树是通过cart树实现得。

# 调取sklearn包
from sklearn.tree import DecisionTreeClassifier #sklearn中,线性回归模型在linear_model模块中
# 调取sklearn中自带的数据集
from sklearn.datasets import load_iris #调用上文一开始提到大波士顿房价数据集


X, y = load_iris(return_X_y=True) #获取X,y数据
clf = DecisionTreeClassifier(min_samples_leaf=0.1) #初始化一个决策树模型
clf.fit(X,y) #fit函数用于训练

LR.predict(X) #predict函数用于预测

# 下面得代码用于决策树得可视化(在jupyter notebook中实现)
from sklearn import tree
dot_data = tree.export_graphviz(clf, )
import graphviz
graph = graphviz.Source(dot_data)
graph

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值