настройка параметров с помощью GridsearchCV не дает наилучшего результата - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь настроить параметры для моего регрессора повышения градиента.

Во-первых, только учитывая n_estimators, получая оптимальные n_estimators методом staged_predict, я получил RMSE = 4.84.

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

gbr_onehot = GradientBoostingRegressor(
    n_estimators  = 1000,
    learning_rate = 0.1,
    random_state  = 214
)
model = gbr_onehot.fit(X_train, y_train)

errors = [mean_squared_error(y_test, y_pred)
          for y_pred in gbr_onehot.staged_predict(X_test)]

best_num_trees =np.argmin(errors) 

GBR_best_num_trees_onehot = GradientBoostingRegressor(
    n_estimators  =best_num_trees,
    learning_rate = 0.1,
    random_state  = 214
)

best_num_tree_model = GBR_best_num_trees_onehot.fit(X_train, y_train)
y_pred = GBR_best_num_trees_onehot.predict(X_test)
print(best_num_trees)
print(f'RMSE with label encoding (best_num_trees) = {np.sqrt(metrics.mean_squared_error(y_test, y_pred))}')


>>> 596
>>> RMSE with label encoding (best_num_trees) = 4.849497587420823

В качестве альтернативы, на этот раз, используя GridsearchCV, я настроил n_estimator, learning_rate и max_depth для каждого дерева.

Сначала настраивается n_estimator и learning_rate:

def rmse(actual, predict):
    predict = np.array(predict)
    actual = np.array(actual)

    distance = predict - actual

    square_distance = distance ** 2

    mean_square_distance = square_distance.mean()

    score = np.sqrt(mean_square_distance)

    return score

rmse_score = make_scorer(rmse, greater_is_better=False)

p_test = {
    'learning_rate': [0.15,0.1,0.05,0.01,0.005,0.001],
    'n_estimators' : [100,250,500,750,1000,1250,1500,1750]
}



tuning = GridSearchCV(estimator=GradientBoostingRegressor(max_depth=3,
                                                         min_samples_split=2,
                                                         min_samples_leaf=1,
                                                         subsample=1,
                                                         max_features='sqrt',
                                                         random_state=214),
                     param_grid = p_test,
                     scoring = rmse_score,
                     n_jobs = 4,
                     iid=False,
                     cv=5)

tuning.fit(X_train, y_train)

, а затем используются значения из tuning.best_params_

p_test_2 = {'max_depth':[2,3,4,5,6,7]}
tuning = GridSearchCV(estimator = GradientBoostingRegressor(learning_rate=0.05,
                                                           n_estimators=1000,
                                                           min_samples_split=2,
                                                           min_samples_leaf=1,
                                                           max_features='sqrt',
                                                           random_state=214),
                      param_grid = p_test_2,
                      scoring = rmse_score,
                      n_jobs=4,
                      iid=False,
                      cv=5)

tuning.fit(X_train, y_train)

, используемые для получения оптимального параметра max_depth.

После того, как я подключил параметры, полученные сверху, и проверил его

model = GradientBoostingRegressor(
    learning_rate=0.1,
    n_estimators=1000,
    min_samples_split=2,
    min_samples_leaf=1,
    max_features='sqrt',
    random_state=214,
    max_depth=3
)

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

print(f'RMSE = {np.sqrt(metrics.mean_squared_error(y_test, y_pred))}')

>>> RMSE = 4.876534569535954

, который имеет более высокое среднеквадратичное значение, чем у меня, полученное только при использовании staged_predict. Почему это так? Кроме того, когда я печатаю (tuning.best_score_), почему он возвращает отрицательное значение?

1 Ответ

1 голос
/ 06 января 2020

Да, это так просто. Вы пытаетесь сравнить метрики RMSE с тестовыми данными, когда вы получаете наиболее подходящие параметры для ваших поездов. Это должны быть разные наборы данных с разными значениями качества. Если вы рассчитываете среднеквадратичное отклонение по данным вашего поезда - вы должны получить лучшее качество для регрессора с наилучшими параметрами подгонки.

[UPD]

Для лучшего понимания, возьмите взгляните на рисунок: enter image description here

Здесь Сложность модели соответствует некоторым вашим параметрам настройки (max_depth, et c), ошибка прогноза аналогична вашей RMSE-мере и две кривые в зависимости от вашего поезда и тестовых наборов данных. Таким образом, когда вы ищете наиболее подходящие параметры с помощью GridSearchCV - вы двигаетесь вниз по тренировочной кривой и получаете одно значение RMSE вблизи высокой позиции, но это опасная причина перегон , однако RMSE на тестовом образце не будет оптимальным.

...