XGboost: невозможно передать данные проверки для eval_set в конвейере - PullRequest
1 голос

Я хочу реализовать GridSearchCV для модели XGboost в конвейере. У меня есть препроцессор для данных, определенных выше кода, некоторые параметры сетки

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.dtypes for data must be int, float or bool

Я полагаю, это потому, что данные проверки не проходят предварительную обработку, но когда я в Google, я обнаруживаю, что везде это делается таким образом и, похоже, должно работать. Также я попытался найти способ применить препроцессор для данных проверки отдельно, но невозможно преобразовать данные проверки без подгонки данных поезда до этого.

Полный код

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)

Есть ли способ предварительной обработки данных проверки в конвейере? Или, может быть, совершенно другой способ реализации этой вещи?

1 Ответ

0 голосов
/ 30 мая 2019

Хорошего пути нет.Если у вас длинный конвейер трансформаторов до подгонки модели, то вы можете рассмотреть возможность подгонки тех в конвейере, а затем применить модель отдельно.

Основная проблема заключается в том, что в конвейере нет понятия набора проверки.используется в модели фитинга.Вы можете увидеть обсуждение на LightGBM github здесь .Их предложение состоит в том, чтобы предварительно подготовить трансформаторы и применить их к данным валидации до того, как вы установите весь конвейер.Это может быть хорошо, если вы используете быстрые преобразователи, но можете удвоить время процессора в экстремальном сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...