无网格搜索时,如何在k折交叉验证训练后获取最优模型?
不使用网格搜索时,k折交叉验证后获取最优模型并预测的方法
首先要明确,cross_val_score仅返回各折的评估分数,不会保存每一轮训练出的模型。要得到可用于测试集预测的最优模型,有两种实用方案:
方案1:通过cross_validate保存并筛选最优折的模型
- 使用
cross_validate函数并设置return_estimator=True,可以同时获取每一轮交叉验证训练出的模型和对应分数 - 从结果中筛选出分数最高的模型,直接用于测试集预测
代码示例:
from sklearn.model_selection import cross_validate import xgboost as xgb # 初始化带最优参数的模型 model = xgb.XGBClassifier(**best_params) # 执行交叉验证,返回模型和分数 cv_results = cross_validate(model, X_train, Y_train, cv=5, scoring='f1', return_estimator=True) # 获取各折的分数与模型 cv_scores = cv_results['test_score'] trained_models = cv_results['estimator'] # 选出分数最高的模型 best_model = trained_models[cv_scores.argmax()] # 预测测试集 Y_pred = best_model.predict(X_test)
方案2:在完整训练集上重新训练模型
- 交叉验证的核心作用是验证
best_params的泛化能力,既然参数已经通过验证,直接用全部训练数据训练模型,得到的模型性能通常更优(训练数据量更大) - 这种方法操作简单,是工业界的常规做法
代码示例:
import xgboost as xgb # 初始化带最优参数的模型 model = xgb.XGBClassifier(**best_params) # 用全部训练数据训练模型 model.fit(X_train, Y_train) # 预测测试集 Y_pred = model.predict(X_test)
两种方案的区别
- 方案1无需重新训练,但模型基于训练集的子集训练,数据量有限
- 方案2的模型用了完整训练数据,泛化能力更强,更推荐作为首选
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

