#machine-learning #scikit-learn #random-forest
#машинное обучение #scikit-learn #случайный лес
Вопрос:
Итак, я работал над своим первым проектом ML и в рамках этого я тестировал различные модели из sci-kit learn, и я написал этот фрагмент кода для модели случайного леса:
#Random Forest
reg = RandomForestRegressor(random_state=0, criterion = 'mse')
#Apply grid search for best parameters
params = {'randomforestregressor__n_estimators' : range(100, 500, 200),
'randomforestregressor__min_samples_split' : range(2, 10, 3)}
pipe = make_pipeline(reg)
grid = GridSearchCV(pipe, param_grid = params, scoring='mean_squared_error', n_jobs=-1, iid=False, cv=5)
reg = grid.fit(X_train, y_train)
print('Best MSE: ', grid.best_score_)
print('Best Parameters: ', grid.best_estimator_)
y_train_pred = reg.predict(X_train)
y_test_pred = reg.predict(X_test)
tr_err = mean_squared_error(y_train_pred, y_train)
ts_err = mean_squared_error(y_test_pred, y_test)
print(tr_err, ts_err)
results_train['random_forest'] = tr_err
results_test['random_forest'] = ts_err
Но, когда я запускаю этот код, я получаю следующую ошибку:
KeyError Traceback (most recent call last)
~anaconda3libsite-packagessklearnmetrics_scorer.py in get_scorer(scoring)
359 else:
--> 360 scorer = SCORERS[scoring]
361 except KeyError:
KeyError: 'mean_squared_error'
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<ipython-input-149-394cd9e0c273> in <module>
5 pipe = make_pipeline(reg)
6 grid = GridSearchCV(pipe, param_grid = params, scoring='mean_squared_error', n_jobs=-1, iid=False, cv=5)
----> 7 reg = grid.fit(X_train, y_train)
8 print('Best MSE: ', grid.best_score_)
9 print('Best Parameters: ', grid.best_estimator_)
~anaconda3libsite-packagessklearnutilsvalidation.py in inner_f(*args, **kwargs)
71 FutureWarning)
72 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 73 return f(**kwargs)
74 return inner_f
75
~anaconda3libsite-packagessklearnmodel_selection_search.py in fit(self, X, y, groups, **fit_params)
652 cv = check_cv(self.cv, y, classifier=is_classifier(estimator))
653
--> 654 scorers, self.multimetric_ = _check_multimetric_scoring(
655 self.estimator, scoring=self.scoring)
656
~anaconda3libsite-packagessklearnmetrics_scorer.py in _check_multimetric_scoring(estimator, scoring)
473 if callable(scoring) or scoring is None or isinstance(scoring,
474 str):
--> 475 scorers = {"score": check_scoring(estimator, scoring=scoring)}
476 return scorers, False
477 else:
~anaconda3libsite-packagessklearnutilsvalidation.py in inner_f(*args, **kwargs)
71 FutureWarning)
72 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 73 return f(**kwargs)
74 return inner_f
75
~anaconda3libsite-packagessklearnmetrics_scorer.py in check_scoring(estimator, scoring, allow_none)
403 "'fit' method, %r was passed" % estimator)
404 if isinstance(scoring, str):
--> 405 return get_scorer(scoring)
406 elif callable(scoring):
407 # Heuristic to ensure user has not passed a metric
~anaconda3libsite-packagessklearnmetrics_scorer.py in get_scorer(scoring)
360 scorer = SCORERS[scoring]
361 except KeyError:
--> 362 raise ValueError('%r is not a valid scoring value. '
363 'Use sorted(sklearn.metrics.SCORERS.keys()) '
364 'to get valid options.' % scoring)
ValueError: 'mean_squared_error' is not a valid scoring value. Use sorted(sklearn.metrics.SCORERS.keys()) to get valid options.
Итак, я попытался запустить его, удалив scoring='mean_squared_error'
из GridSearchCV(pipe, param_grid = params, scoring='mean_squared_error', n_jobs=-1, iid=False, cv=5)
. Когда я это делаю, код выполняется идеально и выдает достаточно приличную ошибку обучения и тестирования.
Независимо от этого, я не могу понять, почему с scoring='mean_squared_error'
параметром в GridSearchCV
функции выдает мне эту ошибку. Что я делаю не так?
Ответ №1:
Согласно документации:
Все объекты score следуют соглашению о том, что более высокие возвращаемые значения лучше, чем более низкие возвращаемые значения. Таким образом, метрики, которые измеряют расстояние между моделью и данными, например
metrics.mean_squared_error
, доступны как neg_mean_squared_error, которые возвращают отрицательное значение метрики.
Это означает, что вы должны пройти scoring='neg_mean_squared_error'
, чтобы оценить результаты поиска по сетке со среднеквадратичной ошибкой.
Комментарии:
1. Таким образом, показатели, которые измеряют расстояние между моделью и данными, такие как metrics.mean_squared_error, доступны как neg_mean_squared_error, которые возвращают отрицательное значение показателя. Итак, означает ли это, что mean_squared_error возвращается как отрицательное значение вместо положительного?
2. Это правильно. Когда вы, например, проверяете,
grid.best_score_
после того, как вы вызвали fit onGridSearchCV
, оно вернет отрицательное значение среднеквадратичной ошибки.