随机森林
通过构建多棵互不相关的决策树,并将它们的预测结果进行汇总(分类问题采用多数投票,回归问题采用平均值)来得出最终结论
核心机制(两个随机性):
数据随机(Bootstrap采样):从原始数据集中有放回地随机抽取N个样本,构建每棵树的训练子集(约63.2%的样本会被抽到,剩余37.8%称为袋外数据OOB)。
特征随机(特征子空间):在每棵树的每个分裂节点,不是从所有特征中选最优,而是随机选取一小部分特征(如sqr总特征、log2总特征数),再从这个小集合中找最优分裂特征。 这两大随机性确保了树与树之间低相关性,使得整体集成后的模型方差大幅降低,不易过拟合。
常见参数
| 参数 | 默认值 | 作用 | 调参建议 |
|---|---|---|---|
| n_estimators | 100 | 弱学习器(决策树)的数量。越多越稳定,但计算量线性增加 | 首要调参。通常越大越好(如 500~1000),配合 n_jobs 并行加速,关注边际收益递减点 |
| bootstrap | True | 是否采用有放回采样(Bagging)。若设为 False,则使用全部数据训练每棵树(失去袋外评估能力) | 通常保持 True。若数据量极大且追求速度,可设为 False |
| oob_score | False | 是否使用袋外数据(Out-of-Bag)进行泛化误差评估。 | 数据量足够时建议开启(True),可省去交叉验证的时间成本 |
| warm_start | False | 是否复用上次训练结果增量增加树(不重置模型) | 用于调试时逐渐增加 n_estimators 观察效果,平时保持 False |
| max_depth | None | 树的最大深度。None 表示直到叶子节点纯净或样本数小于阈值 | 高频调参。数据量大时建议限制(如 10~30),防止单棵树过拟合 |
| min_samples_split | 2 | 内部节点再划分所需的最小样本数 | 样本量大时可调大(如 5~50),抑制细粒度划分 |
| min_samples_leaf | 1 | 叶子节点最少样本数 | 调大(如 5~20)能使模型更平滑,抗噪声 |
| min_weight_fraction_leaf | 0.0 | 叶子节点最少样本权重总和占总样本权重的比例(加权时用) | 通常默认即可,处理不平衡数据时可配合 class_weight 调整 |
| max_leaf_nodes | None | 最大叶子节点总数。限制节点数量优先于 max_depth | 控制树的上界复杂度,优先用 max_depth 和 min_samples_leaf 即可 |
| min_impurity_decrease | 0.0 | 节点分裂所需的最小不纯度下降值 | 设置 >0 可减少无效分裂,提升泛化 |
| ccp_alpha | 0.0 | 最小代价复杂度剪枝的稀疏度参数(>=0) | Sklearn 0.22+ 新增,非零值可实现后剪枝,比前置限制更有效(建议 0.001~0.01 试) |
| max_features | 'sqrt'(分类), 'log2'(回归) | 每次分裂随机选取的特征子集大小(int/float/string) | 随机森林最重要的参数。值越小,树之间差异越大,方差降低但偏差略升分类:建议 sqrt 或 0.3~0.5 总特征数 回归:建议 1/3 或 log2 |
| criterion | 'gini'(分类), 'squared_error'(回归) | 分裂质量评估指标 分类可选:'gini', 'entropy' 回归可选:'squared_error', 'absolute_error', 'friedman_mse' | 通常默认 Gini 或 MSE 足够高效;entropy 略慢但生成树更平衡;friedman_mse 对回归梯度提升友好 |
| random_state | None | 随机种子(控制数据采样、特征采样、分裂点) | 必须设置(如 42),否则结果无法复现 |
| n_jobs | None(=1) | 并行训练的 CPU 核心数 | 设为 -1 使用所有核心,显著加速 n_estimators 较大时的训练 |
| verbose | 0 | 训练日志冗余度(0/1/2) | 调参时设为 1 查看进度,生产环境设 0 |
| class_weight | None | 分类任务中各类别的权重('balanced' 或字典) | 处理极度不平衡数据时必调,设为 'balanced' 自动按样本数反比加权 |
判断模型质量
看“训练集 vs 测试集”的分数差距:如果训练集准确率 99%,测试集只有 70%,说明严重过拟合(虽然随机森林抗过拟合,但树太深、样本太少时依然会)。
看 OOB 分数(袋外评分):这是随机森林的“免费午餐”。开启 oob_score=True 后,OOB 分数与测试集分数的接近程度,直接反映了模型的泛化可信度。两者越接近,说明模型越稳健。
看交叉验证(CV)的标准差:做 5 折交叉验证,如果 5 次分数的标准差很大(比如 0.9, 0.7, 0.95, 0.6, 0.85),说明模型对数据划分极其敏感,预测极不稳定,不可信。
可信标准:如果树间平均相关系数 > 0.8,说明每棵树偏差极大,集成后虽然准确率还行,但遇到新数据(哪怕轻微分布偏移)会瞬间崩溃。此时你需要增大 max_features 的随机性,或增加样本扰动。
与模型质量的关系
| 参数 | 与 最大回撤 的关系 | 与 精准率 的关系 | 与 召回率 的关系 | 与 盈亏比 的关系 |
|---|---|---|---|---|
| n_estimators (↑ 增多) | 反比(回撤降低)集成规模越大,预测方差越小,曲线越平滑 | 弱反比(趋向稳定)边际效应递减,过多时噪声抵消,精准率趋向稳定均值 | 弱正比(略有提升)更多树的投票能捕捉到更微弱的有效信号 | 正比(盈亏比提升)回撤下降直接拉高了收益风险比 |
| max_depth (↑ 加深) | 强正比(回撤飙升)这是回撤的头号杀手! 树越深,越拟合分钟级噪声,导致回撤急剧放大 | 正比(但不稳定)在验证集上,深度增加会提高精确率的波动性(时高时低) | 弱正比(先升后降)初期深度增加能抓到更多信号,但超过12层后召回率会因过拟合而暴跌 | 强反比(盈亏比暴跌)回撤大涨叠加收益不稳,盈亏比会断崖式下跌 |
| min_samples_split (↑ 增大) | 反比(回撤降低)节点分裂要求更严,树结构更保守,避免为噪声分裂 | 弱反比(轻微下降)限制分裂后,树的精细度下降,可能误杀部分精准信号 | 反比(召回率下降)模型变得更“迟钝”,漏掉的机会增多(交易次数减少) | 正比(盈亏比提升)虽然交易变少,但留下的都是高确定性机会,单笔盈利扩大 |
| min_samples_leaf (↑ 增大) | 极强反比(回撤大幅降低)这是压住回撤的王牌! 叶子样本变多,决策边界极度平滑,彻底切断噪声路径 | 反比(精准率下降)预测更保守,不会轻易给出极端高置信度的信号,精准率会适度回落 | 强反比(召回率下降)必然以牺牲捕捉弱信号为代价,交易次数会明显减少 | 强正比(盈亏比拉升)亏损交易被最大程度过滤,留下来盈利单的赔率显著提升 |
| max_features (从 all 改为 'sqrt') | 极强反比(回撤骤降)这是本次修改的第二大功臣。 强制去相关化,树间抱团过拟合被瓦解,泛化能力质变 | 弱正比(稳定提升)每棵树看到的特征更随机,投票结果的置信度更真实可靠 | 弱反比(轻微下降)特征变少,可能错过依赖特定特征组合的极少数信号 | 强正比(盈亏比提升)模型稳定性大幅增强,回撤收窄直接拉高了盈亏比 |