Я использую XGBRegressor с конвейером.Конвейер содержит этапы предварительной обработки и модель ( XGBRegressor ).
Ниже приведены этапы предварительной обработки.(Я уже определил numeric_cols и cat_cols )
numerical_transfer = SimpleImputer()
cat_transfer = Pipeline(steps = [
('imputer', SimpleImputer(strategy = 'most_frequent')),
('onehot', OneHotEncoder(handle_unknown = 'ignore'))
])
preprocessor = ColumnTransformer(
transformers = [
('num', numerical_transfer, numeric_cols),
('cat', cat_transfer, cat_cols)
])
И последний конвейер будет
my_model = Pipeline(steps = [('preprocessor', preprocessor), ('model', model)])
Когда я пытался уместиться без использования early_stopping_rounds , код работал нормально.
(my_model.fit(X_train, y_train))
Но когда я использую early_stopping_rounds , как показано ниже, я получаю ошибку.
my_model.fit(X_train, y_train, model__early_stopping_rounds=5, model__eval_metric = "mae", model__eval_set=[(X_valid, y_valid)])
Я получаю сообщение об ошибке:
model__eval_set=[(X_valid, y_valid)]) and the error is
ValueError: DataFrame.dtypes for data must be int, float or bool.
Did not expect the data types in fields MSZoning, Street, Alley, LotShape, LandContour, Utilities, LotConfig, LandSlope, Condition1, Condition2, BldgType, HouseStyle, RoofStyle, RoofMatl, MasVnrType, ExterQual, ExterCond, Foundation, BsmtQual, BsmtCond, BsmtExposure, BsmtFinType1, BsmtFinType2, Heating, HeatingQC, CentralAir, Electrical, KitchenQual, Functional, FireplaceQu, GarageType, GarageFinish, GarageQual, GarageCond, PavedDrive, PoolQC, Fence, MiscFeature, SaleType, SaleCondition
Означало ли это, что я должен предварительно обработать X_valid перед применением к my_model.fit (), или я сделал что-то не так?
Если проблема в том, что мынужно предварительно обработать X_valid перед применением fit (), как это сделать с препроцессором, который я определил выше?
Редактировать: я пытался предварительно обработать X_valid без конвейера, но я получил ошибку, сообщая о несоответствии функций.