Байесовская оптимизация для модели Light GBM - PullRequest
5 голосов
/ 08 мая 2019

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

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

Приведенный ниже код показывает RMSE из модели Light GBM с гиперпараметрами по умолчанию, использующими фрейм данных seaborn's diamonds в качестве примера моей работы:

#pip install bayesian-optimization

import seaborn as sns
from sklearn.model_selection import train_test_split
import lightgbm as lgb
from bayes_opt import BayesianOptimization

df = sns.load_dataset('diamonds')

df["color"] = df["color"].astype('category')
df["color_cat"] = df["color"].cat.codes
df = df.drop(["color"],axis = 1)

df["cut"] = df["cut"].astype('category')
df["cut_cat"] = df["cut"].cat.codes
df = df.drop(["cut"],axis = 1)

df["clarity"] = df["clarity"].astype('category')
df["clarity_cat"] = df["clarity"].cat.codes
df = df.drop(["clarity"],axis = 1)

y = df['price']
X = df.drop(['price'], axis=1)

seed = 7
test_size = 0.3
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size,random_state=seed)

train_lgb = lgb.Dataset(X_train, y_train)
eval_lgb = lgb.Dataset(X_test, y_test, reference = train_lgb)

params = { 'objective': 'regression',
  'metric': 'RMSE',
  'learning_rate': 0.02}
lgb_reg = lgb.train(params, train_lgb, num_boost_round = 10000, early_stopping_rounds=50, verbose_eval = 100, valid_sets=eval_lgb)

Результаты

OUT:
Training until validation scores don't improve for 50 rounds.
Early stopping, best iteration is:
[1330 (n_estimators)] valid_0's rmse: 538.728

Вот моя попытка реализовать байесовскую оптимизацию и полученные значения RMSE:

def modelFitter(colsampleByTree, subsample,maxDepth, num_leaves):   
    model = lgb.LGBMRegressor(learning_rate=0.02, n_estimators=10000, max_depth=maxDepth.astype("int32"), subsample=subsample, colsample_bytree=colsampleByTree,num_leaves=num_leaves.astype("int32"))

    evalSet  = [(X_test, y_test)]
    model.fit(X_train, y_train, eval_metric="rmse", eval_set=evalSet, early_stopping_rounds=50, verbose=False)

    bestScore = model.best_score_[list(model.best_score_.keys())[0]]['rmse']

    return -bestScore

# Bounded region of parameter space
pbounds = {'colsampleByTree': (0.8,1.0), 'subsample': (0.8,1.0), 'maxDepth': (2,5), 'num_leaves': (24, 45)}

optimizer = BayesianOptimization(
    f=modelFitter,
    pbounds=pbounds,
    random_state=1)

optimizer.maximize(init_points=5,n_iter=5)  #n_iter=bayesian, init_points=random

Результаты

iter    |  target   | colsam... | maxDepth  | num_le... | subsample |
-------------------------------------------------------------------------
|  1        | -548.7    |  0.8834   |  4.161    |  24.0     |  0.8605   |
|  2        | -642.4    |  0.8294   |  2.277    |  27.91    |  0.8691   |
|  3        | -583.5    |  0.8794   |  3.616    |  32.8     |  0.937    |
|  4        | -548.7    |  0.8409   |  4.634    |  24.58    |  0.9341   |
|  5        | -583.5    |  0.8835   |  3.676    |  26.95    |  0.8396   |
|  6        | -548.7    |  0.8625   |  4.395    |  24.29    |  0.8968   |
|  7        | -548.7    |  0.8435   |  4.603    |  24.42    |  0.9298   |
|  8        | -551.5    |  0.9271   |  4.266    |  24.11    |  0.8035   |
|  9        | -548.7    |  0.8      |  4.11     |  24.08    |  1.0      |
|  10       | -548.7    |  0.8      |  4.44     |  24.45    |  0.9924   |

RMSE (-1 x «цель»), сгенерированная во время байесовской оптимизации, должна быть лучше, чем сгенерированная значениями LightGBM по умолчанию, но я не могу добиться лучшего RMSE (ища лучше / выше, чем -538.728, достигнутый с помощью вышеупомянутого «Нормальный» процесс ранней остановки).

maxDepth и num_leaves должны быть целыми числами; похоже, что есть открытый билет для принудительного применения этого (т. е. ввод «ptypes»): https://github.com/fmfn/BayesianOptimization/pull/131/files

Есть ли причина, по которой байесовская оптимизация, похоже, не находит лучшего решения с LightGBM, а с XGBoost?

1 Ответ

0 голосов
/ 23 мая 2019

Этот вопрос относится к stats.SE;Я бы посоветовал вам спросить на Мете, почему это не актуально.Это может быть слишком широким, поскольку может быть несколько возможных причин для различий.

1) Дважды проверьте, что пространство гиперпараметров, через которое вы оптимизируете, согласованно в обеих моделях.(параметры pbounds кажутся только определенными в модели LGBM прямо сейчас)

2) Если диапазон пространства поиска слишком мал, могут быть локальные максимумы при значении по умолчанию, которое обычно является эвристическим, правилом"довольно хороший" набор значений по умолчанию для запуска.

3) Обе модели являются градиентными, но имеют разные способы определения наилучшего значения разделения.Это подразумевает, что ваше пространство решений может развить различные оптимальные значения с точки зрения алгоритмов, которые могут только догадываться об их заданной архитектуре, и, если функция оптимизирует изменения, вы можете разработать, случайно, лучшийрешение со значениями гиперпараметра по умолчанию для LGBM.

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

...