CART(分类与回归树)在处理连续型特征时,通过动态二分法将连续值转换为二元分裂条件(如“特征 ≤ 阈值”和“特征 > 阈值”),选择使子节点纯度(基尼指数或均方误差)最优的分割点。
以下是详细流程:
1. 核心步骤
步骤1:排序特征值
对连续型特征的所有样本值进行升序排序。
示例:特征“年龄”的原始值为 [22, 45, 18, 30, 35, 25],排序后为 [18, 22, 25, 30, 35, 45]。
步骤2:生成候选分割点
遍历排序后的相邻样本,若它们的目标变量不同,则取中间值作为候选分割点。
规则:
- 候选分割点集合为
(a_i + a_{i+1}) / 2,其中a_i和a_{i+1}是相邻且目标label不同的样本值。 - 若相邻样本目标相同,跳过该分割点(无法提升纯度)。
示例:
假设排序后的“年龄”和目标变量为:
| 年龄 | 18 | 22 | 25 | 30 | 35 | 45 |
|---|---|---|---|---|---|---|
| 购买 | 否 | 否 | 是 | 是 | 是 | 否 |
候选分割点为:
- 18和22之间:目标均为“否”,跳过。
- 22和25之间:目标从“否”变为“是” → 候选点为
(22+25)/2 = 23.5。 - 25和30之间:目标均为“是”,跳过。
- 30和35之间:目标均为“是”,跳过。
- 35和45之间:目标从“是”变为“否” → 候选点为
(35+45)/2 = 40。
最终候选分割点:23.5和40。
步骤3:计算分裂指标
对每个候选分割点,计算分裂后的子节点不纯度(分类任务用基尼指数,回归任务用均方误差),选择不纯度最小的分割点。
分类任务(基尼指数) :
-
计算分割后左、右子节点的基尼指数,按样本量加权求和。
-
基尼指数公式:
Gini(D)=1−∑i=1Cpi2Gini(D)=1−i=1∑Cpi2
分裂后的总基尼指数:
Ginisplit=NleftNGini(Dleft)+NrightNGini(Dright)Ginisplit=NNleftGini(Dleft)+NNrightGini(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 | 否 |
步骤:
-
按年龄排序并标记目标变量:
[18(否), 22(否), 25(是), 30(是), 35(是), 45(否)]。 -
生成候选分割点:23.5(22和25之间)、40(35和45之间)。
-
计算各分割点的基尼指数:
-
分割点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
-
-
-
最优分割点为23.5,分裂条件为“年龄 ≤23.5”。
4. 对比其他算法
| 算法 | 连续特征处理方式 | 树结构 |
|---|---|---|
| CART | 动态二分法(基尼指数/均方误差) | 二叉树 |
| C4.5 | 动态二分法(信息增益率) | 多叉树 |
| ID3 | 不支持连续特征(需人工离散化) | 多叉树 |
| 随机森林 | 同CART(继承其分裂方式) | 多棵二叉树 |
总结
CART通过以下步骤处理连续型特征:
- 排序特征值,生成候选分割点(相邻不同类样本的中点), 只排序一次, 找到所有的候选分裂点
- 遍历所有候选点,计算分裂后的不纯度(基尼指数或均方误差)。
- 选择不纯度最小的分割点,将连续特征转换为二元条件(如“特征 ≤ 阈值”)。
该方法高效且灵活,既适用于分类任务,也适用于回归任务,是CART算法的核心优势之一。