机器学习 - 决策树
1. 什么是决策树?
决策树是一种基础的分类与回归方法。顾名思义,它是一种树状结构的分类模型。
内部结点 (Internal Node): 代表对某个属性的“测试”(test)或“判断”。
分支 (Branch): 代表该测试的一种可能结果,即属性的某个取值。
叶结点 (Leaf Node): 代表一个“预测结果”或“类别标签”。
决策树示例:判断是否购买电脑
下面是一个经典的“是否购买电脑”决策树的例子(具体树结构未在PPT中完整画出,但概念清晰):
训练数据集(示例):
年龄 收入 学生 信用等级 是否买电脑 <=30 high no fair no <=30 high no excellent no 31…40 high no fair yes >40 medium no fair yes >40 low yes fair yes >40 low yes excellent no 31…40 low yes excellent yes <=30 medium no fair no <=30 low yes fair yes >40 medium yes fair yes <=30 medium yes excellent yes 31…40 medium no excellent yes 31…40 high yes fair yes >40 medium no excellent no
决策树的工作流程
学习过程 (建模阶段 - Tree Construction):
通过对训练样本的分析来确定“划分属性”(即内部结点所对应的属性)。
所有训练样本最初都位于根节点。
基于一定的指标(如信息增益、基尼系数等)选择最佳划分属性。
根据选择的属性,递归地划分训练样本到子节点。
剪枝 (Tree Pruning): 识别并删除可能由噪声或异常值导致的不太可靠的分支,以防止过拟合。
预测过程:
将测试示例从根结点开始。
沿着划分属性所构成的“判定测试序列”下行。
直到到达某个叶结点,该叶结点的预测结果即为测试示例的预测类别。
2. 决策树算法核心
基础算法思想 (贪心算法)
决策树的构建是一个递归过程,采用分治 (Divide and Conquer) 的思想,自顶向下进行。
属性类型: 属性应当是离散的。如果遇到连续型数据,需要先进行离散化处理。
开始: 所有训练样本都位于根节点。
属性选择: 基于某种统计学指标或启发式方法(如信息增益、基尼系数)来选择当前节点的最优划分属性。
划分: 根据选择的属性的不同取值,将当前节点的样本划分到新的子节点中。
递归: 对每个子节点重复步骤 3 和 4,直到满足停止条件。
停止划分的条件
递归过程在以下任一情况发生时停止,当前节点成为叶节点:
纯净节点: 当前节点内的所有样本都属于同一个类别。
无剩余属性: 所有的属性都已经被用于之前的划分,没有属性可以继续划分。此时,该叶子节点的类别通常由该节点中样本最多的类别(多数投票)决定。
无训练数据: 当前节点不包含任何样本(例如,某个属性值在父节点样本中不存在)。此时,类别通常由其父节点中样本最多的类别决定。
3. 决策树相关算法发展
CLS (Concept Learning System): 由 Hunt, Marin 和 Stone 于1966年研制,是早期的决策树学习系统。
ID3 (Iterative Dichotomiser 3): 由 Quinlan 于1979年提出,是决策树学习算法的典型,使用信息增益进行属性选择。
ID4, ID5: 对ID3的改进,支持增量式学习。
C4.5: Quinlan 于1993年对ID3的进一步发展,使用增益率克服ID3的缺点,能处理连续属性和缺失值,并进行剪枝。
CART (Classification and Regression Trees): 由 Breiman 等人于1984年提出,可用于分类和回归。CART树是二叉树,分类时使用基尼指数,回归时使用平方误差。
4. CLS (Concept Learning System) 算法
CLS是许多决策树算法的基础。
CLS基本思想
从一棵空决策树和包含所有训练样本的集合开始。
选择某一属性作为测试属性(决策节点)。
根据该属性的不同值,将训练样本分成相应的子集:
如果子集为空,或子集中的样本属于同一个类,则该子集对应的分支成为叶节点。
否则,该子集对应的节点为内部节点,需要为该子集选择一个新的测试属性进行递归划分。
重复此过程,直到所有子集都为空或属于同一类。
CLS算法的问题
CLS算法没有明确规定如何选择“最佳”测试属性。实践表明,测试属性的选择顺序对最终生成的决策树的结构和性能有显著影响。不同的属性选择顺序可能导致复杂度不同、泛化能力也不同的决策树。
示例:膳食结构与缺钙调查
(PPT中通过一个膳食结构的例子说明,选择不同属性(如“鸡肉”或“牛奶”)作为第一个划分属性,会得到完全不同的决策树。)
5. ID3 算法:基于信息增益
ID3算法主要解决了CLS中属性选择的问题,它使用信息增益 (Information Gain) 作为选择测试属性的标准。
信息论基础
熵 (Entropy):
熵是度量随机变量不确定性的指标。熵越大,不确定性越大。对于一个有 k k k 个可能取值的离散随机变量 X X X ,其概率分布为 P ( X = x i ) = p i P(X=x_i) = p_i P ( X = x i ) = p i ,则其熵定义为:
H ( X ) = − ∑ i = 1 k p i log 2 p i H(X) = - \sum_{i=1}^{k} p_i \log_2 p_i H ( X ) = − i = 1 ∑ k p i log 2 p i
其中,约定 0 log 2 0 = 0 0 \log_2 0 = 0 0 log 2 0 = 0 。
例如,抛一枚均匀硬币,正反面概率各为0.5,熵为:
H ( X ) = − ( 0.5 log 2 0.5 + 0.5 log 2 0.5 ) = 1 H(X) = - (0.5 \log_2 0.5 + 0.5 \log_2 0.5) = 1 H ( X ) = − ( 0.5 log 2 0.5 + 0.5 log 2 0.5 ) = 1 bit.
当 p = 0.5 p=0.5 p = 0.5 时,熵最大,不确定性最高。
条件熵 (Conditional Entropy):
给定随机变量 X X X 的情况下,随机变量 Y Y Y 的不确定性,记为 H ( Y ∣ X ) H(Y|X) H ( Y ∣ X ) :
H ( Y ∣ X ) = ∑ x ∈ X P ( x ) H ( Y ∣ X = x ) = − ∑ x ∈ X P ( x ) ∑ y ∈ Y P ( y ∣ x ) log 2 P ( y ∣ x ) H(Y|X) = \sum_{x \in X} P(x) H(Y|X=x) = - \sum_{x \in X} P(x) \sum_{y \in Y} P(y|x) \log_2 P(y|x) H ( Y ∣ X ) = x ∈ X ∑ P ( x ) H ( Y ∣ X = x ) = − x ∈ X ∑ P ( x ) y ∈ Y ∑ P ( y ∣ x ) log 2 P ( y ∣ x )
也可以表示为:
H ( Y ∣ X ) = − ∑ x ∈ X ∑ y ∈ Y P ( x , y ) log 2 P ( y ∣ x ) H(Y|X) = - \sum_{x \in X} \sum_{y \in Y} P(x,y) \log_2 P(y|x) H ( Y ∣ X ) = − x ∈ X ∑ y ∈ Y ∑ P ( x , y ) log 2 P ( y ∣ x )
联合熵 (Joint Entropy):
两个随机变量 X X X 和 Y Y Y 同时发生的不确定性:
H ( X , Y ) = − ∑ x ∈ X ∑ y ∈ Y P ( x , y ) log 2 P ( x , y ) H(X,Y) = - \sum_{x \in X} \sum_{y \in Y} P(x,y) \log_2 P(x,y) H ( X , Y ) = − x ∈ X ∑ y ∈ Y ∑ P ( x , y ) log 2 P ( x , y )
它们之间的关系: H ( X , Y ) = H ( X ) + H ( Y ∣ X ) = H ( Y ) + H ( X ∣ Y ) H(X,Y) = H(X) + H(Y|X) = H(Y) + H(X|Y) H ( X , Y ) = H ( X ) + H ( Y ∣ X ) = H ( Y ) + H ( X ∣ Y )
互信息 (Mutual Information) / 信息增益 (Information Gain):
互信息衡量了两个变量之间的相关度,或者说,知道一个变量后另一个变量不确定性减少的程度。在决策树中,我们关心的是知道一个属性 A A A 后,类别 C C C 的不确定性减少了多少。这就是信息增益:
Gain ( C , A ) = I ( C ; A ) = H ( C ) − H ( C ∣ A ) \text{Gain}(C, A) = I(C;A) = H(C) - H(C|A) Gain ( C , A ) = I ( C ; A ) = H ( C ) − H ( C ∣ A )
其中:
H ( C ) H(C) H ( C ) 是数据集 D D D 中类别 C C C 的熵(划分前)。
H ( C ∣ A ) H(C|A) H ( C ∣ A ) 是在已知属性 A A A 的条件下,数据集 D D D 中类别 C C C 的条件熵(划分后)。属性 A A A 有 v v v 个可能的取值 { a 1 , a 2 , . . . , a v } \{a_1, a_2, ..., a_v\} { a 1 , a 2 , ... , a v } ,它将数据集 D D D 划分为 v v v 个子集 D 1 , D 2 , . . . , D v D_1, D_2, ..., D_v D 1 , D 2 , ... , D v 。
H ( C ∣ A ) = ∑ j = 1 v ∣ D j ∣ ∣ D ∣ H ( C j ) H(C|A) = \sum_{j=1}^{v} \frac{|D_j|}{|D|} H(C_j) H ( C ∣ A ) = j = 1 ∑ v ∣ D ∣ ∣ D j ∣ H ( C j )
其中 H ( C j ) H(C_j) H ( C j ) 是子集 D j D_j D j 中类别 C C C 的熵。
ID3算法选择使得信息增益最大的属性作为划分属性。
信息增益计算示例:“是否买电脑”
数据集 D D D 包含14个样本,9个“yes”(买电脑),5个“no”(不买电脑)。
类别 C C C 的熵 H ( C ) H(C) H ( C ) (也记作 Info ( D ) \text{Info}(D) Info ( D ) ):
H ( C ) = − 9 14 log 2 ( 9 14 ) − 5 14 log 2 ( 5 14 ) ≈ 0.940 bits H(C) = -\frac{9}{14} \log_2\left(\frac{9}{14}\right) - \frac{5}{14} \log_2\left(\frac{5}{14}\right) \approx 0.940 \text{ bits} H ( C ) = − 14 9 log 2 ( 14 9 ) − 14 5 log 2 ( 14 5 ) ≈ 0.940 bits
以属性“年龄 (Age)”为例计算信息增益
“年龄”有三个取值:<=30 (5个样本: 2 yes, 3 no),31...40 (4个样本: 4 yes, 0 no),>40 (5个样本: 3 yes, 2 no)。
H ( C ∣ Age = ’<=30’ ) = − 2 5 log 2 2 5 − 3 5 log 2 3 5 ≈ 0.971 H(C | \text{Age} = \text{'<=30'}) = - \frac{2}{5}\log_2\frac{2}{5} - \frac{3}{5}\log_2\frac{3}{5} \approx 0.971 H ( C ∣ Age = ’<=30’ ) = − 5 2 log 2 5 2 − 5 3 log 2 5 3 ≈ 0.971
H ( C ∣ Age = ’31...40’ ) = − 4 4 log 2 4 4 − 0 4 log 2 0 4 = 0 H(C | \text{Age} = \text{'31...40'}) = - \frac{4}{4}\log_2\frac{4}{4} - \frac{0}{4}\log_2\frac{0}{4} = 0 H ( C ∣ Age = ’31...40’ ) = − 4 4 log 2 4 4 − 4 0 log 2 4 0 = 0
H ( C ∣ Age = ’>40’ ) = − 3 5 log 2 3 5 − 2 5 log 2 2 5 ≈ 0.971 H(C | \text{Age} = \text{'>40'}) = - \frac{3}{5}\log_2\frac{3}{5} - \frac{2}{5}\log_2\frac{2}{5} \approx 0.971 H ( C ∣ Age = ’>40’ ) = − 5 3 log 2 5 3 − 5 2 log 2 5 2 ≈ 0.971
条件熵 H ( C ∣ Age ) H(C|\text{Age}) H ( C ∣ Age ) :
H ( C ∣ Age ) = 5 14 H ( C ∣ Age = ’<=30’ ) + 4 14 H ( C ∣ Age = ’31...40’ ) + 5 14 H ( C ∣ Age = ’>40’ ) = 5 14 ( 0.971 ) + 4 14 ( 0 ) + 5 14 ( 0.971 ) ≈ 0.3468 + 0 + 0.3468 ≈ 0.694 bits \begin{aligned}
H(C|\text{Age}) &= \frac{5}{14} H(C | \text{Age} = \text{'<=30'}) + \frac{4}{14} H(C | \text{Age} = \text{'31...40'}) + \frac{5}{14} H(C | \text{Age} = \text{'>40'}) \\
&= \frac{5}{14}(0.971) + \frac{4}{14}(0) + \frac{5}{14}(0.971) \\
&\approx 0.3468 + 0 + 0.3468 \approx 0.694 \text{ bits}
\end{aligned} H ( C ∣ Age ) = 14 5 H ( C ∣ Age = ’<=30’ ) + 14 4 H ( C ∣ Age = ’31...40’ ) + 14 5 H ( C ∣ Age = ’>40’ ) = 14 5 ( 0.971 ) + 14 4 ( 0 ) + 14 5 ( 0.971 ) ≈ 0.3468 + 0 + 0.3468 ≈ 0.694 bits
信息增益 Gain ( C , Age ) \text{Gain}(C, \text{Age}) Gain ( C , Age ) :
Gain ( C , Age ) = H ( C ) − H ( C ∣ Age ) = 0.940 − 0.694 = 0.246 bits \text{Gain}(C, \text{Age}) = H(C) - H(C|\text{Age}) = 0.940 - 0.694 = 0.246 \text{ bits} Gain ( C , Age ) = H ( C ) − H ( C ∣ Age ) = 0.940 − 0.694 = 0.246 bits
类似地,可以计算其他属性的信息增益:
Gain ( C , 收入 ) ≈ 0.029 \text{Gain}(C, \text{收入}) \approx 0.029 Gain ( C , 收入 ) ≈ 0.029
Gain ( C , 学生? ) ≈ 0.151 \text{Gain}(C, \text{学生?}) \approx 0.151 Gain ( C , 学生 ? ) ≈ 0.151
Gain ( C , 信用等级? ) ≈ 0.048 \text{Gain}(C, \text{信用等级?}) \approx 0.048 Gain ( C , 信用等级 ? ) ≈ 0.048
由于“年龄”的信息增益最大 (0.246),ID3算法会选择“年龄”作为第一个划分属性(根节点)。
6. C4.5 算法:基于增益率
ID3算法有一个缺点:它倾向于选择具有较多取值的属性。因为取值越多的属性,越有可能将数据集划分为多个“纯”的子集,从而获得较高的信息增益。
C4.5算法通过使用增益率 (Gain Ratio) 来克服这个问题。增益率是对信息增益进行正则化。
分裂信息 (Split Information / Intrinsic Value):
属性 A A A 的分裂信息定义为:
SplitInfo A ( D ) = − ∑ j = 1 v ∣ D j ∣ ∣ D ∣ log 2 ( ∣ D j ∣ ∣ D ∣ ) \text{SplitInfo}_A(D) = - \sum_{j=1}^{v} \frac{|D_j|}{|D|} \log_2\left(\frac{|D_j|}{|D|}\right) SplitInfo A ( D ) = − j = 1 ∑ v ∣ D ∣ ∣ D j ∣ log 2 ( ∣ D ∣ ∣ D j ∣ )
其中 D j D_j D j 是属性 A A A 取第 j j j 个值时的样本子集,∣ D ∣ |D| ∣ D ∣ 是总样本数。
如果一个属性的取值很多,且每个取值对应的样本数很少,SplitInfo A ( D ) \text{SplitInfo}_A(D) SplitInfo A ( D ) 的值会比较大。
增益率 (Gain Ratio):
GainRatio ( D , A ) = Gain ( D , A ) SplitInfo A ( D ) \text{GainRatio}(D,A) = \frac{\text{Gain}(D,A)}{\text{SplitInfo}_A(D)} GainRatio ( D , A ) = SplitInfo A ( D ) Gain ( D , A )
C4.5选择具有最大增益率的属性进行划分。
"收入"属性的增益率
假设“收入”属性将14个样本分为:low (4个), medium (6个), high (4个)。
Gain ( C , 收入 ) ≈ 0.029 \text{Gain}(C, \text{收入}) \approx 0.029 Gain ( C , 收入 ) ≈ 0.029 (前面已算)
SplitInfo 收入 ( D ) = − ( 4 14 log 2 4 14 + 6 14 log 2 6 14 + 4 14 log 2 4 14 ) ≈ 1.557 \text{SplitInfo}_{\text{收入}}(D) = -\left( \frac{4}{14}\log_2\frac{4}{14} + \frac{6}{14}\log_2\frac{6}{14} + \frac{4}{14}\log_2\frac{4}{14} \right) \approx 1.557 SplitInfo 收入 ( D ) = − ( 14 4 log 2 14 4 + 14 6 log 2 14 6 + 14 4 log 2 14 4 ) ≈ 1.557
(PPT中给出的值为0.926,这里根据收入的3个取值重新计算,PPT中可能是用了另一个例子或计算方式,请以PPT为准或重新核对数据分布)
如果按照PPT中 SplitInfo 收入 ( D ) = 0.926 \text{SplitInfo}_{\text{收入}}(D) = 0.926 SplitInfo 收入 ( D ) = 0.926 :
GainRatio ( C , 收入 ) = 0.029 0.926 ≈ 0.031 \text{GainRatio}(C, \text{收入}) = \frac{0.029}{0.926} \approx 0.031 GainRatio ( C , 收入 ) = 0.926 0.029 ≈ 0.031
注意:C4.5通常会先计算所有属性的信息增益,然后只对那些信息增益高于平均值的属性计算增益率,以避免分裂信息很小(例如属性只有一个主要取值)导致增益率过大的问题。
7. CART 算法:基于基尼指数
CART (Classification and Regression Trees) 算法既可以用于分类也可以用于回归。CART生成的是二叉树。
基尼指数 (Gini Index) - 用于分类
基尼指数衡量了数据集 D D D 的不纯度。假设有 K K K 个类别,第 k k k 个类别的概率为 p k p_k p k ,则基尼指数定义为:
Gini ( D ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 \text{Gini}(D) = \sum_{k=1}^{K} p_k (1-p_k) = 1 - \sum_{k=1}^{K} p_k^2 Gini ( D ) = k = 1 ∑ K p k ( 1 − p k ) = 1 − k = 1 ∑ K p k 2
基尼指数越小,数据集的不纯度越低(越纯)。
对于给定的属性 A A A 的某个二元划分(将数据集 D D D 分为 D 1 D_1 D 1 和 D 2 D_2 D 2 ),划分后的基尼指数为:
Gini split ( D , A ) = ∣ D 1 ∣ ∣ D ∣ Gini ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ Gini ( D 2 ) \text{Gini}_{\text{split}}(D, A) = \frac{|D_1|}{|D|} \text{Gini}(D_1) + \frac{|D_2|}{|D|} \text{Gini}(D_2) Gini split ( D , A ) = ∣ D ∣ ∣ D 1 ∣ Gini ( D 1 ) + ∣ D ∣ ∣ D 2 ∣ Gini ( D 2 )
CART选择使得划分后基尼指数最小的属性及其划分点。
"是否买电脑"的基尼指数
数据集 D D D :9个“yes”,5个“no”。
Gini ( D ) = 1 − ( ( 9 14 ) 2 + ( 5 14 ) 2 ) = 1 − ( 0.413 + 0.128 ) = 1 − 0.541 = 0.459 \text{Gini}(D) = 1 - \left( \left(\frac{9}{14}\right)^2 + \left(\frac{5}{14}\right)^2 \right) = 1 - (0.413 + 0.128) = 1 - 0.541 = 0.459 Gini ( D ) = 1 − ( ( 14 9 ) 2 + ( 14 5 ) 2 ) = 1 − ( 0.413 + 0.128 ) = 1 − 0.541 = 0.459
以属性“收入”的二元划分为例:
假设将“收入”划分为 {low} 和 {medium, high}。
D 1 D_1 D 1 (收入=low): 4个样本 (1 yes, 3 no)
Gini ( D 1 ) = 1 − ( ( 1 4 ) 2 + ( 3 4 ) 2 ) = 1 − ( 0.0625 + 0.5625 ) = 1 − 0.625 = 0.375 \text{Gini}(D_1) = 1 - ( (\frac{1}{4})^2 + (\frac{3}{4})^2 ) = 1 - (0.0625 + 0.5625) = 1 - 0.625 = 0.375 Gini ( D 1 ) = 1 − (( 4 1 ) 2 + ( 4 3 ) 2 ) = 1 − ( 0.0625 + 0.5625 ) = 1 − 0.625 = 0.375
D 2 D_2 D 2 (收入=medium or high): 10个样本 (8 yes, 2 no) (PPT中是6 yes, 4 no,这里根据PPT的后续计算反推)
假设 D 2 D_2 D 2 : 6 yes, 4 no
Gini ( D 2 ) = 1 − ( ( 6 10 ) 2 + ( 4 10 ) 2 ) = 1 − ( 0.36 + 0.16 ) = 1 − 0.52 = 0.48 \text{Gini}(D_2) = 1 - ( (\frac{6}{10})^2 + (\frac{4}{10})^2 ) = 1 - (0.36 + 0.16) = 1 - 0.52 = 0.48 Gini ( D 2 ) = 1 − (( 10 6 ) 2 + ( 10 4 ) 2 ) = 1 − ( 0.36 + 0.16 ) = 1 − 0.52 = 0.48
Gini split ( D , 收入 { low } , { medium,high } ) = 4 14 Gini ( D 1 ) + 10 14 Gini ( D 2 ) \text{Gini}_{\text{split}}(D, \text{收入}_{\{\text{low}\}, \{\text{medium,high}\}}) = \frac{4}{14} \text{Gini}(D_1) + \frac{10}{14} \text{Gini}(D_2) Gini split ( D , 收入 { low } , { medium,high } ) = 14 4 Gini ( D 1 ) + 14 10 Gini ( D 2 )
= 4 14 ( 0.375 ) + 10 14 ( 0.48 ) ≈ 0.107 + 0.343 = 0.450 = \frac{4}{14}(0.375) + \frac{10}{14}(0.48) \approx 0.107 + 0.343 = 0.450 = 14 4 ( 0.375 ) + 14 10 ( 0.48 ) ≈ 0.107 + 0.343 = 0.450
(PPT中给出的值为0.450,但其 D 1 D_1 D 1 (收入=low) 和 D 2 D_2 D 2 (收入=medium or high) 的yes/no分布与表格不完全一致,这里按PPT的计算结果展示)
处理连续值属性 (ID3, C4.5, CART)
对于连续值属性 A A A :
将 A A A 的所有 N N N 个观测值进行排序: a 1 , a 2 , . . . , a N a_1, a_2, ..., a_N a 1 , a 2 , ... , a N 。
生成 N − 1 N-1 N − 1 个可能的候选分裂点。每个分裂点是相邻两个值的平均值: a i + a i + 1 2 \frac{a_i + a_{i+1}}{2} 2 a i + a i + 1 。
对每个候选分裂点,计算其信息增益、增益率或基尼指数。
选择最佳分裂点作为该连续属性的二元划分点。
CART 分类树生成算法
输入: 训练数据集 D D D ,停止计算条件。
输出: CART分类树。
从根节点开始,递归地对每个节点进行以下操作:
a. 设当前节点数据集为 D ′ D' D ′ 。对于 D ′ D' D ′ 中的每个特征 A A A 及其每个可能的二元切分点 a a a (对于离散属性,是 A = a A=a A = a vs A ≠ a A \neq a A = a ;对于连续属性,是 A ≤ a A \le a A ≤ a vs A > a A > a A > a ),将 D ′ D' D ′ 分为 D 1 ′ D'_1 D 1 ′ 和 D 2 ′ D'_2 D 2 ′ 。
b. 计算该切分的基尼指数 Gini split ( D ′ , A , a ) \text{Gini}_{\text{split}}(D', A, a) Gini split ( D ′ , A , a ) 。
c. 在所有特征 A A A 及所有可能的切分点 a a a 中,选择基尼指数最小的特征和切分点作为最优划分。
d. 根据最优划分,将数据集分配到两个子节点中。
e. 对两个子节点递归调用步骤 a-d,直到满足停止条件(如节点样本数小于阈值,或基尼指数小于阈值,或树达到最大深度等)。
生成CART树。
8. 从决策树中提取规则
决策树具有很好的可解释性,可以方便地转换为 IF-THEN 形式的规则:
从根节点到每个叶节点的每一条路径都对应一条规则。
路径上内部节点的属性测试构成了规则的 IF 部分(前提条件,通过 AND 连接)。
叶节点的类别是规则的 THEN 部分(结论)。
9. 回归树 (CART for Regression)
当目标变量 y y y 是连续值时,可以使用回归树。
回归树模型
假设输入空间被划分为 M M M 个单元(区域) R 1 , R 2 , . . . , R M R_1, R_2, ..., R_M R 1 , R 2 , ... , R M ,并且在每个单元 R m R_m R m 上有一个固定的输出值 c m c_m c m 。回归树可以表示为:
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x) = \sum_{m=1}^{M} c_m I(x \in R_m) f ( x ) = m = 1 ∑ M c m I ( x ∈ R m )
其中 I ( ⋅ ) I(\cdot) I ( ⋅ ) 是指示函数。
划分准则:平方误差最小化
我们使用平方误差 ∑ ( y i − f ( x i ) ) 2 \sum (y_i - f(x_i))^2 ∑ ( y i − f ( x i ) ) 2 来衡量预测误差。
对于一个固定的区域 R m R_m R m ,最优的 c m c_m c m 是该区域内所有样本 y i y_i y i 的均值:
c ^ m = ave ( y i ∣ x i ∈ R m ) \hat{c}_m = \text{ave}(y_i | x_i \in R_m) c ^ m = ave ( y i ∣ x i ∈ R m )
启发式划分方法:
选择第 j j j 个变量 x ( j ) x^{(j)} x ( j ) 和它取的值 s s s ,作为切分变量和切分点,定义两个区域:
R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } R_1(j,s) = \{ x | x^{(j)} \le s \} R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } 和 R 2 ( j , s ) = { x ∣ x ( j ) > s } R_2(j,s) = \{ x | x^{(j)} > s \} R 2 ( j , s ) = { x ∣ x ( j ) > s }
寻找最优的切分变量 j j j 和切分点 s s s ,使得下式最小:
min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min_{j,s} \left[ \min_{c_1} \sum_{x_i \in R_1(j,s)} (y_i - c_1)^2 + \min_{c_2} \sum_{x_i \in R_2(j,s)} (y_i - c_2)^2 \right] j , s min c 1 min x i ∈ R 1 ( j , s ) ∑ ( y i − c 1 ) 2 + c 2 min x i ∈ R 2 ( j , s ) ∑ ( y i − c 2 ) 2
其中 c 1 = ave ( y i ∣ x i ∈ R 1 ( j , s ) ) c_1 = \text{ave}(y_i | x_i \in R_1(j,s)) c 1 = ave ( y i ∣ x i ∈ R 1 ( j , s )) 和 c 2 = ave ( y i ∣ x i ∈ R 2 ( j , s ) ) c_2 = \text{ave}(y_i | x_i \in R_2(j,s)) c 2 = ave ( y i ∣ x i ∈ R 2 ( j , s )) 。
回归树生成算法 (最小二乘回归树)
输入: 训练数据集 D = { ( x 1 , y 1 ) , . . . , ( x N , y N ) } D = \{(x_1, y_1), ..., (x_N, y_N)\} D = {( x 1 , y 1 ) , ... , ( x N , y N )} 。
输出: 回归树 f ( x ) f(x) f ( x ) 。
递归地将每个区域划分为两个子区域并决定每个子区域上的输出值:
a. 选择最优切分变量 j j j 与切分点 s s s ,求解:
min j , s [ ∑ x i ∈ R 1 ( j , s ) ( y i − c ^ 1 ) 2 + ∑ x i ∈ R 2 ( j , s ) ( y i − c ^ 2 ) 2 ] \min_{j,s} \left[ \sum_{x_i \in R_1(j,s)} (y_i - \hat{c}_1)^2 + \sum_{x_i \in R_2(j,s)} (y_i - \hat{c}_2)^2 \right] j , s min x i ∈ R 1 ( j , s ) ∑ ( y i − c ^ 1 ) 2 + x i ∈ R 2 ( j , s ) ∑ ( y i − c ^ 2 ) 2
遍历所有变量 j j j ,对固定的 j j j 扫描所有可能的切分点 s s s ,找到使上式最小的 ( j , s ) (j,s) ( j , s ) 对。
b. 用选定的 ( j , s ) (j,s) ( j , s ) 对划分区域并决定相应的输出值:
R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } , R 2 ( j , s ) = { x ∣ x ( j ) > s } R_1(j,s) = \{x | x^{(j)} \le s\}, R_2(j,s) = \{x | x^{(j)} > s\} R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } , R 2 ( j , s ) = { x ∣ x ( j ) > s }
c ^ m = 1 N m ∑ x i ∈ R m ( j , s ) y i \hat{c}_m = \frac{1}{N_m} \sum_{x_i \in R_m(j,s)} y_i c ^ m = N m 1 ∑ x i ∈ R m ( j , s ) y i , for m = 1 , 2 m=1,2 m = 1 , 2
c. 继续对两个子区域调用步骤 a、b,直至满足停止条件(如节点样本数小于阈值,或区域内平方误差减小量小于阈值)。
d. 将输入空间划分为 M M M 个区域 R 1 , . . . , R M R_1, ..., R_M R 1 , ... , R M ,生成决策树:
f ( x ) = ∑ m = 1 M c ^ m I ( x ∈ R m ) f(x) = \sum_{m=1}^{M} \hat{c}_m I(x \in R_m) f ( x ) = m = 1 ∑ M c ^ m I ( x ∈ R m )
10. 模型评估
划分数据集: 通常将数据集划分为训练集、验证集(可选,用于调参和剪枝)和测试集。
交叉验证 (Cross-Validation): 例如,K K K -折交叉验证。
将数据集分成 K K K 个互不相交的子集(折)。
进行 K K K 次训练和测试:每次选择 K − 1 K-1 K − 1 个子集用于训练,剩下的1个子集用于测试。
最终性能是 K K K 次测试结果的平均值。
课后作业
答案(仅供参考)
总样本数 ∣ D ∣ = 5 |D| = 5 ∣ D ∣ = 5
活动“是”的样本数 = 3
活动“否”的样本数 = 2
计算整个数据集D的熵 (E n t r o p y ( D ) Entropy(D) E n t r o p y ( D ) )
E n t r o p y ( D ) = − ( P ( 是 ) ⋅ log 2 ( P ( 是 ) ) + P ( 否 ) ⋅ log 2 ( P ( 否 ) ) ) Entropy(D) = - \left( P(\text{是}) \cdot \log_2(P(\text{是})) + P(\text{否}) \cdot \log_2(P(\text{否})) \right) E n t r o p y ( D ) = − ( P ( 是 ) ⋅ log 2 ( P ( 是 )) + P ( 否 ) ⋅ log 2 ( P ( 否 )) )
P ( 是 ) = 3 5 P(\text{是}) = \frac{3}{5} P ( 是 ) = 5 3
P ( 否 ) = 2 5 P(\text{否}) = \frac{2}{5} P ( 否 ) = 5 2
E n t r o p y ( D ) = − ( 3 5 ⋅ log 2 ( 3 5 ) + 2 5 ⋅ log 2 ( 2 5 ) ) Entropy(D) = - \left( \frac{3}{5} \cdot \log_2\left(\frac{3}{5}\right) + \frac{2}{5} \cdot \log_2\left(\frac{2}{5}\right) \right) E n t r o p y ( D ) = − ( 5 3 ⋅ log 2 ( 5 3 ) + 5 2 ⋅ log 2 ( 5 2 ) )
E n t r o p y ( D ) = − ( 0.6 ⋅ ( − 0.736965594 ) + 0.4 ⋅ ( − 1.321928095 ) ) Entropy(D) = - \left( 0.6 \cdot (-0.736965594) + 0.4 \cdot (-1.321928095) \right) E n t r o p y ( D ) = − ( 0.6 ⋅ ( − 0.736965594 ) + 0.4 ⋅ ( − 1.321928095 ) )
E n t r o p y ( D ) = − ( − 0.4421793564 − 0.528771238 ) Entropy(D) = - \left( -0.4421793564 - 0.528771238 \right) E n t r o p y ( D ) = − ( − 0.4421793564 − 0.528771238 )
E n t r o p y ( D ) = − ( − 0.9709505944 ) Entropy(D) = - ( -0.9709505944 ) E n t r o p y ( D ) = − ( − 0.9709505944 )
E n t r o p y ( D ) ≈ 0.971 Entropy(D) \approx 0.971 E n t r o p y ( D ) ≈ 0.971
计算属性“天气”的信息增益 (G a i n ( D , 天气 ) Gain(D, \text{天气}) G ain ( D , 天气 ) )
属性“天气”有三个取值:晴、多云、雨。
天气 = 晴 (D 晴 D_{\text{晴}} D 晴 ) : 2个样本 (否, 否)
P ( 是 ) = 0 2 = 0 P(\text{是}) = \frac{0}{2} = 0 P ( 是 ) = 2 0 = 0
P ( 否 ) = 2 2 = 1 P(\text{否}) = \frac{2}{2} = 1 P ( 否 ) = 2 2 = 1
E n t r o p y ( D 晴 ) = − ( 0 ⋅ log 2 ( 0 ) + 1 ⋅ log 2 ( 1 ) ) = 0 Entropy(D_{\text{晴}}) = - \left( 0 \cdot \log_2(0) + 1 \cdot \log_2(1) \right) = 0 E n t r o p y ( D 晴 ) = − ( 0 ⋅ log 2 ( 0 ) + 1 ⋅ log 2 ( 1 ) ) = 0 (约定 0 ⋅ log 2 ( 0 ) = 0 0 \cdot \log_2(0) = 0 0 ⋅ log 2 ( 0 ) = 0 )
天气 = 多云 (D 多云 D_{\text{多云}} D 多云 ) : 1个样本 (是)
P ( 是 ) = 1 1 = 1 P(\text{是}) = \frac{1}{1} = 1 P ( 是 ) = 1 1 = 1
P ( 否 ) = 0 1 = 0 P(\text{否}) = \frac{0}{1} = 0 P ( 否 ) = 1 0 = 0
E n t r o p y ( D 多云 ) = − ( 1 ⋅ log 2 ( 1 ) + 0 ⋅ log 2 ( 0 ) ) = 0 Entropy(D_{\text{多云}}) = - \left( 1 \cdot \log_2(1) + 0 \cdot \log_2(0) \right) = 0 E n t r o p y ( D 多云 ) = − ( 1 ⋅ log 2 ( 1 ) + 0 ⋅ log 2 ( 0 ) ) = 0
天气 = 雨 (D 雨 D_{\text{雨}} D 雨 ) : 2个样本 (是, 是)
P ( 是 ) = 2 2 = 1 P(\text{是}) = \frac{2}{2} = 1 P ( 是 ) = 2 2 = 1
P ( 否 ) = 0 2 = 0 P(\text{否}) = \frac{0}{2} = 0 P ( 否 ) = 2 0 = 0
E n t r o p y ( D 雨 ) = − ( 1 ⋅ log 2 ( 1 ) + 0 ⋅ log 2 ( 0 ) ) = 0 Entropy(D_{\text{雨}}) = - \left( 1 \cdot \log_2(1) + 0 \cdot \log_2(0) \right) = 0 E n t r o p y ( D 雨 ) = − ( 1 ⋅ log 2 ( 1 ) + 0 ⋅ log 2 ( 0 ) ) = 0
计算按“天气”划分后的条件熵:
E n t r o p y ( D ∣ 天气 ) = ∣ D 晴 ∣ ∣ D ∣ ⋅ E n t r o p y ( D 晴 ) + ∣ D 多云 ∣ ∣ D ∣ ⋅ E n t r o p y ( D 多云 ) + ∣ D 雨 ∣ ∣ D ∣ ⋅ E n t r o p y ( D 雨 ) Entropy(D|\text{天气}) = \frac{|D_{\text{晴}}|}{|D|} \cdot Entropy(D_{\text{晴}}) + \frac{|D_{\text{多云}}|}{|D|} \cdot Entropy(D_{\text{多云}}) + \frac{|D_{\text{雨}}|}{|D|} \cdot Entropy(D_{\text{雨}}) E n t r o p y ( D ∣ 天气 ) = ∣ D ∣ ∣ D 晴 ∣ ⋅ E n t r o p y ( D 晴 ) + ∣ D ∣ ∣ D 多云 ∣ ⋅ E n t r o p y ( D 多云 ) + ∣ D ∣ ∣ D 雨 ∣ ⋅ E n t r o p y ( D 雨 )
E n t r o p y ( D ∣ 天气 ) = 2 5 ⋅ 0 + 1 5 ⋅ 0 + 2 5 ⋅ 0 Entropy(D|\text{天气}) = \frac{2}{5} \cdot 0 + \frac{1}{5} \cdot 0 + \frac{2}{5} \cdot 0 E n t r o p y ( D ∣ 天气 ) = 5 2 ⋅ 0 + 5 1 ⋅ 0 + 5 2 ⋅ 0
E n t r o p y ( D ∣ 天气 ) = 0 Entropy(D|\text{天气}) = 0 E n t r o p y ( D ∣ 天气 ) = 0
信息增益 G a i n ( D , 天气 ) Gain(D, \text{天气}) G ain ( D , 天气 ) :
G a i n ( D , 天气 ) = E n t r o p y ( D ) − E n t r o p y ( D ∣ 天气 ) Gain(D, \text{天气}) = Entropy(D) - Entropy(D|\text{天气}) G ain ( D , 天气 ) = E n t r o p y ( D ) − E n t r o p y ( D ∣ 天气 )
G a i n ( D , 天气 ) = 0.971 − 0 Gain(D, \text{天气}) = 0.971 - 0 G ain ( D , 天气 ) = 0.971 − 0
G a i n ( D , 天气 ) = 0.971 Gain(D, \text{天气}) = 0.971 G ain ( D , 天气 ) = 0.971
计算属性“湿度”的信息增益 (G a i n ( D , 湿度 ) Gain(D, \text{湿度}) G ain ( D , 湿度 ) )
属性“湿度”有两个取值:高、中。
湿度 = 高 (D 高 D_{\text{高}} D 高 ) : 3个样本 (否, 否, 是)
P ( 是 ) = 1 3 P(\text{是}) = \frac{1}{3} P ( 是 ) = 3 1
P ( 否 ) = 2 3 P(\text{否}) = \frac{2}{3} P ( 否 ) = 3 2
E n t r o p y ( D 高 ) = − ( 1 3 ⋅ log 2 ( 1 3 ) + 2 3 ⋅ log 2 ( 2 3 ) ) Entropy(D_{\text{高}}) = - \left( \frac{1}{3} \cdot \log_2\left(\frac{1}{3}\right) + \frac{2}{3} \cdot \log_2\left(\frac{2}{3}\right) \right) E n t r o p y ( D 高 ) = − ( 3 1 ⋅ log 2 ( 3 1 ) + 3 2 ⋅ log 2 ( 3 2 ) )
E n t r o p y ( D 高 ) = − ( 1 3 ⋅ ( − 1.584962501 ) + 2 3 ⋅ ( − 0.584962501 ) ) Entropy(D_{\text{高}}) = - \left( \frac{1}{3} \cdot (-1.584962501) + \frac{2}{3} \cdot (-0.584962501) \right) E n t r o p y ( D 高 ) = − ( 3 1 ⋅ ( − 1.584962501 ) + 3 2 ⋅ ( − 0.584962501 ) )
E n t r o p y ( D 高 ) = − ( − 0.5283208337 − 0.3899750007 ) Entropy(D_{\text{高}}) = - \left( -0.5283208337 - 0.3899750007 \right) E n t r o p y ( D 高 ) = − ( − 0.5283208337 − 0.3899750007 )
E n t r o p y ( D 高 ) = − ( − 0.9182958344 ) Entropy(D_{\text{高}}) = - ( -0.9182958344 ) E n t r o p y ( D 高 ) = − ( − 0.9182958344 )
E n t r o p y ( D 高 ) ≈ 0.918 Entropy(D_{\text{高}}) \approx 0.918 E n t r o p y ( D 高 ) ≈ 0.918
湿度 = 中 (D 中 D_{\text{中}} D 中 ) : 2个样本 (是, 是)
P ( 是 ) = 2 2 = 1 P(\text{是}) = \frac{2}{2} = 1 P ( 是 ) = 2 2 = 1
P ( 否 ) = 0 2 = 0 P(\text{否}) = \frac{0}{2} = 0 P ( 否 ) = 2 0 = 0
E n t r o p y ( D 中 ) = − ( 1 ⋅ log 2 ( 1 ) + 0 ⋅ log 2 ( 0 ) ) = 0 Entropy(D_{\text{中}}) = - \left( 1 \cdot \log_2(1) + 0 \cdot \log_2(0) \right) = 0 E n t r o p y ( D 中 ) = − ( 1 ⋅ log 2 ( 1 ) + 0 ⋅ log 2 ( 0 ) ) = 0
计算按“湿度”划分后的条件熵:
E n t r o p y ( D ∣ 湿度 ) = ∣ D 高 ∣ ∣ D ∣ ⋅ E n t r o p y ( D 高 ) + ∣ D 中 ∣ ∣ D ∣ ⋅ E n t r o p y ( D 中 ) Entropy(D|\text{湿度}) = \frac{|D_{\text{高}}|}{|D|} \cdot Entropy(D_{\text{高}}) + \frac{|D_{\text{中}}|}{|D|} \cdot Entropy(D_{\text{中}}) E n t r o p y ( D ∣ 湿度 ) = ∣ D ∣ ∣ D 高 ∣ ⋅ E n t r o p y ( D 高 ) + ∣ D ∣ ∣ D 中 ∣ ⋅ E n t r o p y ( D 中 )
E n t r o p y ( D ∣ 湿度 ) = 3 5 ⋅ 0.918 + 2 5 ⋅ 0 Entropy(D|\text{湿度}) = \frac{3}{5} \cdot 0.918 + \frac{2}{5} \cdot 0 E n t r o p y ( D ∣ 湿度 ) = 5 3 ⋅ 0.918 + 5 2 ⋅ 0
E n t r o p y ( D ∣ 湿度 ) = 0.6 ⋅ 0.918 + 0 Entropy(D|\text{湿度}) = 0.6 \cdot 0.918 + 0 E n t r o p y ( D ∣ 湿度 ) = 0.6 ⋅ 0.918 + 0
E n t r o p y ( D ∣ 湿度 ) ≈ 0.551 Entropy(D|\text{湿度}) \approx 0.551 E n t r o p y ( D ∣ 湿度 ) ≈ 0.551
信息增益 G a i n ( D , 湿度 ) Gain(D, \text{湿度}) G ain ( D , 湿度 ) :
G a i n ( D , 湿度 ) = E n t r o p y ( D ) − E n t r o p y ( D ∣ 湿度 ) Gain(D, \text{湿度}) = Entropy(D) - Entropy(D|\text{湿度}) G ain ( D , 湿度 ) = E n t r o p y ( D ) − E n t r o p y ( D ∣ 湿度 )
G a i n ( D , 湿度 ) = 0.971 − 0.551 Gain(D, \text{湿度}) = 0.971 - 0.551 G ain ( D , 湿度 ) = 0.971 − 0.551
G a i n ( D , 湿度 ) = 0.420 Gain(D, \text{湿度}) = 0.420 G ain ( D , 湿度 ) = 0.420
比较两个属性的信息增益:
G a i n ( D , 天气 ) = 0.971 Gain(D, \text{天气}) = 0.971 G ain ( D , 天气 ) = 0.971
G a i n ( D , 湿度 ) = 0.420 Gain(D, \text{湿度}) = 0.420 G ain ( D , 湿度 ) = 0.420
由于 G a i n ( D , 天气 ) > G a i n ( D , 湿度 ) Gain(D, \text{天气}) > Gain(D, \text{湿度}) G ain ( D , 天气 ) > G ain ( D , 湿度 ) ,属性“天气”的信息增益更大。因此,根据ID3算法,属性“天气”更适合作为根节点 。