Настройка параметров Xgboost Случайный поиск

#python #machine-learning #scikit-learn #xgboost #gridsearchcv

Вопрос:

Я использую приведенный ниже код настройки параметров xgboost с помощью случайного поиска

 import xgboost as xgb
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import r2_score
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import fbeta_score, make_scorer
from xgboost.sklearn import XGBRegressor

parameters = {'objective':['reg:squarederror'],
              'booster':['gbtree','gblinear'],
              'learning_rate': [0.1], 
              'max_depth': [7,10,15,20],
              'min_child_weight': [10,15,20,25],
              'colsample_bytree': [0.8, 0.9, 1],
              'n_estimators': [300,400,500,600],
              "reg_alpha"   : [0.5,0.2,1],
              "reg_lambda"  : [2,3,5],
              "gamma"       : [1,2,3]}

xgb_model = XGBRegressor(random_state=30)

grid_obj_xgb = RandomizedSearchCV(xgb_model,parameters, cv=5,n_iter=15,scoring='neg_mean_absolute_error',verbose=5,n_jobs=12)
grid_obj_xgb.fit(df_train, y_train,verbose = 1)

y_pred_train = grid_obj_xgb.predict(df_train)
y_pred_test = grid_obj_xgb.predict(df_test)

err_xgb_train=mean_absolute_error(y_train, y_pred_train, multioutput='raw_values')

 

Я 1,200,000 строк, столбцов 75 в моей df_train и это занимает много времени , есть все, что я делаю неправильно, из-за которой это занимает так много времени или есть ли способ я могу ускорить наряду с использованием всех ядер
или это займет время, учитывая размер данных у меня нет.

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

Ответ №1:

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

Также с помощью hyperopt вы можете легко настроить пространство поиска (см. Здесь).

Я попробовал это лично, используя библиотеку hyperopt на python, и она работает очень хорошо. Ознакомьтесь с этим руководством для получения дополнительной информации. Вы также можете скачать соответствующую записную книжку с моего GitHub

Ответ №2:

Вы делаете 5 резюме, начиная с довольно большого набора данных, сформированного значениями 1200000×75: это нормально, что для запуска требуется довольно много времени. Здесь у вас есть несколько различных опций для ускорения вычислений. Как отметил @Shaunak, вы можете попробовать использовать hyperopt, который обычно сходится после нескольких итераций. Кроме того, в зависимости от конкретной проблемы, которую вы пытаетесь решить, и имеющихся у вас данных, вы можете попробовать одно или несколько из следующих действий:

  • Используйте CatBoost или LightGBM. Они основаны на различных реализациях дерева решений и, как правило, быстрее, чем XGBoost.
  • Сделайте выборку из набора данных, чтобы уменьшить количество строк
  • Выполните какой-либо выбор функций или уменьшение размерности (например, PCA), чтобы уменьшить количество столбцов
  • Подумайте о том, чтобы построить меньшее количество деревьев (уменьшите количество оценщиков).
  • Подумайте о том, чтобы построить деревья меньшего размера (уменьшив максимальную глубину).
  • Рассмотрите возможность использования других (и, как правило, более простых) моделей, работающих быстрее (например, линейных регрессий). Учитывая объем имеющихся у вас данных, вы все равно можете добиться хороших результатов.
  • Уменьшите количество сгибов, используемых при перекрестной проверке, возможно, с помощью отдельного набора проверок с ранней остановкой.