我需要测量模型对二元分类(0 和 1 输出)的预测的准确性。我正在使用许多不同的阈值测试我的模型,并且我的测试数据集非常大(50-1 亿个示例),因此我需要一种快速方法来计算模型的准确性。 我正在优化我的代码,注意到计算精度的标准函数比直接计算慢约 50 倍。 最小的例子:
from sklearn.metrics import accuracy_score
import numpy as np
import timeit
a=np.random.randint(0,2,1000000)
b=np.random.randint(0,2,1000000)
%timeit accuracy_score(a,b)
# 46.7 ms ± 390 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit (a==b).sum()/a.size
# 713 µs ± 7.22 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
我错过了什么吗?看起来accuracy_score是衡量准确性的标准方法。为什么这么慢?底层没有 C 优化吗?
您可以从
accuracy_score
源代码中看到它比您的比较代码片段执行了更多的工作。它也不是直接用 C 语言编写的,只是通过 NumPy 间接利用基于 C 的优化。
您未考虑的操作包括:
(a==b).sum()/a.size
您的比较代码(上面)应该总是更快,因为它不太安全且不太灵活。这就是我们有时会做出的权衡。