Являются ли два вида интерфейса xgboost абсолютно одинаковыми? - PullRequest
0 голосов
/ 28 мая 2018

В настоящее время я работаю над In Class Competition в Kaggle.Я читал об официальной справке по Python API, и меня немного смущают два вида интерфейсов, особенно в поиске по сетке, перекрестной проверке и ранней остановке.

В XGBoost API я могу использовать xgb.cv(), который разделяет набор данных которого на две части для перекрестной проверки, чтобы настроить хорошие гиперпараметры, а затем получить best_iteration.Таким образом, я могу настроить num_boost_round на best_iteration.Чтобы максимально использовать данные, я снова тренирую весь набор данных с хорошо настроенными гиперпараметрами, а затем использую его для классификации.Единственный недостаток - я сам должен написать код GridSearch.

ВНИМАНИЕ: этот набор перекрестной проверки изменяется при каждом сворачивании, поэтому результат обработки не будет иметь какой-либо конкретной тенденции к какой-либо части данных.

Но в sklearn кажется, что я не могу получить best_iteration, используя clf.fit(), как в модели xgb.Действительно, метод fit() имеет early_stopping_rounds и eval_set для реализации части ранней остановки.Многие люди реализуют такой код:

X_train, X_test, y_train, y_test = train_test_split(train, target_label, test_size=0.2, random_state=0)
clf = GridSearchCV(xgb_model, para_grid, scoring='roc_auc', cv=5, \
        verbose=True, refit=True, return_train_score=False)
clf.fit(X_train, y_train, early_stopping_rounds=30, eval_set=[(X_test, y_test)])
....
clf.predict(something)

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

Мне нравится GridSearchCV в sklearn, но я также хочу, чтобы eval_set менялся при каждом фолде, как и xgb.cv.Я считаю, что он может использовать данные, не допуская переоснащения.

Как мне поступить?Я подумал о двух способах:

  1. , используя XGB API, и сам написать GridSearch.
  2. , используя sklean API, и вручную изменять eval_set при каждом сгибе.Есть ли более удобные методы?

1 Ответ

0 голосов
/ 29 мая 2018

Как вы подытожили, оба подхода имеют свои преимущества и недостатки.

  • xgb.cv будет использовать оставленную складку для ранней остановки, таким образом, вам не понадобитсядополнительное разделение на выборку проверки / обучения, чтобы определить, когда следует инициировать раннюю остановку.
  • GridSearchCV (или, может быть, вы попробуете RandomizedSearchCV) будет обрабатывать сетку параметров и оптимальный выбор для вас.

Обратите внимание, что не является проблемой использование фиксированного подвыборки для ранней остановки во всех сгибах CV.Поэтому я не думаю, что вы должны делать что-то вроде " изменить eval_set вручную в каждом фолде ".Оценочная выборка, используемая при ранней остановке, напрямую не влияет на параметры модели - она ​​используется для определения того, когда показатель оценки на удерживающей выборке прекращает улучшаться.Для окончательной модели вы можете отказаться от ранней остановки - вы можете увидеть, когда модель останавливается с оптимальными гиперпараметрами, используя вышеупомянутое разделение, а затем использовать это количество деревьев в качестве фиксированного параметра в окончательной подгонке модели.

Итак, в конце концов, это дело вкуса, так как в обоих случаях вам нужно будет пойти на компромисс.IMO, sklearn API является оптимальным выбором, так как он позволяет использовать остальные инструменты sklearn (например, для предварительной обработки данных) естественным образом в конвейере в CV и обеспечивает однородный интерфейс для обучения модели для различных подходов.Но в конце концов это зависит от вас

...