настройка гиперпараметров в sklearn с использованием RandomizedSearchCV занимает много времени

Я имею дело с набором данных, состоящим из 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-го поколения. Может ли кто-нибудь помочь мне разобраться с этой проблемой. Заранее спасибо.


person ratan rohith    schedule 03.06.2018    source источник


Ответы (2)


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

  • имея полмиллиона образцов,
  • используя повышение градиента с множеством ансамблей,
  • наличие большой сетки поиска в целом
  • выполнение 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. Оба они должны поддерживать обучение графическому процессору, поэтому, если у вас есть графический процессор CUDA, вы также можете его использовать.

person user59271    schedule 03.06.2018
comment
Также обратите внимание, что оба упомянутых пакета GBM позволяют тренироваться с ранней остановкой, что позволит вам убрать n_estimators из поиска параметров. - person Mischa Lisovyi; 04.06.2018

Глядя на вашу сетку параметров, вы можете изменить некоторые вещи, которые сразу же сократят время выполнения без особых жертв:

  1. verbose =5. Пожалуйста, удалите это, потому что это занимает кучу времени. Все, что он делает, это печатает производительность каждого дерева. Вам действительно нужны все эти визуальные отвлекающие факторы?
  2. return_train_score = True. Вам действительно нужно сохранить тренировочный счет? Скорее всего нет. Вы можете удалить его, чтобы сэкономить время.
  3. Потеря huber занимает намного больше времени, чем ls, потому что это комбинация ls и lad. Если ваши данные не имеют необоснованных выбросов, используйте потери по умолчанию. Если вы должны использовать потери huber, попробуйте сначала на меньшей выборке.

Кстати, в sklearn GradientBoostingRegressor max_features = 'auto' и None означают одно и то же.

person Sarah    schedule 04.01.2020