#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), чтобы уменьшить количество столбцов
- Подумайте о том, чтобы построить меньшее количество деревьев (уменьшите количество оценщиков).
- Подумайте о том, чтобы построить деревья меньшего размера (уменьшив максимальную глубину).
- Рассмотрите возможность использования других (и, как правило, более простых) моделей, работающих быстрее (например, линейных регрессий). Учитывая объем имеющихся у вас данных, вы все равно можете добиться хороших результатов.
- Уменьшите количество сгибов, используемых при перекрестной проверке, возможно, с помощью отдельного набора проверок с ранней остановкой.