【机器学习之决策树详解 (一) 】

决策树

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(DA)) 之差。即

g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D, A) = H(D) - H(D \mid A) g(D,A)=H(D)H(DA)

根据信息增益选择特征的方法是:对训练数据集D,计算其各个特征的信息增益,并比较它们的大小,选择信息增益最大的特征进行划分。表示由于特征A而使得划分后的分类不确定性减少的程度。

算法:

在这里插入图片描述

  • 输入:训练数据集 ( D ) 和特征 ( A );
  • 输出:特征 ( A ) 对训练数据集 ( D ) 的信息增益 ( g(D, A) )
  1. 计算数据集 ( 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=1KDCklog2DCk

  2. 计算特征 ( A ) 对数据集 ( D ) 的经验条件熵 ( H ( D ∣ A ) ) ( H(D \mid A)) (H(DA))

    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(DA)=i=1nDDiH(Di)=i=1nDDik=1KDiDiklog2DiDik

  3. 计算信息增益

    g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D, A) = H(D) - H(D \mid A) g(D,A)=H(D)H(DA)

例子:

下面以常用的贷款申请样本数据表为样本集,通过数学计算来介绍信息增益计算过程。
在这里插入图片描述
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(DA1)=155(52log25253log253)+155(53log25352log252)+155(54log25451log251)=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(DA2)=155(55log255)+1510(104log2104106log2106)=0.647

H ( D ∣ A 3 ) = 0.551 H(D \mid A_3) = 0.551 H(DA3)=0.551

H ( D ∣ A 4 ) = 0.608 H(D \mid A_4) = 0.608 H(DA4)=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算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值