如何从sklearn GridSearchCV获取MSE和R2?
我可以在一个管道上使用GridSearchCV,并指定评分方式为 'MSE'
或 'R2'
。然后,我可以通过 gridsearchcv.best_score_
来获取我指定的那个分数。那么,如何才能得到GridSearchCV找到的解决方案的另一个分数呢?
如果我再次使用另一个评分参数运行GridSearchCV,可能找不到相同的解决方案,这样它报告的分数可能和我们第一次得到的模型不对应。
也许我可以提取参数,然后把它们放到一个新的管道中,再用这个新管道运行 cross_val_score
?有没有更好的方法呢?谢谢。
2 个回答
在 Scikit-learn 0.19 中新增
多指标评分在 GridSearchCV 中被引入。你可以在 这里 找到一个详细的示例。
在进行多指标评分时,你需要提供两个额外的参数:
- 一个你想用来评分的指标列表。
为了评估多个指标,你可以提供一个包含(唯一)字符串的列表,或者一个字典,字典的键是指标名称,值是可以调用的函数。第二点是,因为你不能同时最大化所有指标,所以你需要提供一个单一的指标(或者自定义的指标组合)来进行优化。这被称为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_
现在用 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
中。
注意,如果你使用并行处理,这可能会变得复杂。在这种情况下,你需要把评分写入一个特定的位置,比如使用内存映射。