我可以对一个管道使用GridSearchCV,并指定评分标准为'MSE'
或'R2'
。然后我可以通过gridsearchcv.best_score_
获取我指定的那个分数。但是,如何同时获取GridSearchCV找到的解决方案的另一个分数呢?
如果我用另一个评分参数再次运行GridSearchCV,它可能不会找到相同的解决方案,因此它报告的分数可能不对应于我们已经有了第一个值的那个模型。
也许我可以提取参数并提供给一个新的管道,然后使用cross_val_score
和新的管道运行?有没有更好的方法?谢谢。
回答:
遗憾的是,目前使用GridSearchCV
或任何内置的sklearn方法/对象来实现这一点并不简单。
虽然有关于多评分器输出的讨论,但这一功能可能不会很快实现。
所以你必须自己动手,有几种方法可以做到:
1) 你可以查看cross_val_score
的代码,并自己执行交叉验证循环,每次折叠完成后调用你感兴趣的评分器。
2) [不推荐] 你也可以基于你感兴趣的评分器构建自己的评分器,并让它们以数组形式输出分数。然后你会遇到这里解释的问题:sklearn – 使用多个分数进行交叉验证
3) 由于你可以编写自己的评分器,你可以创建一个评分器,输出你想要的分数之一(即你希望GridSearchCV
据此做出决策的分数),并将你感兴趣的所有其他分数存储在另一个地方,这可能是一个静态/全局变量,甚至是一个文件。
第三种方法似乎最不繁琐且最有前景:
import numpy as npfrom sklearn.metrics import r2_score, mean_squared_errorsecret_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_scorefrom sklearn.linear_model import Ridger2_scores = cross_val_score(Ridge(), X, y, scoring=r2_secret_mse, cv=5)
你会在r2_scores
中找到R2分数,在secret_mses
中找到对应的MSE分数。
请注意,如果你进行并行处理,这可能会变得混乱。在这种情况下,你可能需要将分数写入memmap中的特定位置,例如。