Optuna调优Tweedie目标XGBRegressor时float32溢出错误解决
解决XGBRegressor参数调优时的float32溢出问题
针对你遇到的仅在参数调优阶段出现Input contains infinity or a value too large for dtype('float32')错误的问题,可通过以下几个方向强制全流程使用float64精度,并优化数值稳定性:
1. 强制XGBoost使用float64精度
XGBoost默认会用float32进行计算(尤其是tree_method="hist"模式下),你可以在初始化XGBRegressor时显式指定dtype="float64",覆盖默认精度设置。
修改代码位置:
- 在
__fit_new_model的初始模型定义中添加参数:
regressor: XGBRegressor = XGBRegressor( random_state=42, tree_method="hist", dtype="float64", # 强制使用float64 n_estimators=100, early_stopping_rounds=100, objective="reg:tweedie", tweedie_variance_power=1.5, eval_metric=mean_absolute_percentage_error, )
- 在
__get_tuned_model_parames的objective函数的param字典中添加:
param = { "tree_method": "hist", "dtype": "float64", # 强制调优过程中使用float64 "booster": trial.suggest_categorical("booster", ["gbtree", "dart"]), # ... 其余参数保持不变 }
2. 显式确认数据类型并强制转换
虽然你已处理过数据,但调优过程中可能因数据传递环节出现隐式类型转换,可在数据分割后强制转换为float64:
# 在__fit_new_model的train_test_split之后添加 import numpy as np X_train = X_train.astype(np.float64) y_train = y_train.astype(np.float64) X_validation = X_validation.astype(np.float64) y_validation = y_validation.astype(np.float64)
3. 优化Tweedie目标的参数与数值稳定性
你使用的reg:tweedie目标在variance_power接近2时,容易因目标值过大引发数值溢出,可做以下调整:
- 暂时缩小
tweedie_variance_power的取值范围,比如先排除1.9这类接近2的数值:
param["tweedie_variance_power"] = trial.suggest_categorical( "tweedie_variance_power", [1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8] )
- 对目标值做标准化/归一化处理,缩小数值范围:
# 在__get_tuned_model_parames中,数据传入后添加 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() y_train_scaled = scaler.fit_transform(y_train.values.reshape(-1, 1)).ravel() y_validation_scaled = scaler.transform(y_validation.values.reshape(-1, 1)).ravel() # 后续fit和评估使用缩放后的y值 regressor_model.fit(X=x_train, y=y_train_scaled, eval_set=[(x_validation, y_validation_scaled)], verbose=False) predictions = regressor_model.predict(x_validation) mape: float = mean_absolute_percentage_error(y_true=y_validation, y_pred=scaler.inverse_transform(predictions.reshape(-1, 1)).ravel())
4. 调整正则化参数的搜索范围
过小的lambda和alpha会削弱正则化效果,可能导致模型数值不稳定,可提高参数下限:
param = { # ... 其余参数 "lambda": trial.suggest_float("lambda", 1e-2, 10.0), # 从1e-2开始 "alpha": trial.suggest_float("alpha", 1e-2, 10.0), # 从1e-2开始 # ... 其余参数 }
内容的提问来源于stack exchange,提问作者soumeng78
相关产品推荐
相关产品推荐

