Day 109 — 图解:决策树与随机森林
1. 决策树分裂过程
📊 原始数据集
(1000 个样本)
违约率: 25%
基尼系数: 0.375
│
┌───────────────┼───────────────┐
│ 选择最优分裂特征 │
│ "credit_score" │
│ 阈值: 600 │
└───────────────┼───────────────┘
│
┌─────────────┴─────────────┐
│ │
┌───────▼────────┐ ┌────────▼───────┐
│ credit_score │ │ credit_score │
│ ≤ 600 │ │ > 600 │
│ (400 样本) │ │ (600 样本) │
│ 违约率: 45% │ │ 违约率: 12% │
│ 基尼: 0.495 │ │ 基尼: 0.211 │
└───────┬────────┘ └────────┬───────┘
│ │
┌───────▼────────┐ ┌────────▼───────┐
│ 选择下一个 │ │ 选择下一个 │
│ 分裂特征: │ │ 分裂特征: │
│ "debt_ratio" │ │ "income" │
└───────┬────────┘ └────────┬───────┘
│ │
┌──────┴──────┐ ┌──────┴──────┐
│ │ │ │
┌──▼───┐ ┌───▼──┐ ┌──▼───┐ ┌───▼──┐
│ 叶 │ │ 叶 │ │ 叶 │ │ 叶 │
│ 违约 │ │ 正常 │ │ 违约 │ │ 正常 │
│ 75% │ │ 85% │ │ 30% │ │ 95% │
└──────┘ └──────┘ └──────┘ └──────┘
2. 随机森林工作原理
原始训练数据 (N 个样本)
│
│ ┌──────────┬──────────┬──────────┬──────────┐
│ │ Bootstrap│ Bootstrap│ Bootstrap│ Bootstrap│
│ │ 样本1 │ 样本2 │ 样本3 │ 样本4 │
│ │ 63.2% │ 63.2% │ 63.2% │ 63.2% │
│ │ 原始数据 │ 原始数据 │ 原始数据 │ 原始数据 │
│ └────┬─────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ │ │ │ │
│ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ │随机选3 │ │随机选3 │ │随机选3 │ │随机选3 │
│ │个特征 │ │个特征 │ │个特征 │ │个特征 │
│ │做候选 │ │做候选 │ │做候选 │ │做候选 │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ │ │ │ │
│ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ │ 决策树 │ │ 决策树 │ │ 决策树 │ │ 决策树 │
│ │ #1 │ │ #2 │ │ #3 │ │ #4 │
│ │ 预测: A │ │ 预测: B │ │ 预测: A │ │ 预测: A │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ │ │ │ │
│ └─────┬──────┴─────┬─────┘ │
│ │ │ │
│ ┌───────▼────────────▼───────┐ │
│ │ 多数投票 / 平均预测 │ │
│ │ A: 3票 vs B: 1票 │ │
│ │ 最终预测: A ✅ │ │
│ └────────────────────────────┘ │
3. Bagging 采样概率
单个样本在 N 次 Bootstrap 中被选中的概率:
不被选中的概率 = (1 - 1/N)^N
当 N → ∞:
(1 - 1/N)^N → 1/e ≈ 0.368
所以:
约 63.2% 的样本会被选中 (in-bag)
约 36.8% 的样本不会被选中 (out-of-bag, OOB)
┌─────────────────────────────────────────┐
│ N=10 → 不被选中: 34.9% │
│ N=100 → 不被选中: 36.6% │
│ N=1000 → 不被选中: 36.8% │
│ N=∞ → 不被选中: 36.8% (= 1/e) │
└─────────────────────────────────────────┘
4. 信息增益 vs 基尼系数图解
二分类问题: p = 正类比例
信息熵 H(p): 基尼系数 G(p):
1.0 ┤ 0.5 ┤
│╲ │╲
0.8 ┤ ╲ 0.4 ┤ ╲
│ ╲ │ ╲
0.6 ┤ ╲ 0.3 ┤ ╲
│ ╲ │ ╲
0.4 ┤ ╲ 0.2 ┤ ╲
│ ╲ │ ╲
0.2 ┤ ╲ 0.1 ┤ ╲
│ ╲ │ ╲
0.0 ┼───────────╲─── 0.0 ┼───────────╲───
0 0.5 1 0 0.5 1
p (正类比例) p (正类比例)
H(p) = -p·log₂(p) - (1-p)·log₂(1-p)
G(p) = 1 - p² - (1-p)² = 2p(1-p)
两者形状相似,差异不大:
- p=0.5 时: H=1.0, G=0.5 (最大混乱度)
- p=0 或 1 时: H=0, G=0 (完全纯净)
5. 特征重要性评估方法
┌──────────────────────────────────────────────────┐
│ MDI (不纯度减少) vs Permutation │
├──────────────────────────────────────────────────┤
│ │
│ MDI: │
│ ┌──────────────────────────┐ │
│ │ 每次分裂时计算: │ │
│ │ 不纯度减少 = P(左)×H(左) │ │
│ │ + P(右)×H(右) │ │
│ │ - H(父) │ │
│ │ │ │
│ │ 累加所有用该特征的分裂 │ │
│ └──────────────────────────┘ │
│ │
│ Permutation: │
│ ┌──────────────────────────┐ │
│ │ 1. 用测试集评估基线性能 │ │
│ │ 2. 随机打乱特征 X 的值 │ │
│ │ 3. 重新评估性能 │ │
│ │ 4. 重要性 = 性能下降幅度 │ │
│ │ │ │
│ │ 重复 N 次取平均 │ │
│ └──────────────────────────┘ │
│ │
│ ⚠️ MDI 偏向高基数特征 │
│ ✅ Permutation 更客观但更慢 │
└──────────────────────────────────────────────────┘
6. 模型选择决策流程
你的问题是什么?
│
┌────▼────┐
│需要可解 │
│释性? │
└────┬────┘
是 ↙ ↘ 否
┌──────────┐ ┌──────────────┐
│决策树 │ │需要最高精度? │
│可解释性强 │ └──────┬───────┘
└──────────┘ 是 ↙ ↘ 否
┌──────────────┐ ┌──────────────┐
│随机森林 │ │计算资源有限? │
│稳定+高效 │ └──────┬───────┘
└──────────────┘ 是 ↙ ↘ 否
┌──────┐ ┌──────────┐
│随机 │ │XGBoost/ │
│森林 │ │LightGBM │
└──────┘ └──────────┘
数据量参考:
< 1000 样本: 决策树 或 简单随机森林
1K-100K 样本: 随机森林 (n_estimators=100-300)
> 100K 样本: LightGBM / XGBoost (更快)