Ошибка значения: ‘mean_squared_error’ не является допустимым значением оценки

#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 on GridSearchCV , оно вернет отрицательное значение среднеквадратичной ошибки.