Настройка гиперпараметра в случайном лесу - PullRequest
0 голосов
/ 29 ноября 2018

Я пытался использовать алгоритм Random Forest на Boston наборе данных, чтобы предсказать цены на жилье medv с помощью sklearn's RandomForestRegressor . Во всех попытках 3 iterations, как показано ниже

Итерация 1 : Использование модели с гиперпараметрами по умолчанию

#1. import the class/model
from sklearn.ensemble import RandomForestRegressor
#2. Instantiate the estimator
RFReg = RandomForestRegressor(random_state = 1, n_jobs = -1) 
#3. Fit the model with data aka model training
RFReg.fit(X_train, y_train)

#4. Predict the response for a new observation
y_pred = RFReg.predict(X_test)


y_pred_train = RFReg.predict(X_train)

Результаты итерации 1

{'RMSE Test': 2.9850839211419435, 'RMSE Train': 1.2291604936401441}

Итерация 2 : я использовал RandomizedSearchCV , чтобы получить оптимальные значения гиперпараметров

from sklearn.ensemble import RandomForestRegressor
RFReg = RandomForestRegressor(n_estimators = 500, random_state = 1, n_jobs = -1) 

param_grid = { 
    'max_features' : ["auto", "sqrt", "log2"],
    'min_samples_split' : np.linspace(0.1, 1.0, 10),
     'max_depth' : [x for x in range(1,20)]


from sklearn.model_selection import RandomizedSearchCV
CV_rfc = RandomizedSearchCV(estimator=RFReg, param_distributions =param_grid, n_jobs = -1, cv= 10, n_iter = 50)
CV_rfc.fit(X_train, y_train)

Таким образом, я получил best hyperparameters следующим образом

CV_rfc.best_params_
#{'min_samples_split': 0.1, 'max_features': 'auto', 'max_depth': 18}
CV_rfc.best_score_
#0.8021713812777814

Итак, я обучил новую модель с наилучшими гиперпараметрами, как показано ниже

#1. import the class/model
from sklearn.ensemble import RandomForestRegressor
#2. Instantiate the estimator
RFReg = RandomForestRegressor(n_estimators = 500, random_state = 1, n_jobs = -1, min_samples_split = 0.1, max_features = 'auto', max_depth = 18) 
#3. Fit the model with data aka model training
RFReg.fit(X_train, y_train)

#4. Predict the response for a new observation
y_pred = RFReg.predict(X_test)


y_pred_train = RFReg.predict(X_train)

Результаты итерации 2

{'RMSE Test': 3.2836794902147926, 'RMSE Train': 2.71230367772569}

Итерация 3 : я использую GridSearchCV , чтобы получить оптимальные значения гиперпараметров

from sklearn.ensemble import RandomForestRegressor
RFReg = RandomForestRegressor(n_estimators = 500, random_state = 1, n_jobs = -1) 

param_grid = { 
    'max_features' : ["auto", "sqrt", "log2"],
    'min_samples_split' : np.linspace(0.1, 1.0, 10),
     'max_depth' : [x for x in range(1,20)]

}

from sklearn.model_selection import GridSearchCV
CV_rfc = GridSearchCV(estimator=RFReg, param_grid=param_grid, cv= 10, n_jobs = -1)
CV_rfc.fit(X_train, y_train)

Итак, я получил best гиперпараметры следующим образом

CV_rfc.best_params_
#{'max_depth': 12, 'max_features': 'auto', 'min_samples_split': 0.1}
CV_rfc.best_score_
#0.8021820114800677

Результаты итерации 3

{'RMSE Test': 3.283690568225705, 'RMSE Train': 2.712331014201783}

Моя функция для оценки RMSE

def model_evaluate(y_train, y_test, y_pred, y_pred_train):
    metrics = {}
    #RMSE Test
    rmse_test = np.sqrt(mean_squared_error(y_test, y_pred))
    #RMSE Train
    rmse_train = np.sqrt(mean_squared_error(y_train, y_pred_train))

    metrics = {
              'RMSE Test': rmse_test,
              'RMSE Train': rmse_train}

    return metrics 

ИтакУ меня были ниже вопросы после 3 итераций

  1. Почему результаты настроенной модели хуже, чем модель с параметрами по умолчанию, даже когда я использую RandomSearchCV и GridSearchCV.В идеале модель должна давать хорошие результаты при настройке с перекрестной проверкой
  2. Я знаю, что перекрестная проверка будет иметь место только для комбинации значений, присутствующих в param_grid. Могут быть значения, которые хороши но не входит в мой param_grid.Итак, как мне справиться с такой ситуацией
  3. Как мне решить, какой диапазон значений я должен попробовать для max_features, min_samples_split, max_depth или, в этом отношении, любогогиперпараметры в модели машинного обучения для повышения ее точности (чтобы я мог хотя бы получить лучшую настроенную модель, чем модель с гиперпараметрами по умолчанию)

1 Ответ

0 голосов
/ 30 ноября 2018

Почему результаты настроенной модели хуже, чем у модели с параметрами по умолчанию, даже когда я использую RandomSearchCV и GridSearchCV.В идеале модель должна давать хорошие результаты при настройке с перекрестной проверкой

Ваш второй вопрос вроде отвечает на ваш первый, но я попытался воспроизвести ваши результаты в наборе данных Бостона, я получил {'test_rmse':3.987, 'train_rmse':1.442} спараметры по умолчанию, {'test_rmse':3.98, 'train_rmse':3.426} для «настроенных» параметров со случайным поиском и {'test_rmse':3.993, 'train_rmse':3.481} с сеточным поиском.Затем я использовал hyperopt со следующим пространством параметров

 {'max_depth': hp.choice('max_depth', range(1, 100)),
    'max_features': hp.choice('max_features', range(1, x_train.shape[1])),
    'min_samples_split': hp.uniform('min_samples_split', 0.1, 1)}

После примерно 200 прогонов результаты выглядели так: enter image description here, поэтому я расширил пространство до 'min_samples_split', 0.01, 1, что дало мнелучший результат {'test_rmse':3.278, 'train_rmse':1.716} с min_samples_split, равным 0,01.Согласно документации формула для min_samples_split равна ceil(min_samples_split * n_samples), что в нашем случае дает np.ceil(0.1 * len(x_train)) = 34, что может быть довольно большим для небольшого набора данных, подобного этому.

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

Как мне решить, какой диапазон значений мне следует использовать для max_features, min_samples_split, max_depth или, в этом отношении, для любых гиперпараметров в модели машинного обучения, чтобы повысить ее точность(Чтобы я мог получить лучше настроенную модель, чем модель с гиперпараметрами по умолчанию)

Вы не можете знать это заранее, поэтому вам нужно провести исследование для каждого алгоритма, чтобы увидетькакие типы пространств параметров обычно ищутся (хорошим источником для этого является kaggle, например, google kaggle kernel random forest), объединяйте их, учитывайте функции своего набора данных и оптимизируйте их, используя некоторый алгоритм байесовской оптимизации (там несколько существующих библиотек для этого), которые пытаются оптимально выбрать новое значение параметра для выбора.

...