如何计算最佳准确度阈值

时间:2015-06-08 19:40:52

标签: python numpy machine-learning

我的分类器产生软分类,我希望从训练案例的方法结果中选择一个最佳阈值(即最大化准确度的阈值),并使用该阈值产生硬分类。虽然一般来说问题相对容易,但我发现很难优化代码,因此计算不会永远持续下去。在下面,您将找到基本上在某些虚拟数据上重新创建优化过程的代码。你能否指出我可以改善表现的任何方向?

y_pred = np.random.rand(400000)
y_true = np.random.randint(2, size=400000)
accs = [(accuracy_score(y_true, y_pred > t), t) for t in np.unique(y_pred)]
train_acc, train_thresh = max(accs, key=lambda pair: pair[0])

我意识到我可以在循环之前对y_predy_true进行排序,并在对y_pred进行二值化时使用它,但这并没有带来太大的改进(除非我做错了。)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

排序y_pred 后续并使用Kadane's Algorithm计算索引i,使y_true的子数组从0到{{1}有最大总和。您的最佳阈值i则为b。这将是SVM给你的输出,即超平面(或你的1维情况,一个阈值),它可以最大化类之间的差距。

答案 1 :(得分:0)

我用python写了一个辅助函数:

def opt_threshold_acc(y_true, y_pred):
    A = list(zip(y_true, y_pred))
    A = sorted(A, key=lambda x: x[1])
    total = len(A)
    tp = len([1 for x in A if x[0]==1])
    tn = 0
    th_acc = []
    for x in A:
        th = x[1]
        if x[0] == 1:
            tp -= 1
        else:
            tn += 1
        acc = (tp + tn) / total
        th_acc.append((th, acc))
    return max(th_acc, key=lambda x: x[1])