Является ли мое расхождение между кросс-вальтом и результатами тестов проблематичным? - PullRequest
0 голосов
/ 07 мая 2019

Я использую модель случайного леса с обширной перекрестной проверкой, а затем сравниваю grid.best_scorer, который, как я полагаю, представляет собой mean_test_score из GridSearch, с моим фактическим задержанным набором. Результаты имеют несоответствие, которого не было до того, как я изменил свои параметры.

Я не уверен, что, если заключить, что переоснащение мало или вообще не нужно, мой gridSearch mean_train_score должен быть похож на мой mean_test_score, или если мой mean_test_score должен быть аналогичен баллу из моего протяженного набора.

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

РЕДАКТИРОВАТЬ: Если я увеличу min_samples_leaf, мой RMSE немного повысится, однако и CV, и результаты тестов очень похожи. Это было бы правильным шагом для предотвращения переоснащения, верно?

def rf(df, score):

    X_train, X_test, y_train, y_test = train_test(df)

    params = {'n_estimators': [400, 700, 1000],
              'max_features': ['sqrt', 'auto'],
              'min_samples_split': [2, 3],
              'min_samples_leaf': [1, 2, 3],
              'max_depth': [50, 100, None],
              'bootstrap': [True, False]
}

    scorers = {'RMSE': make_scorer(rmse, greater_is_better=False),
               'MAE': make_scorer(mean_absolute_error, greater_is_better=False),
               'R2': make_scorer(r2_score)}

    cv = RepeatedKFold(n_splits=10, n_repeats=7)


    grid = GridSearchCV(estimator=RandomForestRegressor(random_state=random.seed(42)),
                              param_grid=params, 
                              verbose=1, 
                              cv=cv, 
                              n_jobs =-1, 
                              scoring=scorers, 
                              refit = score)

    grid = grid.fit(X_train, y_train)    

    print('Parameters used:', grid.best_params_)

    if score  == 'RMSE':
        print('RMSE score on CV:', round(-1*grid.best_score_,4))
        print('RMSE score on test: ', round(-1*grid.score(X_test, y_test),4))

    elif score == 'R2':
        print('R Squared CV on train:', round(grid.best_score_,4))
        print('R Squared score on test: ', round(grid.score(X_test, y_test),4))

    elif score == 'MAE':
        print('MAE score on CV:', round(-1*grid.best_score_,4))
        print('MAE score on test: ', round(-1*grid.score(X_test, y_test),4))

Используемые параметры: {'bootstrap': False, 'max_depth': 100, 'max_features': 'sqrt', 'min_samples_leaf': 1, 'min_samples_split': 2, 'n_estimators': 400}

RMSE балл по CV: 8,489 RMSE оценка по тесту: 5,7952

Я надеялся сократить разрыв между этими двумя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...