【发布时间】:2023-01-13 01:02:32
【问题描述】:
我正在尝试为我的 XGBoost 模型构建数据预处理管道。数据包含 NaN,需要缩放。这是相关代码:
xgb_pipe = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', preprocessing.StandardScaler()),
('regressor', xgboost.XGBRegressor(n_estimators=100, eta=0.1, objective = "reg:squarederror"))])
xgb_pipe.fit(train_x.values, train_y.values,
regressor__early_stopping_rounds=20,
regressor__eval_metric = "rmse",
regressor__eval_set = [[train_x.values, train_y.values],[test_x.values, test_y.values]])
损失立即增加,训练在 20 次迭代后停止。
如果我从管道中删除输入器和缩放器,它会工作并训练完整的 100 次迭代。如果我手动预处理数据,它也会按预期工作,所以我知道问题不在于数据。 我错过了什么?
【问题讨论】:
-
必须与您的
regressor__eval_setfit 参数相关。对于初学者,将其排除在外,并查看 XGBoost 是否运行了 100 次迭代。 -
@user1808924 如果我只删除这一行,我会得到一个IndexError:列表索引超出范围错误。如果我删除所有三个回归变量参数以提前停止,它会在整个持续时间内进行训练(并且损失会按预期改善)。那么实施提前停止的正确方法是什么?
-
请注意,(梯度提升)树不关心输入的规模,因此这里并不严格需要
StandardScaler。而 xgboost 将处理缺失值(但如果你别想要那个,那么估算将导致差异。)
标签: scikit-learn data-science pipeline xgboost data-preprocessing