Sklearn RandomizedSearchCV, оцените каждую случайную модель

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

Итак, я подготовил сетку параметров и могу запустить k-fold cv на обучающих данных.

    ## parameter grid for random search
    n_estimators = [1, 40, 80, 100, 120]
    max_features = ['auto', 'sqrt']
    max_depth = [int(x) for x in np.linspace(10, 110, num = 11)]
    max_depth.append(None)
    min_samples_split = [2, 5, 10]
    min_samples_leaf = [1, 2, 4]
    bootstrap = [True, False]
    random_grid = {'n_estimators': n_estimators,
               'max_features': max_features,
               'max_depth': max_depth,
               'min_samples_split': min_samples_split,
               'min_samples_leaf': min_samples_leaf,
               'bootstrap': bootstrap}

    rf = RandomForestRegressor()
    rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=2, n_jobs = -1)
    rf_random.fit(X_train, y_train)


Я нашел способ получить параметры лучшей модели, используя:

rf_random.best_params_

Однако я хотел перебрать все случайные модели, проверить значения их параметров, оценить их на тестовом наборе и записать значения параметров, точность и скорость в и выходной кадр данных, поэтому что-то вроде:

for model in rf_random:
   start_time_base = time.time()
   y_pred = model.predict(X_test) -> evaluate the current random model on the test data
   time = (time.time()-start_time_base)/X_test.shape[0]
   rmse = mean_squared_error(y_test, y_pred, squared=False)
   params = something to get the values of the parameters for this model
   
   write to dataframe...

Есть ли способ сделать это? Просто чтобы прояснить, я спрашиваю об итерации по моделям и параметрам, а не о записи в часть фрейма данных :) Должен ли я вместо этого использовать другой подход?


person Carlo    schedule 30.01.2021    source источник


Ответы (1)


Вы получаете df, который хотите создать, с параметрами модели и результатами CV, вызывая rf_random.cv_results_, который вы можете мгновенно поместить в df: all_results = pd.DataFrame(rf_random.cv_results_).

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

for i in range(len(all_results)):

    model = RandomForestRegressor(n_estimators = all_results['n_estimators'][i],
                                  max_features = all_results['max_features'][i],
                                  ...)
    
    model.fit(X_train, y_train)

    start_time_base = time.time()
    y_pred = model.predict(X_test) -> evaluate the current random model on the test data
    time = (time.time()-start_time_base)/X_test.shape[0]

    # Evaluate predictions however you see fit

Поскольку обученная модель сохраняется только для наилучшей комбинации параметров в RandomizedSearchCV, вам потребуется переобучить модели в этом цикле.

person Chris Schmitz    schedule 30.01.2021
comment
Звучит здорово, но мне конкретно нужно оценить скорость вывода каждой модели, поэтому я планировал сделать это на тестовом наборе позже. Могу ли я получить какую-либо информацию об этом в rf_random.cv_results_? - person Carlo; 30.01.2021
comment
Вы также можете сделать это в цикле, который я предоставил, просто запустите таймер после того, как вы снова обучили модель. Я отредактировал код соответствующим образом. - person Chris Schmitz; 30.01.2021
comment
Да, мне было интересно, смогу ли я избежать цикла в этот момент, учитывая, что, как вы указали, мне нужно будет снова обучить каждую модель. Спасибо! - person Carlo; 30.01.2021
comment
Верно. cv_results_ включает среднее и стандартное время соответствия и оценки для каждой модели. Однако, если вы хотите использовать тестовый набор задержек, вам потребуется переобучиться, так как не все объекты модели сохраняются. - person Chris Schmitz; 30.01.2021
comment
В качестве продолжения я использовал результаты cv_results, чтобы выбрать несколько более многообещающих моделей с точки зрения компромисса между скоростью и точностью, и я повторно обучил и оценил только те из них, которые были в тестовом наборе. Еще раз спасибо за большую помощь! - person Carlo; 01.02.2021