我可以在管道上使用GridSearchCV并指定评分为'MSE'
或'R2'
。然后我可以访问gridsearchcv.best_score_
来恢复我指定的那个。我如何获得GridSearchCV找到的解决方案的其他分数?
如果我用另一个评分参数再次运行GridSearchCV,它可能找不到相同的解决方案,因此它报告的分数可能与我们拥有第一个值的分数不对应于相同的模型。
也许我可以提取参数并将它们提供给一个新的管道,然后用新的管道运行cross_val_score
?有没有更好的办法?谢谢。
不幸的是,现在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分数,在secret_mses
中可以找到相应的mse。
注意,如果并行,这可能会变得混乱。在这种情况下,您需要将分数写入memmap中的特定位置,例如
新增于Scikit-learn 0.19
多指标评分在GridSearchCV中引入。在这里可以找到一个广泛的例子。
在执行多指标评分时,您应该提供2个额外的参数:
- 您要用于评分的所有指标列表。
对于评估多个指标,要么给出一个(唯一的)字符串列表,要么给出一个以名称作为键、可调用对象作为值的字典。2. 由于您不能一次最大化所有指标,因此您需要提供您想要优化的单个指标(或指标的自定义组合)。这是作为refit参数提供的。对于多度量评估,这需要是一个字符串,表示评分者,该评分者将用于找到最佳参数,以便在最后重新调整估计器。
如果在选择最佳估计器时考虑的不是最大分数,则可以将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_