如何从sklearn GridSearchCV获取MSE和R2?

时间:2014-08-04 18:27:55

标签: python machine-learning statistics scikit-learn

我可以在管道上使用GridSearchCV,并指定评分为'MSE''R2'。然后,我可以访问gridsearchcv._best_score以恢复我指定的那个。我如何获得GridSearchCV找到的解决方案的其他分数?

如果我再次使用其他评分参数运行GridSearchCV,它可能找不到相同的解决方案,因此它报告的分数可能与我们拥有第一个值的模型不对应。

也许我可以提取参数并将它们提供给新的管道,然后使用新管道运行cross_val_score?有没有更好的办法?感谢。

2 个答案:

答案 0 :(得分:3)

不幸的是,现在使用GridSearchCV或任何内置的sklearn方法/对象都不是直截了当的。

虽然有人说有多个得分手输出,但这个功能很可能不会很快出现。

所以你必须自己做,有几种方法:

1)您可以查看cross_val_score的代码并自行执行交叉验证循环,每次折叠完成后调用感兴趣的记分器。

2)[不推荐]你也可以从你感兴趣的得分手中建立自己的得分手,让他们输出得分作为数组。然后你会发现自己解决了这里解释的问题: sklearn - Cross validation with multiple scores

3)既然你可以code your own scorers,你就可以让一个得分手输出你的一个分数(你希望GridSearchCV做出决定的分数),并存储你所有其他分数的分数感兴趣的是一个单独的地方,可能是静态/全局变量,甚至是文件。

3号似乎是最乏味和最有希望的:

import numpy as np
from sklearn.metrics import r2_score, mean_squared_error
secret_mses = []

def r2_secret_mse(estimator, X_test, y_test):
    predictions = estimator.predict(X_test)
    secret_mses.append(mean_squared_error(y_test, predictions))
    return r2_score(y_test, predictions)

X = np.random.randn(20, 10)
y = np.random.randn(20)

from sklearn.cross_validation import cross_val_score
from sklearn.linear_model import Ridge

r2_scores = cross_val_score(Ridge(), X, y, scoring=r2_secret_mse, cv=5)

您会在r2_scores中找到R2分数,在secret_mses中找到相应的MSE。

请注意,如果你并行,这可能会变得混乱。在这种情况下,您需要将分数写入memmap中的特定位置。

答案 1 :(得分:1)

已在Scikit学习0.19中添加

多指标评分已在GridSearchCV中引入。 可以找到一个广泛的示例here

执行多指标评分时,您应该提供两个额外的参数:

  1. 您要用于得分的所有指标的列表。
      

    要评估多个指标,请给出(唯一的)字符串列表或以名称为键,将可调用项为值的字典。

  2. 由于不能一次最大化所有指标,因此需要提供要优化的单个指标(或指标的自定义组合)。
      

    对于多指标评估,它必须是一个表示计分器的字符串,该计分器将被用来寻找最佳参数,以最后重新拟合估计器。

         

    在选择最佳估算器时,除了最大分数之外,还可以考虑将refit设置为一个函数,该函数在给定cv_results_的情况下返回所选的best_index _。

在您的情况下,您想使用类似

cv=GridSearchCV(DecisionTreeClassifier(random_state=42),
                  param_grid={'min_samples_split': range(2, 403, 10)},
                  scoring=['neg_mean_squared_error', 'r2'], cv=5, refit='r2')
cv.fit(x,y)

然后您可以使用以下方法分析详细的效果:

cv.cv_results_