sklearn GridSearchCV with Pipeline

mch*_*gun 24 python scikit-learn

我是新来sklearnPipelineGridSearchCV功能.我正在尝试构建一个管道,首先对我的训练数据进行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:])
Run Code Online (Sandbox Code Playgroud)

我知道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}]
Run Code Online (Sandbox Code Playgroud)

显然这对于​​均方误差是不可能的 - 我在这里做错了什么?

Fre*_*Foo 38

这些分数是负MSE分数,即否定它们并且您获得MSE.事实上GridSearchCV,按照惯例,总是试图最大化其得分,因此必须否定像MSE这样的损失函数.


Esp*_*nta 5

创建的另一种方法GridSearchCV是使用make_scorer并将greater_is_better标志转换为False

所以,如果 clf 是你的分类器,而参数是你的超参数列表,你可以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)
Run Code Online (Sandbox Code Playgroud)

现在,与下面相同,您可以调用 GridSearch 并传递您定义的 mse

grid_obj = GridSearchCV(clf, parameters, cv=5,scoring=mse,n_jobs = -1, verbose=True)
Run Code Online (Sandbox Code Playgroud)