低估和高估的不同成本

时间:2017-06-27 23:23:36

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

我有回归问题,但成本函数不同:低估的成本高于高估成本。例如,如果预测值<1。真值,成本将是3 *(真实预测)^ 2;如果预测值>真值,成本将是1 *(真实预测)^ 2。

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

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

任何推荐阅读?

2 个答案:

答案 0 :(得分:1)

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

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

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和condition来计算两种损失并选择使用它们的位置。

<强>更新

如果您想使用其他库,如果实施了huber loss,您可以查看获取想法,因为huber loss是一个类似于您的条件丢失函数。

答案 1 :(得分:0)

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

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

有关更多详细信息,请参见此link