Machine learning ValueError:“均方误差”不是有效的评分值

Machine learning ValueError:“均方误差”不是有效的评分值,machine-learning,scikit-learn,random-forest,Machine Learning,Scikit Learn,Random Forest,因此,我一直在从事我的第一个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,

因此,我一直在从事我的第一个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)
~\anaconda3\lib\site-packages\sklearn\metrics\_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_)

~\anaconda3\lib\site-packages\sklearn\utils\validation.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 

~\anaconda3\lib\site-packages\sklearn\model_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 

~\anaconda3\lib\site-packages\sklearn\metrics\_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:

~\anaconda3\lib\site-packages\sklearn\utils\validation.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 

~\anaconda3\lib\site-packages\sklearn\metrics\_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

~\anaconda3\lib\site-packages\sklearn\metrics\_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.

因此,我尝试通过从GridSearchCVpipe中删除scoring='mean_squared_error',param_grid=params,scoring='mean_squared_error',n_jobs=-1,iid=False,cv=5来运行它。当我这样做的时候,代码运行得非常完美,并且给出了一个相当不错的训练和测试错误

不管怎样,我不明白为什么GridSearchCV函数中的scoring='mean_squared_error'参数会抛出那个错误。我做错了什么?

根据:

所有scorer对象都遵循这样一个惯例,即返回值越高,返回值越低。因此,度量模型和数据之间距离的度量,如metrics.mean_squared_error,可以作为neg_mean_squared_error使用,它返回度量的负值

这意味着您必须通过评分根据:

所有scorer对象都遵循这样一个惯例,即返回值越高,返回值越低。因此,度量模型和数据之间距离的度量,如metrics.mean_squared_error,可以作为neg_mean_squared_error使用,它返回度量的负值


这意味着您必须通过scoring='neg_mean_squared_error',才能使用均方误差评估网格搜索结果。

因此,测量模型和数据之间距离的度量,如metrics.mean_squared_error,可以作为返回度量的负值的neg_mean_squared_error使用。那么,这是否意味着均方误差作为负值而不是正值返回?这是正确的。例如,在调用GridSearchCV上的fit后检查grid.best_score时,它将返回均方误差的负值。因此,测量模型和数据之间距离的度量,如metrics.Mean_Squared_Error,可以作为负均方误差使用,该负均方误差返回度量的负值。那么,这是否意味着均方误差作为负值而不是正值返回?这是正确的。例如,在调用GridSearchCV上的拟合后检查grid.best_score时,它将返回均方误差的负值。