Python 3.x XGboost:无法传递管道中eval_集的验证数据

Python 3.x XGboost:无法传递管道中eval_集的验证数据,python-3.x,machine-learning,scikit-learn,xgboost,Python 3.x,Machine Learning,Scikit Learn,Xgboost,我想在管道中为XGboost模型实现GridSearchCV。我有数据预处理器,在代码上面定义,一些网格参数 XGBmodel = XGBRegressor(random_state=0) pipe = Pipeline(steps=[ ('preprocess', preprocessor), ('XGBmodel', XGBmodel) ]) 我想通过这些健身参数 fit_params = {"XGBmodel__eval_set": [(X_valid, y_valid)

我想在管道中为XGboost模型实现GridSearchCV。我有数据预处理器,在代码上面定义,一些网格参数

XGBmodel = XGBRegressor(random_state=0)
pipe = Pipeline(steps=[
    ('preprocess', preprocessor),
    ('XGBmodel', XGBmodel)
])
我想通过这些健身参数

fit_params = {"XGBmodel__eval_set": [(X_valid, y_valid)], 
              "XGBmodel__early_stopping_rounds": 10, 
              "XGBmodel__verbose": False}
我在试着适应这个模型

searchCV = GridSearchCV(pipe, cv=5, param_grid=param_grid, fit_params=fit_params)
searchCV.fit(X_train, y_train)
但是我在
eval_set
的行中遇到错误:
DataFrame.d数据类型必须是int、float或bool

我猜这是因为验证数据没有经过预处理,但当我在谷歌上搜索时,我发现无论在哪里都是用这种方式完成的,而且似乎应该可以工作。 我还试图找到一种方法,分别对验证数据应用预处理器,但如果不在验证数据之前拟合训练数据,则无法转换验证数据

完整代码

columns = num_cols + cat_cols
X_train = X_full_train[columns].copy()
X_valid = X_full_valid[columns].copy()

num_preprocessor = SimpleImputer(strategy = 'mean')
cat_preprocessor = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy = 'most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

preprocessor = ColumnTransformer(transformers=[
    ('num', num_preprocessor, num_cols),
    ('cat', cat_preprocessor, cat_cols)
])

XGBmodel = XGBRegressor(random_state=0)
pipe = Pipeline(steps=[
    ('preprocess', preprocessor),
    ('XGBmodel', XGBmodel)
])

param_grid = {
    "XGBmodel__n_estimators": [10, 50, 100, 500],
    "XGBmodel__learning_rate": [0.1, 0.5, 1],
}

fit_params = {"XGBmodel__eval_set": [(X_valid, y_valid)], 
              "XGBmodel__early_stopping_rounds": 10, 
              "XGBmodel__verbose": False}

searchCV = GridSearchCV(pipe, cv=5, param_grid=param_grid, fit_params=fit_params)
searchCV.fit(X_train, y_train)

是否有任何方法可以预处理管道中的验证数据?或者可能是完全不同的方法来实现这一点?

没有好的方法。如果你在安装一个模型之前有一个长的变压器管道,那么你可以考虑在管道中安装这些管道,然后分别应用该模型。
潜在的问题是管道没有在模型拟合中使用验证集的概念。您可以看到关于
LightGBM
github的讨论。他们的建议是对变压器进行预培训,并在安装完整管道之前将其应用于验证数据。如果您使用快速转换器,这可能很好,但在极端情况下,CPU时间可能会增加一倍。

也许您必须将管道分离,以便进行预处理和训练模型。