(五)决策树
本系列重点在浅显易懂,快速上手。不进行过多的理论讲解:也就是不去深究what,而是关注how。全文围绕以下三个问题展开:
1)长什么样?
2)解决什么问题?
3)怎么实现?
3.1)从数学讲,原理
3.2)从代码上讲,如何掉包实现
长什么样
决策树由节点和边和叶子组成,如下面的树,蓝绿色块是节点,表示特征,蓝色线条是边,表示条件,带小人图的终端是叶子表示模型的最终的输出值。这个树表示的是如果一个人年龄大于等于15岁,就划分到右边的叶子,这个人就是妈妈或者奶奶或者爷爷。如果年龄小于15岁,划分到左侧节点,再接着划分,当时男孩时划分到最左侧,就表示男孩,当时女孩是划分到右侧表示女孩。
解决什么问题
决策树有三种:ID3、C4.5、CART树,其中ID3、C4.5可以解决分类问题,CART树可以解决分类和回归问题。
分类问题如下:x1到x4x1到x4x1到x4为特征,y为目标变量,y是离散的有1和0两种类型。通过特征来预测目标变量y的类型。
x1 | x2 | x3 | x4 | y |
---|---|---|---|---|
5.5 | 2.6 | 4.4 | 1.2 | 1 |
5 | 3 | 1.6 | 0.2 | 0 |
5.7 | 2.8 | 4.5 | 1.3 | 1 |
5.1 | 3.4 | 1.5 | 0.2 | 0 |
6.3 | 3.3 | 4.7 | 1.6 | 1 |
回归为题如下:x1到x13x1到x13x1到x13为特征,y为目标变量,y是连续值。通过特征来预测目标变量y的值。
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | y |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0.01 | 18 | 2.31 | 0 | 0.54 | 6.58 | 65.2 | 4.09 | 1 | 296 | 15.3 | 396.9 | 4.98 | 24 |
0.03 | 0 | 7.07 | 0 | 0.47 | 6.42 | 78.9 | 4.97 | 2 | 242 | 17.8 | 396.9 | 9.14 | 21.6 |
0.03 | 0 | 7.07 | 0 | 0.47 | 7.18 | 61.1 | 4.97 | 2 | 242 | 17.8 | 392.83 | 4.03 | 34.7 |
0.03 | 0 | 2.18 | 0 | 0.46 | 7 | 45.8 | 6.06 | 3 | 222 | 18.7 | 394.63 | 2.94 | 33.4 |
0.07 | 0 | 2.18 | 0 | 0.46 | 7.15 | 54.2 | 6.06 | 3 | 222 | 18.7 | 396.9 | 5.33 | 36.2 |
怎么实现
数学原理
通过上图可以看出来,决策树就是通过不断的形成分支来实现最终的分类,一个待预测的数据从根部开始,沿着分支逐级向下,最终可以被分类到一个叶子节点,次叶子节点的值就是当前待预测数据的预测值。
那么问题是,用哪个特征作为节点去分支,当然不是随机的。按方法就分为了以上三种决策树:ID3、C4.5、CART树。ID3树以信息增益作为属性的选择标准,C4.5以信息增益率作为属性的选择标准,CART树以基尼指数作为属性的选择标准。
下面逐一解释上面的几个方法。
信息增益
先从介绍信息熵开始:
1)信息熵:
信息熵是考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望,系统越有序,熵越小,系统越混乱,熵越大。
H(X)=E(I(X))=∑i=1qpilog21pi=−∑i=1qpilog2pi 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=1∑qpilog2pi1=−i=1∑qpilog2pi
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/5∗log2(2/5)+3/5∗log2(3/5))=0.97095
x1 | x2 | y |
---|---|---|
6 | 2 | 1 |
5 | 3 | 0 |
6 | 2 | 1 |
5 | 3 | 0 |
6 | 3 | 1 |
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=1∑np(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/5∗log2(2/5)+1/5∗log2(1/5)+0∗log2(0)+2/5∗log2(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(Y∣X)=x∑p(x)H(Y∣X=x)=−x∑p(x)y∑p(y∣x)logp(y∣x)=−x∑y∑p(x,y)logp(y∣x)=−x,y∑p(x,y)logp(y∣x)
或者
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(Y∣X)=j=1∑P(X=vj)H(Y∣X=νj)=x∑P(x)H(Yx)=x∑p(x)(−y∑p(y∣x)log(p(y∣x)))=−x∑y∑p(x)p(y∣x)log(p(y∣x))=−x∑y∑p(x,y)log(p(x)p(x,y))=−x∑y∑p(x,y)log(p(x,y))−[−x∑(y∑p(x,y))log(p(x))]=H(X,Y)−[−x∑p(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)=x1∑p(x1)H(x2∣x1)
x1取5的概率为2/5,此时x2的取值为[3,3], 熵为−(1∗log2(1))=0-(1*log2(1))=0−(1∗log2(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/3∗log2(1/3)+2/3∗log2(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)=x1∑p(x1)H(x2∣x1)=2/5∗0+3/5∗0.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(Y∣X)=H(Y)−H(Y∣X)
画图表示上面几个概念的关系如下:
左边的椭圆代表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(Y∣X)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=1−i=1∑nP(i)2=Gini(Y)−Gini(Y∣X)
以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)=minj,s[minci∑x∈Ri(j,s)(yi−c1)2+minc2∑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[ciminx∈Ri(j,s)∑(yi−c1)2+c2minx∈R2(j,s)∑(yi−c2)2]
j表示特征,s表示特征j的某个具体值,y表示样本的y值,c表示当前叶子内所有样本y的均值。就是下图的意思:
x1 | x2 | y |
---|---|---|
66 | 296 | 24 |
78 | 235 | 21 |
61 | 235 | 34 |
45 | 235 | 33 |
54 | 235 | 36 |
以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)=(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,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