【问题标题】:Different costs for underestimation and overestimation低估和高估的不同成本
【发布时间】:2017-12-01 03:58:26
【问题描述】:

我有一个回归问题,但成本函数不同:低估的成本高于高估的成本。例如,如果预测值 真实值,则成本为 1*(true-predicted)^2。

我正在考虑使用线性回归、随机森林等经典回归模型。我应该进行哪些修改来调整这个成本函数?

据我所知,scikit-learn 等 ML API 不提供直接修改成本函数的功能。如果我必须使用这些 API,我该怎么办?

有什么推荐的读物吗?

【问题讨论】:

    标签: machine-learning scikit-learn regression linear-regression random-forest


    【解决方案1】:

    您可以使用非对称成本函数使您的模型高估或低估。您可以将此implementation 中的成本函数替换为:

    def acost(a): return tf.pow(pred-Y, 2) * tf.pow(tf.sign(pred-Y) + a, 2)
    

    更多详情请看link

    【讨论】:

      【解决方案2】:

      您可以将 Tensorflow(或 theano)用于自定义成本函数。常见的线性回归实现是here

      要了解如何实现自定义成本函数,查看在 tensorflow 中实现的 huber 损失函数可能会对您有所帮助。这是您的自定义成本函数,您应该在链接代码中替换它而不是

      cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)
      

      在您将拥有的链接代码中:

      error = y_known - y_pred
      condition = tf.less(error, 0)
      overestimation_loss = 1 * tf.square(error)
      underestimation_loss = 3 * tf.square(error)    
      cost = tf.reduce_mean(tf.where(condition, overestimation_loss, underestimation_loss))
      

      这里当条件为真时,误差小于零,这意味着您的 y_known 小于 y_pred,因此您会高估,因此 tf.where 语句将选择 overestimation_loss,否则会低估损失。

      秘诀在于,您将计算两个损失并使用 tf.where 和条件选择使用它们的位置。

      更新:

      如果你想使用其他库,如果实现了huber loss,你可以看看得到想法,因为huber loss是一个和你的类似的条件损失函数。

      【讨论】:

        猜你喜欢
        • 2010-11-04
        • 2020-02-10
        • 2013-03-24
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        相关资源
        最近更新 更多