使用Pipeline的sklearn GridSearchCV

33
我正在尝试构建一个流水线,首先对我的训练数据进行随机主成分分析(RandomizedPCA),然后拟合一个岭回归模型。以下是我的代码:
pca = RandomizedPCA(1000, whiten=True)
rgn = Ridge()

pca_ridge = Pipeline([('pca', pca),
                      ('ridge', rgn)])

parameters = {'ridge__alpha': 10 ** np.linspace(-5, -2, 3)}

grid_search = GridSearchCV(pca_ridge, parameters, cv=2, n_jobs=1, scoring='mean_squared_error')
grid_search.fit(train_x, train_y[:, 1:])

我知道关于RidgeCV函数,但我想尝试一下Pipeline和GridSearch CV。
我希望网格搜索CV能报告RMSE误差,但是在sklearn中似乎不支持这个功能,所以我只能使用MSE。然而,它报告的分数是负数。
In [41]: grid_search.grid_scores_
Out[41]: 
[mean: -0.02665, std: 0.00007, params: {'ridge__alpha': 1.0000000000000001e-05},
 mean: -0.02658, std: 0.00009, params: {'ridge__alpha': 0.031622776601683791},
 mean: -0.02626, std: 0.00008, params: {'ridge__alpha': 100.0}]

显然,对于均方误差来说这是不可能的 - 我在这里做错了什么?
5个回答

48

这些得分是负的MSE得分,即将它们取反就是MSE。问题在于,GridSearchCV按照惯例始终尝试“最大化”其得分,因此必须对类似MSE的损失函数取反。


1
你能指出任何关于此的文档吗?或者这是基于你的测试得出的结论吗? - Chau Pham
https://github.com/scikit-learn/scikit-learn/issues/2439 (我个人认为应该是负面的,而不是“否定”的) - Heberto Mayorquin
1
我现在有点困惑。在model.compile()中,我是应该使用'neg_mean_squared_error'作为"loss"和"metric"还是'mean_squared_error'? - Ben

7
创建GridSearchCV的另一种方法是使用make_scorer函数,并将greater_is_better标志设置为False
因此,如果rgn是您的回归模型,而parameters是您的超参数列表,您可以像这样使用make_scorer函数:
from sklearn.metrics import make_scorer
#define your own mse and set greater_is_better=False
mse = make_scorer(mean_squared_error,greater_is_better=False)

现在,和下面一样,你可以调用GridSearch并传递你定义的mse。
grid_obj = GridSearchCV(rgn, parameters, cv=5,scoring=mse,n_jobs = -1, verbose=True)

0
如果您想将RMSE作为指标,可以编写自己的可调用/函数,该函数将获取Y_pred和Y_org并计算RMSE。 ref

0

您可以在文档中看到评分

enter image description here


1
问题要求解释为什么RMSE值会变成负数;这似乎不是问题的答案。 - gust
@Gust,有一个“neg_root_mean_squared_error”,我以为获取RMSE会很容易,不是吗? - chaoyu feng
@JeremyCaney 感谢您的建议,这是 scikit learn 评分文档的链接 https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter - chaoyu feng

0
假设我已经将GridSearchCV获得的负MSE和负MAE结果存储在名为model_nmse和model_nmae的列表中。
因此,我只需将其乘以(-1),即可获得所需的MSE和MAE分数。
model_mse = list(np.multiply(model_nmse , -1))

model_mae = list(np.multiply(model_nmae , -1))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接