为什么CART和随机森林分类结果一模一样?深入解析决策树与集成学习的异同

1次阅读
没有评论

共计 1278 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

核心概念解析

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)

为什么 CART 和随机森林分类结果一模一样?深入解析决策树与集成学习的异同

2. 随机森林的多数投票

对于包含 T 棵树的森林,最终预测为:

ŷ = argmax Σ I(h_t(x)=c)

其中 h_t 是第 t 棵树的预测结果,I()是指示函数。理论上,当各树预测差异大时,集成效果更优。

现象分析

决策边界可视化

使用 plotly 绘制两种模型的决策边界时,会发现以下场景会出现完全重合:

  1. 同质数据
    当所有特征对目标变量的区分能力相同时,CART 和随机森林的全局最优分裂点相同

  2. 简单特征空间
    在二维特征且样本线性可分时,首个分裂点就能完美分类,导致所有树结构相同

  3. 默认超参数
    max_features=1.0bootstrap=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)

金融风控避坑指南

当出现以下情况时,随机森林可能产生 ” 伪多样性 ”:

  1. 强主导特征存在时,90% 的树仍会优先选择该特征分裂
  2. 类别极度不平衡时,bootstrap 采样可能强化多数类
  3. 高维稀疏特征(如用户行为序列)可能导致随机选择失效

开放式问题

当特征间皮尔逊相关系数 >0.9 时:
– Bagging 的样本扰动可能不足以改变分裂选择
– 建议先进行 PCA 降维或使用互信息筛选特征

(作者注:实际项目中遇到该现象时,建议先检查特征相关性矩阵和类别分布)

正文完
 0
评论(没有评论)