【问题标题】:Unique true/false loss for every sample每个样本的唯一真/假损失
【发布时间】:2018-03-07 20:22:29
【问题描述】:

对于二元预测问题,如果真实标签为0,则正确预测的增益为T_0,错误预测的损失为F_0。 1、T_1、F_1 也一样。

每个样本都有其独特的 T_0、T_1、F_0、F_1。我想我需要更改评估指标,但我不知道该怎么做。因为大部分自定义的 eval metric 只输入(pred,true label),你知道我该如何解决这个问题吗?

【问题讨论】:

  • 你能举个例子吗?
  • 例如足球赌博。我为赌博支付 1 美元。如果我的预测是错误的,那么我将失去 1 美元。所以F_0,F_1等于1。另一方面,如果我的预测是正确的,并且0队获胜,我将获得额外的T_0。 1队的正确预测也一样,我会得到额外的T_1。

标签: machine-learning scikit-learn xgboost


【解决方案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 也可能有一种有效的方法,如果我发现了什么,我会更新答案。但是,只要将值正确附加到基本事实,这应该可以正常工作。

【讨论】:

  • 对不起,scikit-learn 不允许多列标签。 (ValueError:未知标签类型:'连续多输出')。 XGboost 也一样(ValueError: DataFrame for label cannot have multiple columns)。
  • 您可以尝试使用附加值的全局数组或数据框?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 2021-10-24
  • 2020-06-28
  • 2022-09-22
相关资源
最近更新 更多