我可以在管道上使用GridSearchCV,并指定评分为'MSE'
或'R2'
。然后,我可以访问gridsearchcv._best_score
以恢复我指定的那个。我如何获得GridSearchCV找到的解决方案的其他分数?
如果我再次使用其他评分参数运行GridSearchCV,它可能找不到相同的解决方案,因此它报告的分数可能与我们拥有第一个值的模型不对应。
也许我可以提取参数并将它们提供给新的管道,然后使用新管道运行cross_val_score
?有没有更好的办法?感谢。
答案 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)
多指标评分已在GridSearchCV中引入。 可以找到一个广泛的示例here。
执行多指标评分时,您应该提供两个额外的参数:
要评估多个指标,请给出(唯一的)字符串列表或以名称为键,将可调用项为值的字典。
对于多指标评估,它必须是一个表示计分器的字符串,该计分器将被用来寻找最佳参数,以最后重新拟合估计器。
在选择最佳估算器时,除了最大分数之外,还可以考虑将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_