XGBRegressor用GridSearchCV调参触发FitFailedWarning如何解决
报错根因
- 核心问题:参数网格中学习率的键名多了一个多余的尾部空格,你写成了
'eta ',XGBRegressor没有这个带空格的参数,无法识别传入的未知参数,直接触发拟合失败,你修改参数网格结构后仍报错就是因为这个空格没有删除。 - 次要兼容问题:如果你的真实训练集和提供的样例一样只有极少样本(样例仅5条),GridSearchCV设置了cv=5,会导致每折训练集仅4条数据,当max_depth设置为8、10这类较大值时,树深度超过训练样本可支持的分裂上限,也会触发拟合异常。
- 补充说明:你最初将参数网格写为两个独立字典的写法,逻辑是先单独搜索eta参数、再单独搜索max_depth参数,本身不会触发报错,只是和你想同时搜索两个参数所有组合的预期不符,不是本次报错的原因。
解决方案
- 首先删除参数名后的多余空格,可直接写
'eta'(适配xgboost原生参数规范),也可写'learning_rate'(对齐sklearn接口规范),二者作用完全一致。 - 如果你的真实训练集样本量小于10,建议将交叉验证折数调低,比如改为cv=3,避免每折训练样本量过少的问题。
- 若需要同时搜索eta和max_depth的所有参数组合,保留单个字典的param_grid写法即可。
修正后可运行代码
from sklearn.model_selection import GridSearchCV from xgboost import XGBRegressor import pandas as pd # 修正后的参数网格,去掉eta后的多余空格 param_grid = { 'eta': [0.01, 0.05, 0.1, 0.2], 'max_depth': [4, 6, 8, 10] } xgb_model = XGBRegressor(random_state = 0) # 小数据集场景下调低cv为3,数据集样本量充足可保留cv=5 grid_search = GridSearchCV(xgb_model, param_grid, cv=3, scoring='neg_root_mean_squared_error', return_train_score=True) # 替换为你的真实y_train即可运行 grid_search.fit(final_OH_X_train_scaled, y_train) # 查看最优结果 print("最优参数:", grid_search.best_params_) print("最优交叉验证RMSE:", -grid_search.best_score_)
内容的提问来源于stack exchange,提问作者user15235239
相关产品推荐
相关产品推荐

