1. 简介
1.1 定义
- 是一种树形结构,本质是一颗由多个判断节点组成的树
- 其中每个内部节点表示一个属性上的判断,
- 每个分支代表一个判断结果的输出,
- 最后每个叶节点代表一种分类结果。
1.2 构建决策树
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(max_depth=2,criterion="entropy")
tree.fit(X,y)
通过上述分析可知:
- 决策树是非参数学习算法
- 决策树可以解决分类问题
- 决策树天然可以解决多分类问题
- 决策树可以解决回归问题:落在叶子节点(对应图中的A、B、C三点)的数据的平均值作为回归的结果
2. 特征选择
2.1 作用
为什么选择某个特征进行数据集的划分
因为该特征的区分能力强
2.2 熵
1. 定义
- 熵在信息论中代表随机变量不确定度的度量。或者是系统的混乱程度。
- 熵越大,数据的不确定性度越高
- 熵越小,数据的不确定性越低/确定性越高
当数据类别只有两类的情况下,公式可以做如下转换
import numpy as np
import matplotlib.pyplot as plt
def entropy(p):
return -p*np.log(p)-(1-p)*np.log(1-p)
x = np.linspace(0.01,0.99,200)
plt.plot(x,entropy(x))
plt.show()
3 信息增益
训练集D(100个学生),设2个类(男生/女生) k =1, 2, |C1| = 50, |C2| =50,设特征A(身高)有n个不同取值(158, 160, 162, 168, 170, 172),根据特征A的取值将D划分为6个子集,D1,D2…D6,|D1|=10, |D2|=20, |D3|=15, |D4|=15, |D5|=25, |D6|=15。Dik, D11表示的身高158的男生,D12表示的是身高158的女生
计算数据集D的经验熵
计算特征A对数据集D的经验条件熵
单独计算特征A的每个取值(6个取值)的条件熵
计算信息增益,用集合的经验熵分别减去6个条件熵,根据熵增益最大的对应的特征A的取值进行数据集划分
例子
Step1 计算经验熵
Step2 各特征的条件熵
Step3 计算增益
选择增益最大的特征作为划分节点
此时就可以根据该特征的取值把数据集分成若干个子集
对每个子集重复上面的过程,直到每个分支中都是同样的类别
2 信息增益比
以信息增益作为划分训练数据集的特征,存在倾向于选择取值较多的特征问题
前面例子中,如果选择ID列作为数据集划分特征,则信息增益最大,因为会把每个样本都单独的当作一个子集,条件熵就为0,则信息增益最大。
信息增益比就是用得到的信息增益除以
信息增益比本质: 是在信息增益的基础之上乘上一个惩罚参数。特征个数较多时,系数较小,得到的信息增益比相对会小;特征个数较少时,系数较大,得到的信息增益比相对较大。
3 决策树的生成
1 ID3算法
ID3算法的核心是在决策树的各个节点上应用信息增益准则进行特征选择,递归的构建决策树。
具体方法是:从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点;再对子节点递归调用以上方法,构建决策树
2 算法过程
1 根据该测试数据创建数据集 createDataset
2 计算集合的经验熵 calcShannonEnt
3 计算最大信息增益并以此划分数据集 chooseBestFeatureToSplit
4 分割数据集以便于计算子集的经验熵 splitDataSet
5 创建决策树构造函数
按照信息增益最高选择分类特征属性
bestFeat = chooseBestFeatureToSplit(dataSet) #分类编号
6 构建决策树分类函数以及决策树存储
3 C4.5算法实现
算法实现和ID3算法基本相似,唯一有区别的地方是
infoGainRate = infoGain/HAD
# 最大信息增益
if infoGainRate > bestInforGainRate:
bestInforGainRate = infoGainRate
bestFeature = i
4 ID3和C4.5对比
C4.5算法优缺点
- 优点:分类规则利于理解,准确率高
C4.5算法的核心思想是ID3算法,对ID3算法进行了相应的改进。
4 决策树的剪枝
1 剪枝原因
解决过拟合问题
2 剪枝算法
定义损失函数
第一项,计算的是每个叶子节点经验熵和当前叶子结点对应样本数量乘积累加和,如果叶子结点纯度高,则该值比较小。叶子结点数量多的情况下每个叶子结点纯度才会高
第二相关是叶子结点数量
综合这两项,通过优化损失函数可以找到最好的组合
剪枝算法
(1) 计算每个节点的经验熵;
(2) 递归地从树的叶节点向上回溯。分别计算回溯前后的损失值
(3) 选择损失值小的作为结果
5 基尼指数和CART算法
1 基尼指数
公式
二分类问题
根据条件A取值划分两个子集
2 CART算法
ID3算法和C4.5算法用于解决分类问题,引入了熵,但这里涉及到了大量的对数运算
CART分类树使用基尼系数来代替信息增益
当CART是回归树时,采用样本的最小方差作为节点分裂的依据
CART树是二叉树。
CART算法既可以用来分类,也可以用来做回归。
CART树生成
(1)对于当前节点的数据集为D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归;
(2)计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归;
(3)计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数;
(4)在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值alpha。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2同时建立当前节点的左右节点,左节点的数据集D为D1,右节点的数据集D为D2;
(5)对左右的子节点递归的调用前面1-4步,生成决策树。
CART使用的是后剪枝法。一般分为两步:先生成决策树,然后使用交叉验证来检验各种剪枝的效果,最后选择泛化能力好的剪枝策略。
使用CART算法构建决策树
from sklearn.tree import DecisionTreeClassifier
#注意:此处传入的是"gini"而不是"entropy",默认criterion='gini'
tree = DecisionTreeClassifier(max_depth=2,criterion="gini")
- 局限性1:分类方向性
- 局限性2:对个别数据敏感