共计 2106 个字符,预计需要花费 6 分钟才能阅读完成。
错误案例引发的思考
最近团队实习生用决策树预测用户流失时,发现模型总把 注册天数 作为首要分裂特征,但业务上明明 最近登录频率 更重要。检查代码发现误用了 criterion='mse' 参数——这是典型的分类任务错用回归指标案例。另一个电商场景中,同事用基尼指数处理高度不平衡的欺诈检测数据,结果少数类完全被忽略。这些教训说明:特征选择指标是决策树的灵魂。

三大指标数学原理
1. 信息增益(Information Gain)
核心思想是选择使信息熵减少最多的特征。公式为:
$$IG(D_p,f) = I(D_p) – \sum_{j=1}^m \frac{N_j}{N_p}I(D_j)$$
其中 $I(D)$ 是数据集 $D$ 的熵:
$$I(D) = -\sum_{i=1}^c p(i|D)\log_2 p(i|D)$$
- 优势:直观反映特征消除不确定性的能力
- 缺陷:偏向取值多的特征(如用户 ID)
2. 增益率(Gain Ratio)
为解决信息增益偏置问题,引入分裂信息量:
$$GR(D_p,f) = \frac{IG(D_p,f)}{SI(D_p,f)}$$
$$SI(D_p,f) = -\sum_{j=1}^m \frac{N_j}{N_p}\log_2 \frac{N_j}{N_p}$$
- 适用场景:特征取值差异大的情况
- 注意:当 $SI(D_p,f)$ 接近 0 时需做平滑处理
3. 基尼指数(Gini Index)
CART 树的默认指标,计算纯度:
$$Gini(D) = 1-\sum_{i=1}^c p(i|D)^2$$
特征分裂后的基尼增益:
$$\Delta Gini(f) = Gini(D_p) – \sum_{j=1}^m \frac{N_j}{N_p}Gini(D_j)$$
- 特点:计算速度比熵快,对类别不平衡更敏感
均方误差的适用边界
回归场景的正确用法
MSE 衡量预测值与真实值的平方误差:
$$MSE = \frac{1}{n}\sum_{i=1}^n(y_i-\hat{y_i})^2$$
在回归树中,分裂标准是最小化 MSE。Scikit-learn 实现:
from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor(criterion='mse') # 默认参数
分类场景的数学矛盾
假设二分类问题,真实概率 $p$, 预测概率 $q$,则:
$$MSE = (1-q)^2p + q^2(1-p)$$
求导得最优预测:
$$q^* = p$$
看似合理,但实际分裂时:
1. 决策树终端节点输出类标签而非概率
2. MSE 对概率误差呈 U 型曲线(如下图),导致分裂倾向保守
代码对比实验
错误用法示例
# 分类任务错误使用 MSE
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
data = load_breast_cancer()
X, y = data.data, data.target
# 错误模型
clf_wrong = DecisionTreeClassifier(criterion='mse', random_state=42)
clf_wrong.fit(X, y)
print("MSE 分类准确率:", clf_wrong.score(X, y)) # 通常低于 90%
正确用法示例
# 使用基尼指数的正确做法
clf_right = DecisionTreeClassifier(criterion='gini', random_state=42)
clf_right.fit(X, y)
print("基尼指数准确率:", clf_right.score(X, y)) # 通常 >95%
# 特征重要性可视化
import matplotlib.pyplot as plt
import seaborn as sns
ft_importances = pd.Series(clf_right.feature_importances_,
index=data.feature_names)
plt.figure(figsize=(10,6))
sns.barplot(x=ft_importances.nlargest(10).values,
y=ft_importances.nlargest(10).index)
plt.title('Top 10 Important Features (Gini Index)')
plt.show()
生产环境避坑指南
- 问题:类别不平衡时基尼指数失效
- 现象:少数类样本被完全忽略
-
解法:改用信息增益或设置 class_weight 参数
-
问题:高基数特征主导信息增益
- 现象:像用户 ID 这类特征被优先选择
-
解法:使用增益率或先做特征编码
-
问题:MSE 用于多分类任务
- 现象:模型倾向于预测中间值类别
- 解法:强制使用基尼指数 / 信息增益
开放性问题思考
当数据集同时包含:
– 连续型特征(如年龄、收入)
– 离散型特征(如职业、地区)
如何设计统一的特征选择标准?可能的思路:
1. 对连续特征分桶后使用信息增益
2. 对离散特征做嵌入表示后计算 MSE
3. 开发混合指标如 $\alpha IG + (1-\alpha)MSE$
期待你在实践中探索答案!
