如何从sklearn GridSearchCV获取MSE和R2?

6 投票
2 回答
9683 浏览
提问于 2025-04-18 15:57

我可以在一个管道上使用GridSearchCV,并指定评分方式为 'MSE''R2'。然后,我可以通过 gridsearchcv.best_score_ 来获取我指定的那个分数。那么,如何才能得到GridSearchCV找到的解决方案的另一个分数呢?

如果我再次使用另一个评分参数运行GridSearchCV,可能找不到相同的解决方案,这样它报告的分数可能和我们第一次得到的模型不对应。

也许我可以提取参数,然后把它们放到一个新的管道中,再用这个新管道运行 cross_val_score?有没有更好的方法呢?谢谢。

2 个回答

4

在 Scikit-learn 0.19 中新增

多指标评分GridSearchCV 中被引入。你可以在 这里 找到一个详细的示例。

在进行多指标评分时,你需要提供两个额外的参数:

  1. 一个你想用来评分的指标列表。

为了评估多个指标,你可以提供一个包含(唯一)字符串的列表,或者一个字典,字典的键是指标名称,值是可以调用的函数。第二点是,因为你不能同时最大化所有指标,所以你需要提供一个单一的指标(或者自定义的指标组合)来进行优化。这被称为refit参数。对于多指标评估,这个参数需要是一个字符串,表示将用于找到最佳参数以便在最后重新拟合估计器的评分器。

如果在选择最佳估计器时有其他考虑因素,而不仅仅是最大分数,refit 可以设置为一个函数,该函数根据 cv_results_ 返回选定的最佳索引。

在你的情况下,你可能想使用类似于

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_
4

现在用 GridSearchCV 或其他 sklearn 的内置方法来实现这个功能并不简单。

虽然有人提到可能会有多个评分输出的功能,但这个特性可能不会很快推出。

所以你需要自己动手,有几种方法可以尝试:

1) 你可以查看 cross_val_score 的代码,然后自己实现交叉验证的循环,每次完成一个折叠后调用你感兴趣的评分。

2) [不推荐] 你也可以根据你感兴趣的评分自己构建一个评分器,让它输出一个数组形式的评分。不过这样你会遇到这里提到的问题:sklearn - 多个评分的交叉验证

3) 由于你可以自己编写评分器,你可以创建一个评分器,输出你希望 GridSearchCV 用来做决策的评分,同时把其他你感兴趣的评分存储在一个单独的地方,比如一个静态/全局变量,或者甚至是一个文件。

第三种方法似乎是最简单且最有前景的:

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 评分,而对应的均方误差(MSE)则在 secret_mses 中。

注意,如果你使用并行处理,这可能会变得复杂。在这种情况下,你需要把评分写入一个特定的位置,比如使用内存映射。

撰写回答