[CART决策树]如何划分连续型特征

199 阅读4分钟

CART(分类与回归树)在处理连续型特征时,通过动态二分法将连续值转换为二元分裂条件(如“特征 ≤ 阈值”和“特征 > 阈值”),选择使子节点纯度(基尼指数或均方误差)最优的分割点。

以下是详细流程:


1. 核心步骤

步骤1:排序特征值

对连续型特征的所有样本值进行升序排序
示例:特征“年龄”的原始值为 [22, 45, 18, 30, 35, 25],排序后为 [18, 22, 25, 30, 35, 45]

步骤2:生成候选分割点

遍历排序后的相邻样本,若它们的目标变量不同,则取中间值作为候选分割点。
规则

  • 候选分割点集合为 (a_i + a_{i+1}) / 2,其中 a_ia_{i+1} 是相邻且目标label不同的样本值。
  • 若相邻样本目标相同,跳过该分割点(无法提升纯度)。

示例
假设排序后的“年龄”和目标变量为:

年龄182225303545
购买

候选分割点为:

  • 18和22之间:目标均为“否”,跳过。
  • 22和25之间:目标从“否”变为“是” → 候选点为 (22+25)/2 = 23.5
  • 25和30之间:目标均为“是”,跳过。
  • 30和35之间:目标均为“是”,跳过。
  • 35和45之间:目标从“是”变为“否” → 候选点为 (35+45)/2 = 40
    最终候选分割点:23.540
步骤3:计算分裂指标

对每个候选分割点,计算分裂后的子节点不纯度(分类任务用基尼指数,回归任务用均方误差),选择不纯度最小的分割点。

分类任务(基尼指数)

  • 计算分割后左、右子节点的基尼指数,按样本量加权求和。

  • 基尼指数公式

    Gini(D)=1−∑i=1Cpi2Gini(D)=1−i=1∑C​pi2​

    分裂后的总基尼指数

    Ginisplit=NleftNGini(Dleft)+NrightNGini(Dright)Ginisplit​=NNleft​​Gini(Dleft​)+NNright​​Gini(Dright​)

示例(分割点23.5)

  • 左子节点:年龄 ≤23.5 → 样本为[18,22],目标均为“否”。

    Ginileft=1−(2/2)2=0Ginileft​=1−(2/2)2=0

  • 右子节点:年龄 >23.5 → 样本为[25,30,35,45],目标为[是, 是, 是, 否]。

    Giniright=1−(3/4)2−(1/4)2=1−0.5625−0.0625=0.375Giniright​=1−(3/4)2−(1/4)2=1−0.5625−0.0625=0.375

  • 总基尼指数:

    Ginisplit=26×0+46×0.375=0.25Ginisplit​=62​×0+64​×0.375=0.25

回归任务(均方误差)

  • 计算左右子节点样本的均值 y^lefty^​left​ 和 y^righty^​right​。

  • 总均方误差为左右子节点误差之和:

    MSE=∑i∈left(yi−y^left)2+∑i∈right(yi−y^right)2MSE=i∈left∑​(yi​−y^​left​)2+i∈right∑​(yi​−y^​right​)2

步骤4:选择最优分割点

遍历所有候选分割点,选择使总不纯度最小的点作为最终分裂阈值。
示例结果

  • 分割点23.5的基尼指数为0.25。
  • 分割点40的基尼指数计算类似,假设为0.3。
    则选择分割点23.5作为最佳划分。

2. 优化策略

(1) 加速计算
  • 预排序:对每个连续特征仅排序一次,后续递归划分时直接复用。
  • 增量更新:在排序后的特征值上遍历时,动态维护左右子节点的统计量(如类别分布或均值),减少重复计算。
(2) 处理大量候选点
  • 分桶法(Binning) :将连续值离散化为有限区间(如等频分桶),减少候选点数量。
  • 随机采样:随机选择部分候选点进行评估,牺牲少量精度以提升速度(用于大规模数据)。

3. 示例完整流程

数据集

年龄购买
18
22
25
30
35
45

步骤

  1. 按年龄排序并标记目标变量:[18(否), 22(否), 25(是), 30(是), 35(是), 45(否)]

  2. 生成候选分割点:23.5(22和25之间)、40(35和45之间)。

  3. 计算各分割点的基尼指数:

    • 分割点23.5:基尼指数=0.25。

    • 分割点40:

      • 左子节点(年龄 ≤40):样本为[18,22,25,30,35],目标为[否, 否, 是, 是, 是]。

        Ginileft=1−(3/5)2−(2/5)2=0.48Ginileft​=1−(3/5)2−(2/5)2=0.48

      • 右子节点(年龄 >40):样本为[45],目标为[否]。

        Giniright=0Giniright​=0

      • 总基尼指数:

        Ginisplit=56×0.48+16×0=0.4Ginisplit​=65​×0.48+61​×0=0.4

  4. 最优分割点为23.5,分裂条件为“年龄 ≤23.5”。


4. 对比其他算法

算法连续特征处理方式树结构
CART动态二分法(基尼指数/均方误差)二叉树
C4.5动态二分法(信息增益率)多叉树
ID3不支持连续特征(需人工离散化)多叉树
随机森林同CART(继承其分裂方式)多棵二叉树

总结

CART通过以下步骤处理连续型特征:

  1. 排序特征值,生成候选分割点(相邻不同类样本的中点), 只排序一次, 找到所有的候选分裂点
  2. 遍历所有候选点,计算分裂后的不纯度(基尼指数或均方误差)。
  3. 选择不纯度最小的分割点,将连续特征转换为二元条件(如“特征 ≤ 阈值”)。
    该方法高效且灵活,既适用于分类任务,也适用于回归任务,是CART算法的核心优势之一。