决策树
1.简介:
决策树算法是一种监督学习算法,英文是Decision tree,也是一种树结构
决策树思想的来源非常朴素,试想每个人的大脑都有类似于if-else这样的逻辑判断,这其中的if表示的是条件,if之后的then就是一种选择或决策。程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
比如:你母亲要给你介绍男朋友,是这么来对话的:
女儿:多大年纪了?
母亲:26。
女儿:长的帅不帅?
母亲:挺帅的。
女儿:收入高不?
母亲:不算很高,中等情况。
女儿:是公务员不?
母亲:是,在税务局上班呢。
女儿:那好,我去见见。
于是你在脑袋里面就有了下面这张图:
作为女孩的你在决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。
1.2 通过sklearn实现决策树分类并进一步认识决策树
基于鸢尾花数据绘制图像
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:,2:]
y = iris.target
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.scatter(X[y==2,0],X[y==2,1])
plt.show()
训练决策树模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(max_depth=2,criterion="entropy")
tree.fit(X,y)
依据模型绘制决策树的决策边界
#找到模型的决策边界,并绘制图像(此方法所用到的api不需要掌握,能够调用就行)
def plot_decision_boundary(model,axis):
x0,x1 = np.meshgrid(
np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
)
X_new = np.c_[x0.ravel(),x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
from matplotlib.colors import ListedColormap
custom_map = ListedColormap(["#EF9A9A","#FFF59D","#90CAF9"])
plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)
plot_decision_boundary(tree,axis=[0.5,7.5,0,3])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.scatter(X[y==2,0],X[y==2,1])
plt.show()
树模型可视化
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plot_tree(tree,filled=True)
plt.show()
从上面的可视化图形中看出
X[1] <=0.8 作为第一次分割的依据,满足条件的所有样本均为统一类别
X[1]>0.8的,依据 X[1]<=0.75 为划分依据
由于设置了树的最大深度为2,第二层的两个叶子节点没有完全区分开
2. ID3决策树
2.1 信息熵
ID3 树是基于信息增益构建的决策树.
定义:
①熵在信息论中代表随机变量不确定度的度量。
②熵越大,数据的不确定性度越高
③熵越小,数据的不确定性越低
公式:
例子1:假如有三个类别,分别占比为:{⅓,⅓,⅓},信息熵计算结果为:
例子2:假如有三个类别,分别占比为:{1/10,2/10,7/10},信息熵计算结果为:
熵越大,表示整个系统不确定性越大,越随机,反之确定性越强。
例子3:假如有三个类别,分别占比为:{1,0,0},信息熵计算结果为:
公式的转换
当数据类别只有两类的情况下,公式可以做如下转换
代码角度理解信息熵的概念
import numpy as np
import matplotlib.pyplot as plt
# 定义了一个名为entropy的函数,它计算二项分布的熵
def entropy(p):
return -p*np.log(p)-(1-p)*np.log(1-p)
# 使用np.linspace生成了一个从0.01到0.99之间的200个均匀分布的数值
x = np.linspace(0.01,0.99,200)
# 绘制了熵函数随概率变化的曲线
plt.plot(x,entropy(x))
plt.show()
通过这段代码生成的图形会显示一个对称的曲线
①在概率p从0.01到0.99变化的范围内,曲线显示熵如何变化。这图反映了熵在p=0和p=1的时候比较低,因为此时系统的确定性最大,系统的信息熵就达到了最低值,即为0。
②当我们的系统每一个类别是等概率为0.5的时候,系统的不确定性最大,信息熵达到巅峰值。
2.2 信息增益
特征A对训练数据集D的信息增益 ( g ( D , A ) ) ( g(D, A) ) (g(D,A)),定义为集合D的经验熵 ( H ( D ) ) ( H(D)) (H(D)) 与特征A给定条件下的经验条件熵 ( H ( D ∣ A ) ) ( H(D \mid A) ) (H(D∣A)) 之差。即
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D, A) = H(D) - H(D \mid A) g(D,A)=H(D)−H(D∣A)
根据信息增益选择特征的方法是:对训练数据集D,计算其各个特征的信息增益,并比较它们的大小,选择信息增益最大的特征进行划分。表示由于特征A而使得划分后的分类不确定性减少的程度。
算法:
- 输入:训练数据集 ( D ) 和特征 ( A );
- 输出:特征 ( A ) 对训练数据集 ( D ) 的信息增益 ( g(D, A) )
-
计算数据集 ( D ) 的经验熵 ( H(D) )
H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ log 2 ∣ C k ∣ ∣ D ∣ H(D) = -\sum_{k=1}^K \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
-
计算特征 ( A ) 对数据集 ( D ) 的经验条件熵 ( H ( D ∣ A ) ) ( H(D \mid A)) (H(D∣A))
H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣ log 2 ∣ D i k ∣ ∣ D i ∣ H(D \mid A) = \sum_{i=1}^n \frac{|D_i|}{|D|} H(D_i) = -\sum_{i=1}^n \frac{|D_i|}{|D|} \sum_{k=1}^K \frac{|D_{ik}|}{|D_i|} \log_2 \frac{|D_{ik}|}{|D_i|} H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
-
计算信息增益
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D, A) = H(D) - H(D \mid A) g(D,A)=H(D)−H(D∣A)
例子:
下面以常用的贷款申请样本数据表为样本集,通过数学计算来介绍信息增益计算过程。
Step1 计算经验熵
类别一共是两个拒绝/同意,数量分别是6和9,根据熵定义可得:
Step2 各特征的条件熵
将各特征分别记为 A1,A2,A3,A4,分别代表年龄、有无工作、有无房子和信贷情况,那么
H
(
D
∣
A
1
)
=
5
15
(
−
2
5
log
2
2
5
−
3
5
log
2
3
5
)
+
5
15
(
−
3
5
log
2
3
5
−
2
5
log
2
2
5
)
+
5
15
(
−
4
5
log
2
4
5
−
1
5
log
2
1
5
)
=
0.888
H(D \mid A_1) = \frac{5}{15} \left( -\frac{2}{5} \log_2 \frac{2}{5} - \frac{3}{5} \log_2 \frac{3}{5} \right) + \frac{5}{15} \left( -\frac{3}{5} \log_2 \frac{3}{5} - \frac{2}{5} \log_2 \frac{2}{5} \right) + \frac{5}{15} \left( -\frac{4}{5} \log_2 \frac{4}{5} - \frac{1}{5} \log_2 \frac{1}{5} \right) = 0.888
H(D∣A1)=155(−52log252−53log253)+155(−53log253−52log252)+155(−54log254−51log251)=0.888
H ( D ∣ A 2 ) = 5 15 ( − 5 5 log 2 5 5 ) + 10 15 ( − 4 10 log 2 4 10 − 6 10 log 2 6 10 ) = 0.647 H(D \mid A_2) = \frac{5}{15} \left( -\frac{5}{5} \log_2 \frac{5}{5} \right) + \frac{10}{15} \left( -\frac{4}{10} \log_2 \frac{4}{10} - \frac{6}{10} \log_2 \frac{6}{10} \right) = 0.647 H(D∣A2)=155(−55log255)+1510(−104log2104−106log2106)=0.647
H ( D ∣ A 3 ) = 0.551 H(D \mid A_3) = 0.551 H(D∣A3)=0.551
H
(
D
∣
A
4
)
=
0.608
H(D \mid A_4) = 0.608
H(D∣A4)=0.608
Step3 计算增益
最终决策树如下
[有房子]
(是) / \(否)
同意 [有工作]
(是)/ \(否)
同意 拒绝
这就是构建好的决策树
2.3. ID3算法步骤
1.计算每个特征的信息增益
2.使用信息增益最大的特征将数据集 S 拆分为子集
3.使用该特征(信息增益最大的特征)作为决策树的一个节点
4.使用剩余特征对子集重复上述(1,2,3)过程
2.4. 小结
1.信息熵是一个变量(特征)包含信息多少的度量方式。信息熵的值大,则认为该变量包含的信息量就大
2.条件熵用于衡量以某个特征作为条件,对目标值纯度的提升程度
3.信息增益用于衡量那个特征更加适合优先分裂
4.使用信息增益构建的决策树成为 ID3 决策树
但是ID3决策树倾向于选择特征种类数量多的特征作为分类依据,这就是ID3的缺陷,后续因此提出了C4.5决策树
3. C4.5决策树
3.1信息增益率计算公式
1.Gain_Ratio 表示信息增益率
2.IV 表示分裂信息、内在信息
3.特征的信息增益 ÷ 内在信息
4.如果某个特征的特征值种类较多,则其内在信息值就越大。即:特征值种类越多,除以的系数就越大。
5.如果某个特征的特征值种类较小,则其内在信息值就越小。即:特征值种类越小,除以的系数就越小。
信息增益比本质: 是在信息增益的基础之上乘上一个惩罚参数。特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大。惩罚参数:数据集D以特征A作为随机变量的熵的倒数。
3.2. 信息增益率计算举例
特征1的信息增益率:
信息增益:0.5408520829727552
分裂信息:
−
4
6
log
2
(
4
6
)
−
2
6
log
2
(
2
6
)
=
0.9182958340544896
-\frac{4}{6}\log_2\left(\frac{4}{6}\right) - \frac{2}{6}\log_2\left(\frac{2}{6}\right) = 0.9182958340544896
−64log2(64)−62log2(62)=0.9182958340544896
信息增益率:信息增益/分裂信息 0.5408520829727552 0.9182958340544896 = 0.5889736868180786 \frac{0.5408520829727552}{0.9182958340544896} = 0.5889736868180786 0.91829583405448960.5408520829727552=0.5889736868180786
特征2的信息增益率:
信息增益:1
分裂信息:
−
1
6
log
2
(
1
6
)
×
6
=
2.584962500721156
-\frac{1}{6}\log_2\left(\frac{1}{6}\right) \times 6 = 2.584962500721156
−61log2(61)×6=2.584962500721156
信息增益率:信息增益/信息熵 1 2.584962500721156 = 0.38685280723454163 \frac{1}{2.584962500721156} = 0.38685280723454163 2.5849625007211561=0.38685280723454163
由计算结果可见,特征1的信息增益率大于特征2的信息增益率,根据信息增益率,我们应该选择特征1作为分裂特征。
3.3 ID3和C4.5对比
ID3算法
· 选择信息增益较大的作为分裂节点
· ID3算法不能处理具有连续值的属性
· ID3算法不能处理属性具有缺失值的样本
· 算法会生成很深的树,容易产生过拟合现象
· 算法一般会优先选择有较多属性值的特征,因为属性值多的特征会有相 对较大的信息增益,但这里的属性并不一定是最优的
C4.5算法
· 选择信息增益率较大的作为分裂节点
· 分类规则利于理解,准确率高
· C4.5算法的核心思想是ID3算法,对ID3算法进行了相应的改进。
· C4.5使用的是信息增益比来选择特征,克服了ID3的不足。
· 可以处理离散型描述属性,也可以处理连续数值型属性
· 能处理不完整数据
· 在构造过程中,需要对数据集进行多次的顺序扫描和排序,导致算法的低效
· C4.5只适合于能够驻留内存的数据集,当数据集非常大时,程序无法运行
无论是ID3还是C4.5最好在小数据集上使用,当特征取值很多时最好使用
C4.5算法。