决策树
决策树是一种基本的分类与回归方法,它是一种树形模型。一般的,一颗决策树包含一个根节点、若干个内部节点和若干叶子节点,每个内部节点对应一个属性,每个叶子节点对应一种类别。决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的剪枝。特征选择
特征选择在于选择对训练数据具有分类能力的特征。通常特征选择的准则是信息增益或信息增益比。- 熵
在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量。随机变量 X 的熵定义为
H(X)=−∑inpilogpi(pi为概率) - 条件熵
条件熵 H(Y|X) 表示已知随机变量 X 的条件下随机变量Y 的不确定性。随机变量 X 给定的条件下随机变量Y 的条件熵记作 H(Y|X) ,定义为 X 给定条件下Y 的条件概率分布的熵对 X 的数学期望
H(X|Y)=∑i=1npiH(Y|X=xi)(pi=P(X=xi),i=1,2,⋯,n) - 信息增益
特征 A 对训练数据集D 的信息增益 g(D,A) ,定义为集合 D 的经验熵H(D) 与特征 A 给定条件下D 的经验条件熵 H(D|A) 之差,即
g(D,A)=H(D)−H(D|A)
根据信息增益准则的特征选择方法是:对训练数据集(或子集) D ,计算每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。著名的ID3决策树学习算法就是以信息增益为准则来选择划分属性。信息增益准则对可能取值数目较多的属性有所偏好。 - 信息增益比
特征A 对训练数据集 D 的信息增益比gR(D,A) 定义为其信息增益 g(D,A) 与训练数据集 D 关于A 的值的熵 HA(D) 之比,即
gR(D,A)=g(D,A)HA(D)
其中,
HA(D)=−∑i=1n|Di||D|log2|Di||D|,n是特征A的个数
需要注意的是,增益率准则则对可取值数目较小的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
- 熵
决策树基本算法
输入: 训练集
D=(x1,y1),(x2,y2),⋯,(xm,ym);
属性集
A={a1,a2,⋯,ad}.
过程: 函数
TreeGenerate(D,A)
1: 生成节点node;
2: if
D
中样本完成属于同一个类别
3: 将node标记为
C
类叶节点; return
4: end if
5: if
6: 将node标记为叶节点,其类别标记为
D
中样本数最多的类;return
7: endif
8:从
9: for
a∗
的每一个值
av∗
do
10: 为node生成一个分支;令
Dv
表示
a∗
上取值为
av∗
的样本子集;
11: if
Dv
为空 then
12: 将分支节点标记为叶节点,其类别标记为
D
中样本最多的类; return
13: else
14: 以
15: endif
16: endfor
输出:以node为根节点的一颗决策树
显然决策树的生成是一个递归过程。决策树学习的关键是第8行,即如何选择最优划分属性。可利用上文提到的信息增益和信息增益率准则来划分。
决策树的剪枝
决策树的剪枝可通过损失函数或代价函数来实现,定义为
Ca(T)=C(T)+α|T|
C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合度, |T| 为数 T 的叶节点个数,表示模型的复杂度,参数α≥0 控制两者间的影响。代码测试
import numpy as np from sklearn.model_selection import train_test_split from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.tree import DecisionTreeClassifier depth = np.arange(1, 10) for d in depth: model = Pipeline([ # 归一化特征 ('ss', StandardScaler()), # Supported criteria are "gini" for the Gini impurity # and "entropy" for the information gain. ('DTC', DecisionTreeClassifier(criterion='entropy', max_depth=d)) ]) model = model.fit(xtrain, ytrain) ytestHat = model.predict(xtest) result = (ytestHat == ytest) accuracy = np.mean(result) print(d, ' depth 准确率: %.4f%%' % (100 * accuracy))
- 输出
1 depth 准确率: 60.0000% 2 depth 准确率: 95.5556% 3 depth 准确率: 95.5556% 4 depth 准确率: 95.5556% 5 depth 准确率: 95.5556% 6 depth 准确率: 95.5556% 7 depth 准确率: 95.5556% 8 depth 准确率: 95.5556% 9 depth 准确率: 95.5556%
- DecisionTreeClassifier用了哪种算法
sklearn 中DecisionTreeClassifier的criterion参数说明为:Supported criteria are “gini” for the Gini impurity and “entropy” for the information gain.代码中填了entropy,个人认为是用了ID3算法,因为C4.5是基于信息增益率的。可参考知乎这里的讨论决策树在scikit-learn中的实现问题? - 特征归一化的作用
这篇文章解析的不错为什么要特征标准化及特征标准化方法
补充
- 参考
[1] 李航.统计学习方法
[2] 周志华.机器学习 - 代码数据来源
iris
- 参考