似乎GridSearchCVscikit-learn 收集其(内部)交叉验证折叠的分数,然后对所有折叠的分数求平均值。我想知道这背后的理由。乍一看,收集其交叉验证折叠的预测,然后将所选评分指标应用于所有折叠的预测似乎更灵活。
我偶然发现这一点的原因是我GridSearchCV在不平衡的数据集上使用cv=LeaveOneOut()和scoring='balanced_accuracy'(scikit-learn v0.20.dev0)。对每个遗漏的样本应用诸如平衡准确度(或召回率)之类的评分指标是没有意义的。相反,我想先收集所有预测,然后将我的评分指标应用于所有预测。或者这是否涉及推理错误?
更新:我通过创建一个自定义网格搜索类来解决它,GridSearchCV不同之处在于首先从所有内部折叠中收集预测并应用一次评分指标。
我有一个A长度为 1D 的 Numpy 数组N。对于x数组中的每个元素,我想知道数组中所有元素在 [ x-eps;范围内的比例是多少;x+eps],其中eps是常数。N数量级为 15,000。
目前我是这样做的(最小的例子):
import numpy as np
N = 15000
eps = 0.01
A = np.random.rand(N, 1)
prop = np.array([np.mean((A >= x - eps) & (A <= x + eps)) for x in A])
Run Code Online (Sandbox Code Playgroud)
.. 在我的电脑上大约需要 1 秒。
我的问题:有没有更有效的方法来做到这一点?
编辑:我认为@jdehesa 在评论中的建议如下:
prop = np.isclose(A, A.T, atol=eps, rtol=0).mean(axis=1)
Run Code Online (Sandbox Code Playgroud)
这是一个很好的简洁解决方案,但没有速度优势(在我的电脑上)。