настройка гиперпараметров в sklearn с использованием RandomizedSearchCV занимает много времени - PullRequest
0 голосов
/ 03 июня 2018

Я имею дело с набором данных, состоящим из 13 объектов и 550068 строк.Я сделал k-кратную перекрестную проверку и выбрал значение k как 10, а затем выбрал лучшую модель с наименьшей среднеквадратичной ошибкой, в моем случае модель - регрессор повышения градиента.Затем я выполнил настройку гиперпараметра, вот мой код:

from sklearn.ensemble GradientBoostingRegressor
gradientboost = GradientBoostingRegressor(n_estimators = 300)
from sklearn.model_selection import RandomizedSearchCV
loss = ['ls', 'lad', 'huber']
n_estimators = [100, 500, 900, 1100, 1500]
max_depth = [2, 3, 5, 10, 15]
min_samples_leaf = [1, 2, 4, 6, 8] 
min_samples_split = [2, 4, 6, 10]
max_features = ['auto', 'sqrt', 'log2', None]

# Define the grid of hyperparameters to search
hyperparameter_grid = {'loss': loss,
    'n_estimators': n_estimators,
    'max_depth': max_depth,
    'min_samples_leaf': min_samples_leaf,
    'min_samples_split': min_samples_split,
    'max_features': max_features}

# Set up the random search with 4-fold cross validation
random_cv = RandomizedSearchCV(estimator=gradientboost,
            param_distributions=hyperparameter_grid,
            cv=4, n_iter=50,
            scoring = 'neg_mean_absolute_error',n_jobs = 4,
            verbose = 5, 
            return_train_score = True,
            random_state=42)
random_cv.fit(features,target)

На настройку гиперпараметра у меня ушло много времени, это заняло почти 48 часов, но еще не завершено. Я пробовал разные значения n_jobs, n_iters и cv, нопроцесс не ускоряется. введите описание изображения здесь . Я также разделил свой набор данных на 5 равных частей и попытался настроить параметры на одной части

dataframe_splits = np.array_split(dataframe, 5)
features = dataframe_splits[0].drop(columns= 
['Purchase','User_ID', 'Product_ID'])
target = dataframe_splits[0]['Purchase']

Но это не работает.Это занимает много времени и для отдельной части.Я использую ОС windows10 и процессор Intel i5 7-го поколения. Может кто-нибудь помочь мне разобраться в этой проблеме.Заранее спасибо.

1 Ответ

0 голосов
/ 03 июня 2018

Это комбинация из нескольких вещей:

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

Обучение таким вещам на локальной машине не продвинет вас далеко.Если вы не обучаете модель производственного уровня (но больше похожи на сторонний или университетский проект), попробуйте следующее:

  • сделайте ваш образец намного меньше (скажем, 10 тыс. Образцов),
  • постарайтесь получить хорошее представление о том, что делает каждый гиперпамер и как работает повышение градиента.Например, в вашей сетке функция потерь, которую вы используете, не будет иметь такого большого значения, тогда как вы упускаете очень важный параметр 'learning_rate'.То же самое касается 'max_features' - 'auto' и 'none' по существу делают одно и то же, и это хорошая идея, чтобы попытаться поэкспериментировать с некоторыми плавающими там.
  • настроить меньше параметров.В настоящее время вы выбираете 50 из 3 * 5 * 5 * 5 * 4 * 4 = 6000 возможных комбинаций.Вы можете начать с сетки меньшего размера (скажем, 100/200 возможных комбинаций) и выбрать меньше комбинаций, посмотреть, какие параметры вносят самые большие изменения, а затем попытаться настроить их по очереди, но не все одновременно.Самый дорогой параметр - это n_estimators, поскольку он объединяет деревья n_estimators в ансамбль, образуя полную модель.Хорошим началом было бы найти приблизительное количество оценок, которые сначала находятся на грани компромисса «смещение / дисперсия», а затем поместить их в сетку.
  • уменьшить число k до 8 или даже 5Это должно резко сократить время работы.

Если вы делаете это для производственного масштаба и хотите использовать весь набор данных, вам потребуется получить некоторые дополнительные мощные вычислительные ресурсы, такие как виртуальная машина, и / или использовать другой пакет длятренировочные градиентные деревья, такие как xgboost или LightGBM .Оба они должны поддерживать обучение на GPU, поэтому, если у вас есть CUDA GPU, вы также можете использовать его.

...