为何交叉验证效果始终优于训练集-测试集拆分?是否过拟合如何调参
问题判断
你遇到的情况属于典型的过拟合:模型在训练集内部拆分的交叉验证子集上表现优异,但完全无法泛化到独立的未知测试集。
同时从测试集precision、recall仅0.5左右的表现来看,还可以优先排查两个前置问题:
- 原始数据集存在类别偏斜,少数类样本占比极低
train_test_split拆分时未做分层抽样,导致训练集、测试集的类别分布差异较大,进一步放大了泛化误差
可调整的随机森林超参数与优化方案
- 限制单棵决策树的复杂度(直接降低过拟合风险)
- 减小
max_depth:默认无上限,可下调到3-12区间,避免树生长过深学习到训练集噪声 - 减小
max_features:默认是特征总数的平方根,可下调到0.2-0.5区间,降低节点分裂时的特征选择自由度 - 增大
min_samples_split:默认值为2,可上调到5-20区间,要求节点必须包含足够多样本才允许分裂 - 增大
min_samples_leaf:默认值为1,可上调到2-10区间,要求叶节点必须包含足够多样本
- 减小
- 优化森林整体结构
- 适当增大
n_estimators:默认值为100,可上调到200-1000区间,更多的树可以抵消单棵树过拟合带来的整体方差 - 增加
ccp_alpha参数:默认值为0,可从0.001开始逐步上调,启用成本复杂度剪枝,参数越大剪枝力度越强
- 适当增大
- 流程优化
- 修改
train_test_split参数,增加stratify=y做分层抽样,保证训练集、测试集的类别分布和原始数据集一致 - 若确认存在类别不平衡,初始化
RandomForestClassifier时增加class_weight='balanced'参数,自动调整类别权重 - 不要直接使用默认参数训练,用
GridSearchCV或RandomizedSearchCV基于交叉验证的结果搜索最优超参数组合,再用最优组合训练最终模型
- 修改
内容的提问来源于stack exchange,提问作者Roz
相关产品推荐
相关产品推荐

