Я использую модель случайного леса с обширной перекрестной проверкой, а затем сравниваю 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
Я надеялся сократить разрыв между этими двумя