我的分类器产生软分类,我希望从训练案例的方法结果中选择一个最佳阈值(即最大化准确度的阈值),并使用该阈值产生硬分类。虽然一般来说问题相对容易,但我发现很难优化代码,因此计算不会永远持续下去。在下面,您将找到基本上在某些虚拟数据上重新创建优化过程的代码。你能否指出我可以改善表现的任何方向?
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_pred
和y_true
进行排序,并在对y_pred
进行二值化时使用它,但这并没有带来太大的改进(除非我做错了。)
非常感谢任何帮助。
答案 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])