【问题标题】:regression model evaluation using scikit-learn使用 scikit-learn 进行回归模型评估
【发布时间】:2014-06-13 09:27:06
【问题描述】:

我正在使用sklearn 进行回归,并使用随机网格搜索来评估不同的参数。这是一个玩具示例:

from sklearn.datasets import make_regression
from sklearn.metrics import mean_squared_error, make_scorer
from scipy.stats import randint as sp_randint
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.cross_validation import LeaveOneOut
from sklearn.grid_search import GridSearchCV, RandomizedSearchCV
X, y = make_regression(n_samples=10,
                       n_features=10,
                       n_informative=3,
                       random_state=0,
                       shuffle=False)

clf = ExtraTreesRegressor(random_state=12)
param_dist = {"n_estimators": [5, 10],
              "max_depth": [3, None],
              "max_features": sp_randint(1, 11),
              "min_samples_split": sp_randint(1, 11),
              "min_samples_leaf": sp_randint(1, 11),
              "bootstrap": [True, False]}
rmse = make_scorer(mean_squared_error, greater_is_better=False)
r = RandomizedSearchCV(clf, param_distributions=param_dist,
                       cv=10,
                       scoring='mean_squared_error',
                       n_iter=3,
                       n_jobs=2)
r.fit(X, y)

我的问题是:

1) RandomizedSearchCV 是否使用r2 作为评分函数?没有记录回归的默认评分函数是什么。

2) 即使我在代码中使用mean_squared_error 作为评分函数,为什么分数是负数(如下所示)? mean_squared_error 应该都是正面的。然后当我计算r.score(X,y) 时,似乎又报告了R2。所有这些情况下的分数让我很困惑。

In [677]: r.grid_scores_
Out[677]: 
[mean: -35.18642, std: 13.81538, params: {'bootstrap': True, 'min_samples_leaf': 9, 'n_estimators': 5, 'min_samples_split': 3, 'max_features': 3, 'max_depth': 3},
 mean: -15.07619, std: 6.77384, params: {'bootstrap': False, 'min_samples_leaf': 7, 'n_estimators': 10, 'min_samples_split': 10, 'max_features': 10, 'max_depth': None},
 mean: -17.91087, std: 8.97279, params: {'bootstrap': True, 'min_samples_leaf': 7, 'n_estimators': 10, 'min_samples_split': 7, 'max_features': 7, 'max_depth': None}]

In [678]: r.grid_scores_[0].cv_validation_scores
Out[678]: 
array([-37.74058826, -26.73444271, -36.15443525, -23.11874605,
       -33.60726519, -33.4821689 , -36.14897322, -43.80499446,
       -68.50480995, -12.97342433])

In [680]: r.score(X,y)
Out[680]: 0.87989839693054017

【问题讨论】:

  • 也许分数是负数,因为优化引擎只能最小化目标函数。

标签: python scikit-learn regression


【解决方案1】:
  1. 与 GridSearchCV 一样,RandomizedSearchCV 默认使用估计器上的score 方法。 ExtraTreesRegressor 和其他回归估计器从此方法返回 R² 分数(分类器返回准确度)。

  2. 按照惯例,分数是要最大化的东西。均方误差是最小化的损失函数,因此在搜索中被否定。

然后当我计算 r.score(X,y) 时,似乎又报告了 R2。

这不漂亮。这可以说是一个错误。

【讨论】:

  • 谢谢,拉尔斯曼。从 API 文档来看,在我看来,ExtraTreesRegressor 的默认 score R2 与计算平方相关系数的方式不同。是否有任何网页解释为什么 R2 是这样实现的?
  • 我刚刚发现多个其他线程在 stackoverflow 上询问损失函数的否定。对一般用户来说似乎很混乱?
  • 参见this question 和其中引用的关于预测建模中r^2 的快速解释
猜你喜欢
  • 2016-06-17
  • 2018-07-31
  • 2020-01-02
  • 2019-04-27
  • 2016-10-03
  • 2018-05-26
  • 2017-12-31
  • 2016-05-16
相关资源
最近更新 更多