使用scikit-learn评估回归模型
我正在使用 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
1 个回答
3
就像GridSearchCV一样,RandomizedSearchCV默认使用估计器的
score
方法。像ExtraTreesRegressor这样的回归估计器会从这个方法中返回R²分数(分类器则返回准确率)。一般来说,分数是用来最大化的。而均方误差是一个需要最小化的损失函数,所以在搜索过程中它会被取反。
然后当我计算r.score(X,y)时,似乎又在报告R²。
这看起来不太好,可能算是个bug。