每个样品的独特真/假损失

时间:2017-09-26 14:35:29

标签: machine-learning scikit-learn xgboost

对于二进制预测问题,如果真实标签为0,则右预测的增益为T_0,错误预设的损失为F_0。 1,T_1,F_1相同。

每个样本都有其唯一的T_0,T_1,F_0,F_1。我想我需要更改eval指标,但我不知道该怎么做。由于大多数自定义eval指标仅输入(pred,true label),您知道如何解决问题吗?

1 个答案:

答案 0 :(得分: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]   #Add gain for T_0
            else:
                total_sum-=y_pred[idx][1][1]   #Subtract loss for F_0
        else:
            if y_pred[idx]==1:
                total_sum+=y_pred[idx][1][2]   #Add gain for T_1
            else:
                total_sum-=y_pred[idx][1][3]   #Subtract loss for F_1
return total_sum

我认为使用numpy也可能有一种有效的方法,如果我发现了什么,我会更新答案。但是,只要将值正确附加到基础事实上,这应该可以正常工作。