RandomizedSearchCV调优XGBClassifier报int转C long过大错误
报错根因
这个报错和输入特征、标签的取值范围无关,核心触发点为两类:
- 超参数候选集由
numpy.arange生成时,受浮点累计精度影响可能出现异常值,且numpy生成的np.int64/np.float64类型标量,在Windows环境下传递给XGBoost的C后端时,会触发类型转换溢出(Windows系统C long为32位,与numpy默认64位数值类型存在兼容差)。 - 现有超参数搜索范围设置不合理:
learning_rate上限设为10,远超出XGBoost要求的(0,1]有效区间,极端采样值会触发后端参数校验错误。
另外当前预处理逻辑存在数据泄露问题:先在全量数据集X上拟合缩放器,再用其转换拆分后的训练/测试/验证集,会导致测试集、验证集信息提前流入训练流程,虽不是本次报错的直接诱因,但必须修正。
修复步骤
按顺序修改即可解决问题:
- 修正预处理逻辑,杜绝数据泄露:缩放器仅在训练集上拟合,再用拟合完成的缩放器转换其余数据集
# 修正后的预处理代码 scaler = MinMaxScaler() # 仅用训练集拟合scaler X_train_mms = pd.DataFrame(scaler.fit_transform(X_train), index=X_train.index, columns=X_train.columns) X_test_mms = pd.DataFrame(scaler.transform(X_test), index=X_test.index, columns=X_test.columns) X_valid_mms = pd.DataFrame(scaler.transform(X_valid), index=X_valid.index, columns=X_valid.columns)
- 调整超参数搜索范围,将所有numpy生成的参数值显式转换为Python原生类型,规避跨语言类型转换错误
- 将
learning_rate搜索上限收窄到1(学习率大于1会导致模型训练发散,无搜索价值) - 所有numpy生成的参数候选显式转为Python原生int/float,不要直接传入numpy数组作为参数候选集
修正后的参数空间代码:
- 将
parameter = { 'gamma': [float(x) for x in np.concatenate( (np.arange(0.0001, 0.001, 0.0001), np.arange(0.001, 0.01, 0.001), np.arange(0.01, 0.1, 0.01), np.arange(0.1, 1, 0.1), list(range(1,11))), axis=None )], 'learning_rate': [float(x) for x in np.arange(0.01, 1, 0.01)], 'max_depth': list(range(1,21)), 'n_estimators': [int(x) for x in np.linspace(start=50, stop=1000, num=20)], 'reg_alpha': [float(x) for x in np.arange(0, 10, 0.1)], 'reg_lambda': [float(x) for x in np.arange(0, 10, 0.1)] }
- 初始化XGBClassifier时显式指定兼容参数,规避版本适配问题
xgbooster = { 'name': 'XGBooster', 'function': XGBClassifier(use_label_encoder=False, eval_metric='logloss', tree_method='hist'), 'params': parameter }
- 兜底兼容方案:如果完成以上修改仍触发报错,可在调用fit时显式将输入转为连续内存数组,或把numpy版本降级到1.23.x(numpy 1.24+版本收紧了C long类型转换校验,与部分旧版XGBoost、sklearn存在兼容冲突)
# fit时显式转换输入数组类型 search.fit(np.ascontiguousarray(X_train_mms), np.ascontiguousarray(y_train))
内容的提问来源于stack exchange,提问作者Nivedha Balakrishnan
相关产品推荐
相关产品推荐

