共计 1278 个字符,预计需要花费 4 分钟才能阅读完成。
核心概念解析
1. CART 的基尼分裂准则
决策树每次分裂时通过最小化基尼系数选择最优分割点,公式为:
Gini(D) = 1 - Σ(p_i)^2
其中 p_i 是类别 i 在当前节点的占比。对于特征 A 在值 v 处的分裂,基尼增益计算为:
ΔGini(A,v) = Gini(D) - |D_left|/|D|*Gini(D_left) - |D_right|/|D|*Gini(D_right)

2. 随机森林的多数投票
对于包含 T 棵树的森林,最终预测为:
ŷ = argmax Σ I(h_t(x)=c)
其中 h_t 是第 t 棵树的预测结果,I()是指示函数。理论上,当各树预测差异大时,集成效果更优。
现象分析
决策边界可视化
使用 plotly 绘制两种模型的决策边界时,会发现以下场景会出现完全重合:
-
同质数据
当所有特征对目标变量的区分能力相同时,CART 和随机森林的全局最优分裂点相同 -
简单特征空间
在二维特征且样本线性可分时,首个分裂点就能完美分类,导致所有树结构相同 -
默认超参数
当max_features=1.0且bootstrap=False时,随机森林退化为相同数据训练的 CART
代码实践
强制产生多样性
通过调整 max_features 参数控制特征子集大小:
from sklearn.ensemble import RandomForestClassifier
# 默认参数(可能产生相同结果)rf_default = RandomForestClassifier(random_state=42)
# 强制特征多样性(推荐设置)rf_diverse = RandomForestClassifier(
max_features=0.3, # 每次分裂随机选择 30% 特征
bootstrap=True, # 启用样本子采样
random_state=42
)
特征重要度分析
通过置换重要性检测真实贡献度:
# 训练后执行
importances = rf_diverse.feature_importances_
# 可视化
plt.barh(feature_names, importances)
plt.xlabel('Feature Importance')
plt.title('随机森林特征重要度')
时间复杂度分析:
– 训练:O(T * m*nlogn),T 为树数量,m 为特征数,n 为样本量
– 预测:O(T * depth),与单棵 CART 相同
生产建议
超参数调优公式
避免过拟合的黄金组合:
min_samples_leaf = max(1, int(0.01 * n_samples))
max_depth = min(10, int(np.log2(n_features)) + 5)
金融风控避坑指南
当出现以下情况时,随机森林可能产生 ” 伪多样性 ”:
- 强主导特征存在时,90% 的树仍会优先选择该特征分裂
- 类别极度不平衡时,bootstrap 采样可能强化多数类
- 高维稀疏特征(如用户行为序列)可能导致随机选择失效
开放式问题
当特征间皮尔逊相关系数 >0.9 时:
– Bagging 的样本扰动可能不足以改变分裂选择
– 建议先进行 PCA 降维或使用互信息筛选特征
(作者注:实际项目中遇到该现象时,建议先检查特征相关性矩阵和类别分布)
正文完
