装袋法(Bagging)核心:
与 Boosting 的区别:
维度 | 随机森林(Bagging) | 提升法(如 GBDT) |
---|---|---|
基树关系 | 独立并行(互不干扰) | 顺序依赖(后树修正前树错误) |
目标 | 降低方差(防过拟合) | 降低偏差(提升精度) |
代表场景 | 数据嘈杂、防止过拟合 | 弱模型集成,追求高精度 |
RandomForestClassifier
,用基尼系数 / 信息熵衡量分枝质量,输出类别概率(predict_proba
)。RandomForestRegressor
,用 MSE/MAE 衡量分枝,输出连续值,无概率输出。oob_score_
:无需划分测试集,用 37% 袋外数据验证模型,懒人福音!feature_importances_
:一键获取特征重要性,筛选关键特征超方便(如乳腺癌数据前 5 个特征贡献 60% 以上)。参数名 | 作用 | 表情版解释 |
---|---|---|
n_estimators |
树的数量,越大越稳但越慢,默认 10(新版默认 100)。用学习曲线找拐点! | 小树多了成森林,太多会 “迷路”,建议先调这个参数! |
max_depth |
树的最大深度,防过拟合,默认无限制。调小 = 剪枝,模型变简单。 | 砍树枝!太深容易钻牛角尖,浅一点更鲁棒~ |
bootstrap |
有放回抽样(默认 True),生成不同训练集,提升基树多样性。 | 抽卡要随机!重复抽卡才能组不同卡组,胜率 UP! |
max_features |
分枝时考虑的特征数,默认auto (√n)。可设None 用全特征。 |
特征太多选花眼?限制一下,聚焦关键特征! |
第一步:调n_estimators
python
运行
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
wine = load_wine()
rfc = RandomForestClassifier(n_estimators=25)
clf = DecisionTreeClassifier()
# 交叉验证对比
rfc_score = cross_val_score(rfc, wine.data, wine.target, cv=10).mean()
clf_score = cross_val_score(clf, wine.data, wine.target, cv=10).mean()
print(f"随机森林:{rfc_score:.3f},单决策树:{clf_score:.3f}") # 输出:随机森林0.973,单树0.892
第二步:剪枝参数(防过拟合)
max_depth
从默认None
开始调小(如乳腺癌数据调至 39 棵树时精度最高)。min_samples_leaf
增大(如从 1 到 5),限制叶节点样本量,避免模型记忆噪声。进阶:缺失值填补(波士顿房价案例)
第一步:确定n_estimators
范围
range(0, 200, 10)
,发现 39 棵树时准确率最高。range(35, 45)
,确认 39 棵树为最佳(准确率提升 0.005)。第二步:网格搜索其他参数
max_depth
发现限制深度后准确率下降→模型已在泛化误差最低点左侧,需增加复杂度。max_features
发现最小值最佳→说明当前特征足够,更多特征反增噪声。最终模型
python
运行
from sklearn.ensemble import RandomForestClassifier
rfc_best = RandomForestClassifier(n_estimators=39, random_state=90)
score = cross_val_score(rfc_best, data.data, data.target, cv=10).mean()
print(f"最佳准确率:{score:.3f}") # 输出:0.978(调参前0.973,提升0.005)
n_estimators
再剪枝,避免计算爆炸。max_features='auto'
适合中等维度,高维数据可试'sqrt'
或手动设整数(如泰坦尼克号数据设 2)。class_weight='balanced'
处理类别不平衡(如少数类样本权重更高)。feature_importances_
可画出条形图,直观查看特征贡献(如红酒数据 “灰分”“酒精” 最重要)。“先增树数稳基础,再剪枝叶防过拟合,特征筛选看重要性,袋外数据验效果。”
max_depth
和max_features
。参数分类 | 核心参数 | 作用 |
---|---|---|
集成策略 | n_estimators |
树的数量,越大越稳,默认 10(新版 100) |
bootstrap |
有放回抽样(默认 True),生成不同训练集 | |
oob_score |
启用袋外数据验证(默认 False),训练后用oob_score_ 获取分数 |
|
基树控制 | max_depth |
树深度,防过拟合,默认无限制 |
min_samples_leaf |
叶节点最小样本量,增大简化模型 | |
分枝指标 | 分类:criterion |
'gini' (默认)或'entropy' |
回归:criterion |
'mse' (默认)、'mae' |
随机森林就像一片需要精心打理的森林,调参是修剪枝叶的艺术,数据清洗是施肥,特征工程是浇水。掌握了参数背后的 “偏差 - 方差” 平衡逻辑,再结合实战练手,你也能让这片森林在机器学习的战场上无往不胜!
最后提醒:调参没有 “标准答案”,多画学习曲线、多尝试网格搜索,在数据中找到属于你的 “最优解”!