决策树新手入门详细教程
- 一、数学基础
- 1. 信息熵
- (1) 基本定义
- (2) 条件熵
- (3) 有关定律
- 2. 信息增益
- 二、决策树的组成
- 1. 决策节点
- 2. 叶子节点
- 3. 决策树的深度
- 三、决策树的建立(基于信息增益)—— ID3
- 1. 计算根节点的信息熵
- 2. 计算属性的信息增益
- (1) 职业
- (2) 年龄(以35岁为界)
- (3) 收入(以10000为界)
- (4) 学历(以高中为界)
- 3. 接下来我们继续重复1,2的做法继续寻找合适的属性节点
- 确定第二个属性节点
- 4. 决策树建成
- 四、决策树的另一划分标准——增益率(C4.5决策树算法)
- 1. 引入原因
- 2. 定义
- 3. 例子
- 4. 注意点
- 五、决策树的另一划分标准——基尼指数(CART决策树)
- 1. 定义
- (1) 基尼值
- (2) 基尼指数
- 2. 决策树建立方法(分类回归均可用)
- 六、剪枝处理
- 1. 提出原因
- 2. 剪枝与其处理基本策略
- (1) 剪枝
- (2) 基本策略
- 3. 预剪枝
- (1) 做法
- (2) 具体例子
- (3) 优缺点
- 4. 后剪枝
- (1) 做法
- (2) 优缺点
- 5. 另一种剪枝方法
- 七、连续与缺失值
- 1. 连续值处理
- (1) 提出原因
- (2) 做法
- (3) 二分法
- 2. 缺失值处理
- (1) 提出原因
- (2) 做法
- 八、多变量决策树
- 九、Python实现决策树
一、数学基础
1. 信息熵
(1) 基本定义
假设样本集合 D D D 共有 N N N 类,第 k k k 类样本所占比例为 p k p_k pk,则 D D D 的信息熵为:
H ( D ) = − ∑ k = 1 N p k log 2 p k H(D) = - \sum_{k=1}^N p_k \log_2 p_k H(D)=−k=1∑Npklog2pk
信息熵描述的是在结果出现之前对可能产生的信息量的期望,反映了结果的不确定性。信息熵越大,不确定性越大。 H ( D ) H(D) H(D) 的值越小,则 D D D 的纯度越高。
注:
- 计算信息熵时约定:如果 p k = 0 p_k = 0 pk=0,则 p k log 2 p k = 0 p_k \log_2 p_k = 0 pklog2pk=0
- H ( D ) H(D) H(D) 的最小值是 0,最大值是 log 2 N \log_2 N log2N
如下图所示为二元信源熵函数( H ( p ) H(p) H(p)):
(2) 条件熵
条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X) 表示在已知随机变量 X X X 的条件下随机变量 Y Y Y 的不确定性。公式如下:
H ( Y ∣ X ) = ∑ i = 1 n p ( x i ) H ( Y ∣ X = x i ) H(Y|X) = \sum_{i=1}^{n} p(x_i) H(Y|X=x_i) H(Y∣X)=i=1∑np(xi)H(Y∣X=xi)
(3) 有关定律
- 若 X X X 和 Y Y Y 相互独立,则 H ( Y ∣ X ) = H ( Y ) H(Y|X) = H(Y) H(Y∣X)=H(Y)
- H ( Y ∣ Y ) = 0 H(Y|Y) = 0 H(Y∣Y)=0
2. 信息增益
信息增益是一个统计量,用来描述一个属性区分数据样本的能力。信息增益越大,决策树就会越简洁。信息增益的程度用信息熵的变化程度来衡量。公式如下:
I G ( D , A ) = H ( D ) − H ( D ∣ A ) IG(D, A) = H(D) - H(D|A) IG(D,A)=H(D)−H(D∣A)
二、决策树的组成
1. 决策节点
通过条件判断而进行分支选择的节点。例如,将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。
2. 叶子节点
没有子节点的节点,表示最终的决策结果。
3. 决策树的深度
所有节点的最大层次数。决策树具有一定的层次结构,根节点的层次数定为 0,从下面开始每一层子节点层次数 +1。
决策树的学习一般包括:特征选择,决策树的生成,决策树的修剪。
三、决策树的建立(基于信息增益)—— ID3
我们通过一个例子来说明如何根据以下信息构建一棵预测是否贷款的决策树。我们可以看到有4个影响因素:职业、年龄、收入和学历。
1. 计算根节点的信息熵
假设样本集合 D D D 中“是”占 50%,“否”占 50%,则:
H ( D ) = − ( 1 2 log 2 1 2 + 1 2 log 2 1 2 ) = 1 H(D) = -(\frac{1}{2} \log_2 \frac{1}{2} + \frac{1}{2} \log_2 \frac{1}{2}) = 1 H(D)=−(21log221+21log221)=1
2. 计算属性的信息增益
(1) 职业
假设职业属性的熵为 H ( 职业 ) = 0.934 H(\text{职业}) = 0.934 H(职业)=0.934,则:
I G ( D , 职业 ) = H ( D ) − H ( 职业 ) = 1 − 0.934 = 0.066 IG(D, \text{职业}) = H(D) - H(\text{职业}) = 1 - 0.934 = 0.066 IG(D,职业)=H(D)−H(职业)=1−0.934=0.066
(2) 年龄(以35岁为界)
假设年龄属性的熵为 H ( 年龄 ) = 1 H(\text{年龄}) = 1 H(年龄)=1,则:
I G ( D , 年龄 ) = H ( D ) − H ( 年龄 ) = 1 − 1 = 0 IG(D, \text{年龄}) = H(D) - H(\text{年龄}) = 1 - 1 = 0 IG(D,年龄)=H(D)−H(年龄)=1−1=0
(3) 收入(以10000为界)
假设收入属性的熵为 H ( 收入 ) = 0.734 H(\text{收入}) = 0.734 H(收入)=0.734,则:
I G ( D , 收入 ) = H ( D ) − H ( 收入 ) = 1 − 0.734 = 0.266 IG(D, \text{收入}) = H(D) - H(\text{收入}) = 1 - 0.734 = 0.266 IG(D,收入)=H(D)−H(收入)=1−0.734=0.266
(4) 学历(以高中为界)
假设学历属性的熵为 H ( 学历 ) = 0.734 H(\text{学历}) = 0.734 H(学历)=0.734,则:
I G ( D , 学历 ) = H ( D ) − H ( 学历 ) = 1 − 0.734 = 0.266 IG(D, \text{学历}) = H(D) - H(\text{学历}) = 1 - 0.734 = 0.266 IG(D,学历)=H(D)−H(学历)=1−0.734=0.266
选择信息增益最大的属性作为划分属性,即选择“收入”。
3. 接下来我们继续重复1,2的做法继续寻找合适的属性节点
确定第二个属性节点
假设“收入”为节点后,“是”占 50%,“否”占 50%,因此 H = 1 H=1 H=1。
4. 决策树建成
最终我们得到了如下的决策树:
收入/ \>10000 <=10000/ \
学历 学历
/ \ / \
是 否 否 是
四、决策树的另一划分标准——增益率(C4.5决策树算法)
1. 引入原因
信息增益准则对可取值数目较多的属性有所偏好。为减少这种偏好可能带来的不利影响,可以选择增益率。
2. 定义
增益率公式如下:
G a i n R a t i o ( D , A ) = I G ( D , A ) I V ( A ) GainRatio(D, A) = \frac{IG(D, A)}{IV(A)} GainRatio(D,A)=IV(A)IG(D,A)
其中,属性 A A A 的固有值 I V ( A ) IV(A) IV(A) 定义为:
I V ( A ) = − ∑ i = 1 V ∣ D i ∣ ∣ D ∣ log 2 ∣ D i ∣ ∣ D ∣ IV(A) = - \sum_{i=1}^{V} \frac{|D_i|}{|D|} \log_2 \frac{|D_i|}{|D|} IV(A)=−i=1∑V∣D∣∣Di∣log2∣D∣∣Di∣
3. 例子
计算“收入”的信息增益率:
I V ( 收入 ) = − ( 3 10 log 2 3 10 + 4 10 log 2 4 10 + 3 10 log 2 3 10 ) = 1.556 IV(\text{收入}) = -(\frac{3}{10} \log_2 \frac{3}{10} + \frac{4}{10} \log_2 \frac{4}{10} + \frac{3}{10} \log_2 \frac{3}{10}) = 1.556 IV(收入)=−(103log2103+104log2104+103log2103)=1.556
G a i n R a t i o ( D , 收入 ) = 0.266 1.556 = 0.171 GainRatio(D, \text{收入}) = \frac{0.266}{1.556} = 0.171 GainRatio(D,收入)=1.5560.266=0.171
4. 注意点
增益率准则对可取值数目较少的属性有所偏好。因此,基于增益率的决策树建立方法是:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
五、决策树的另一划分标准——基尼指数(CART决策树)
1. 定义
(1) 基尼值
基尼值 G i n i ( D ) Gini(D) Gini(D) 反映了从数据集 D D D 中随机抽取两个样本,其类别标记不一致的概率,表示数据集整体的不确定性。
G i n i ( D ) = 1 − ∑ k = 1 N p k 2 Gini(D) = 1 - \sum_{k=1}^{N} p_k^2 Gini(D)=1−k=1∑Npk2
(2) 基尼指数
基尼指数表示经属性 a a a 分割后数据集 D D D 的不确定性。
G i n i I n d e x ( D , a ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ G i n i ( D i ) GiniIndex(D, a) = \sum_{i=1}^{n} \frac{|D_i|}{|D|} Gini(D_i) GiniIndex(D,a)=i=1∑n∣D∣∣Di∣Gini(Di)
2. 决策树建立方法(分类回归均可用)
- 分类:在候选属性集合中,选择那个划分后基尼指数最小的属性为最优划分属性。
- 回归:用平方误差最小化准则。
六、剪枝处理
1. 提出原因
决策树分支可能过多,导致过拟合。决策树越复杂,过拟合的程度会越高。因此,通过剪枝来降低过拟合的风险。
2. 剪枝与其处理基本策略
(1) 剪枝
剪枝是指将一颗子树的子节点全部删掉,根节点作为叶子节点。
(2) 基本策略
- 预剪枝:在决策树生成的过程中进行剪枝判断。
- 后剪枝:在生成决策树之后进行剪枝处理。
3. 预剪枝
(1) 做法
在决策树生成过程中,对每个节点进行是否剪枝判断。通过验证集提升验证集精度,不进行裁剪,否则进行裁剪,并将当前节点标记为叶子节点。
(2) 具体例子
以“学历”为例,选取第5个样本为验证集:
- 不划分时:验证集精度为50%
- 划分时:验证集精度为100%
因此需要划分,不剪枝。
(3) 优缺点
优点: 预剪枝降低了过拟合风险,减少训练和测试时间开销。
缺点: 有些分支的当前划分虽不能提升泛化能力,但后续划分可能提高性能。预剪枝可能导致欠拟合风险。
4. 后剪枝
(1) 做法
生成决策树后,自底向上地对决策节点进行剪枝判断。通过验证集提升验证集精度,对子树进行剪枝。
(2) 优缺点
优点: 后剪枝通常保留更多分支,泛化能力优于预剪枝。
缺点: 后剪枝训练时间开销较大。
5. 另一种剪枝方法
通过最小化决策树整体的损失函数来实现剪枝。损失函数为:
L ( T ) = ∑ t ∈ T ∣ t ∣ H t + α ∣ T ∣ L(T) = \sum_{t \in T} |t| H_t + \alpha |T| L(T)=t∈T∑∣t∣Ht+α∣T∣
其中, ∣ T ∣ |T| ∣T∣ 是树的叶结点个数, t t t 是树的叶结点, ∣ t ∣ |t| ∣t∣ 为叶结点上样本点数目, H t H_t Ht 为叶结点上的经验熵, α \alpha α 为控制参数。
七、连续与缺失值
1. 连续值处理
(1) 提出原因
连续属性的可取值数目较多,不能直接用于节点划分。
(2) 做法
使用连续属性离散化技术。最简单的方法是二分法。
(3) 二分法
提取划分节点的所有可能值,对这些值从小到大排序,选择最佳划分点。
2. 缺失值处理
(1) 提出原因
在样本获取过程中,可能会出现属性数据缺失。
(2) 做法
当缺失数据较少时,直接舍弃;当缺失数据较多时,修改信息增益公式进行处理。
八、多变量决策树
每个决策节点是一个线性分类器,多个属性组合成一组分类规则。这种决策树相对复杂,训练时间更长。
九、Python实现决策树
以下是使用 Python 和 scikit-learn 库实现决策树的示例代码:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import tree# 数据集导入
iris = load_iris()
features = iris.data # 属性特征
labels = iris.target # 分类标签# 训练集,测试集分类
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.3, random_state=1)# 创建决策树分类器
clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=3)
clf = clf.fit(train_features, train_labels) # 训练模型# 预测测试集的标签
test_labels_predict = clf.predict(test_features)# 将预测结果与实际结果进行对比
score = accuracy_score(test_labels, test_labels_predict)
print("CART分类树的准确率 %.4lf" % score)# 生成决策树可视化的dot文件
dot_data = tree.export_graphviz(clf, out_file='iris_tree.dot')
输出结果:
决策树的准确率 0.9556
生成的 iris_tree.dot
文件可以通过以下命令生成决策树图片:
dot -Tpng iris_tree.dot -o iris_tree.png
至此,我们已经成功地使用决策树进行了分类,并生成了可视化的决策树图像。希望这篇文章对你理解决策树有所帮助!