共计 2093 个字符,预计需要花费 6 分钟才能阅读完成。
理论基石
决策树的核心是分裂准则,CART(Classification and Regression Trees)使用基尼不纯度(Gini Impurity)或最小二乘误差(MSE)作为分裂标准。

基尼系数公式推导
对于分类问题,基尼系数衡量数据集的不纯度,定义为:
$$ Gini(D) = 1 – \sum_{k=1}^{K} (p_k)^2 $$
其中 $p_k$ 是第 $k$ 类样本在数据集 $D$ 中的比例。分裂后的加权基尼系数为:
$$ Gini_{split}(D) = \sum_{j=1}^{m} \frac{|D_j|}{|D|} Gini(D_j) $$
分裂的目标是最小化 $Gini_{split}(D)$。
回归树方差计算
对于回归问题,CART 使用最小二乘准则,即最小化分裂后的加权方差:
$$ \sum_{j=1}^{m} \frac{|D_j|}{|D|} Var(D_j) $$
与 ID3/C4.5 的差异
- ID3:使用信息增益(Information Gain),倾向于选择取值多的特征。
- C4.5:使用信息增益比(Gain Ratio),解决了 ID3 的偏置问题。
- CART:使用基尼系数或 MSE,支持回归任务,且生成二叉树。
工程痛点
计算效率瓶颈
在高维数据场景下,特征选择和分裂点计算可能成为性能瓶颈。例如,对于 $d$ 维特征和 $n$ 个样本,计算复杂度为 $O(d \times n \log n)$。
过拟合问题
决策树容易过拟合,表现为训练集准确率高但测试集准确率低。通过绘制学习曲线可以直观观察:
- 训练误差随树深度增加而持续下降。
- 测试误差先下降后上升,表明模型开始过拟合。
代码实战
节点分裂逻辑
import numpy as np
def find_best_split(X, y):
best_gini = float('inf')
best_feature, best_threshold = None, None
for feature in range(X.shape[1]):
thresholds = np.unique(X[:, feature])
for threshold in thresholds:
left_mask = X[:, feature] <= threshold
gini_left = gini_impurity(y[left_mask])
gini_right = gini_impurity(y[~left_mask])
weighted_gini = (len(y[left_mask]) * gini_left + len(y[~left_mask]) * gini_right) / len(y)
if weighted_gini < best_gini:
best_gini = weighted_gini
best_feature = feature
best_threshold = threshold
return best_feature, best_threshold
CCP 后剪枝实现
def prune_tree(node, X_val, y_val, alpha):
if node.is_leaf:
return node
node.left = prune_tree(node.left, X_val, y_val, alpha)
node.right = prune_tree(node.right, X_val, y_val, alpha)
if not node.left.is_leaf or not node.right.is_leaf:
return node
# 计算剪枝前后的误差
error_before = calculate_error(node, X_val, y_val)
merged_error = calculate_error(node.as_leaf(), X_val, y_val)
if merged_error + alpha <= error_before:
return node.as_leaf()
else:
return node
生产建议
类别不平衡处理
对于类别不平衡数据,可以调整基尼系数计算,引入类别权重 $w_k$:
$$ WeightedGini(D) = 1 – \sum_{k=1}^{K} w_k (p_k)^2 $$
分布式计算
在分布式环境下,可以将特征分配到不同节点并行计算分裂点:
- 每个节点计算局部最优分裂点。
- 汇总所有节点的结果,选择全局最优分裂点。
模型解释性
通过特征重要性评估模型的解释性,计算方法为:
$$ Importance(feature) = \sum_{nodes \ split \ on \ feature} \Delta Gini \times \frac{samples \ in \ node}{total \ samples} $$
验证体系
交叉验证指标
- F1 Score:平衡精确率和召回率。
- ROC-AUC:评估模型在不同阈值下的性能。
剪枝策略对比
- 预剪枝 :通过限制树深度或叶子节点最小样本数防止过拟合,但可能欠拟合。
- 后剪枝 :先生成完整树再剪枝,通常泛化能力更好。
避坑指南
⚠️ 常见错误 :
- 忽略类别不平衡,导致模型偏向多数类。
- 未做特征缩放,影响分裂点选择。
- 过早停止训练,导致欠拟合。
开放性问题
如何处理连续特征与离散特征的混合分裂场景?这是实际应用中常见的挑战,需要设计统一的分裂准则和处理逻辑。
