You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过K折交叉验证解决过拟合并选择最优模型预测未知数据?

K折交叉验证后如何选择最优模型用于未知数据预测?

训练准确率95%-100%但怀疑过拟合,用K折交叉验证排查是合理的,但你可能误解了交叉验证的核心作用——它主要是评估模型的泛化能力,不是生成多个候选模型让你挑。以下是正确的处理流程:

1. 先明确交叉验证的本质

cross_val_score输出的K个分数,是模型在K次不同训练/验证子集上的表现,用来判断模型的整体泛化水平:

  • 看分数均值:如果均值远低于训练准确率,说明模型确实过拟合;如果均值接近训练准确率,说明泛化能力不错。
  • 看分数方差:方差越小,说明模型在不同数据子集上的表现越稳定。

这一步是帮你确认过拟合的问题,而不是直接选模型。

2. 不要选单折训练的模型

交叉验证每次迭代训练的模型,都是基于部分训练数据,单独选其中一个会有偏差——它没见过全部训练数据,泛化能力不如用全量数据训练的模型。正确的做法是:用所有训练数据重新训练一个最终模型,交叉验证的分数只是用来验证这个模型的可靠性。

3. 完整实操流程(附代码)

结合你的代码,整理成标准流程:

# 1. 拆分训练集和测试集(测试集留到最后评估,不参与交叉验证)
from sklearn.model_selection import train_test_split
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.25, random_state=42)

# 2. 用训练集做K折交叉验证,评估模型泛化能力
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

rf = RandomForestClassifier(random_state=42)
# 对训练集做5折交叉验证
cv_scores = cross_val_score(rf, train_features, train_labels, cv=5)
print(f"5折交叉验证分数:{cv_scores}")
print(f"平均交叉验证分数:{cv_scores.mean():.2f},分数波动:{cv_scores.std():.2f}")

# 3. 确认泛化能力后,用全量训练数据训练最终模型
rf.fit(train_features, train_labels)

# 4. 用测试集验证最终模型的泛化效果
test_acc = rf.score(test_features, test_labels)
print(f"测试集准确率:{test_acc:.2f}")

# 5. 用训练好的模型预测未知数据
unknown_predictions = rf.predict(unknown_features)

4. 进一步解决过拟合:结合交叉验证调参

如果交叉验证分数远低于训练准确率,说明过拟合严重,可以用网格搜索/随机搜索+交叉验证来调参,找到泛化能力最好的参数组合:

from sklearn.model_selection import GridSearchCV

# 定义待调的参数范围
param_grid = {
    'max_depth': [5, 10, None],  # 限制树深,避免过拟合
    'min_samples_split': [2, 5],  # 拆分节点所需的最小样本数
    'n_estimators': [100, 200]
}

# 网格搜索+5折交叉验证,自动找最优参数
grid_search = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5)
grid_search.fit(train_features, train_labels)

# 获取最优参数的模型
best_rf = grid_search.best_estimator_
print(f"最优参数组合:{grid_search.best_params_}")
print(f"最优交叉验证分数:{grid_search.best_score_:.2f}")

# 评估测试集
print(f"测试集准确率:{best_rf.score(test_features, test_labels):.2f}")

# 预测未知数据
unknown_predictions = best_rf.predict(unknown_features)

内容的提问来源于stack exchange,提问作者Bad Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:05:37