对于二元预测问题,如果真实标签是0,正确预测的收益为T_0,错误预测的损失为F_0。对于标签1,相应的收益和损失为T_1和F_1。
每个样本都有其独特的T_0、T_1、F_0、F_1。我认为我需要更改评估指标,但我不知道如何操作。因为大多数自定义评估指标只输入(预测值, 真实标签),你知道如何解决这个问题吗?
回答:
我认为一个解决办法是简单地将四个值T_0,T_1,F_0,F_1
附加到真实标签本身。由于评估指标只在训练分类器时使用一次,你的目标可以实现。
假设你以某种方式将你的真实标签从
[1, 0, 1, 1, 0, 0]
更改为如下形式:
[ [1,[T_0, F_0, T_1, F_1]], [0,[T_0, F_0, T_1, F_1]], [1,[T_0, F_0, T_1, F_1]], [1,[T_0, F_0, T_1, F_1]], [0,[T_0, F_0, T_1, F_1]], [0,[T_0, F_0, T_1, F_1]] ]
即,每个真实标签值都附带一个由T_0,T_1,F_0,F_1
组成的数组,对应于那个样本。
现在你可以这样定义你的指标:
def my_metric(y_pred,y_true): tot_sum = 0.0 for idx in range(0,len(y_pred)): if y_true[idx][0]==0: if y_pred[idx]==0: total_sum+=y_pred[idx][1][0] #增加T_0的收益 else: total_sum-=y_pred[idx][1][1] #减去F_0的损失 else: if y_pred[idx]==1: total_sum+=y_pred[idx][1][2] #增加T_1的收益 else: total_sum-=y_pred[idx][1][3] #减去F_1的损失 return total_sum
我认为使用numpy
可能有更有效的方法来做这件事,如果我找到什么,我会更新答案。然而,只要正确地将值附加到真实标签上,这应该可以正常工作。