具有非对称成本函数的线性回归?


13

Y(x)Y^(x)Y(x)

cost{Y(x)Y^(x)}>>cost{Y^(x)Y(x)}

我认为简单的线性回归应该可以。因此,我有点知道如何手动执行此操作,但是我想我不是第一个遇到这种问题的人。是否有任何软件包/库(最好是python)在做我想做的事情?我需要寻找什么关键字?

如果我知道函数,其中?实施这些限制的最佳方法是什么?Y0(x)>0Y(x)>Y0(x)


最简单的解决方案可能是根据预测是肯定的还是负面的来使用不同的权重。我早该想到的。
asPlankBridge

Answers:


11

如果我对您的理解正确,那么您可能会误以为是高估了。如果是这样,则需要一个适当的非对称成本函数。一种简单的选择是调整平方损失:

L:(x,α)x2(sgnx+α)2

其中是一个参数,您可以用来权衡低估与高估之间的权衡。正值会惩罚高估,因此您需要将设置为负。在python中这看起来像α α1<α<1ααdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2

两个a值的损失函数

接下来让我们生成一些数据:

import numpy
x = numpy.arange(-10, 10, 0.1)
y = -0.1*x**2 + x + numpy.sin(x) + 0.1*numpy.random.randn(len(x))

任意功能

最后,我们将在tensorflowGoogle的机器学习库中进行回归,该库支持自动区分(使此类问题的基于梯度的优化更加简单)。我将以这个示例为起点。

import tensorflow as tf

X = tf.placeholder("float") # create symbolic variables
Y = tf.placeholder("float") 

w = tf.Variable(0.0, name="coeff")
b = tf.Variable(0.0, name="offset")
y_model = tf.mul(X, w) + b

cost = tf.pow(y_model-Y, 2) # use sqr error for cost function
def acost(a): return tf.pow(y_model-Y, 2) * tf.pow(tf.sign(y_model-Y) + a, 2)

train_op = tf.train.AdamOptimizer().minimize(cost)
train_op2 = tf.train.AdamOptimizer().minimize(acost(-0.5))

sess = tf.Session()
init = tf.initialize_all_variables()
sess.run(init)

for i in range(100):
    for (xi, yi) in zip(x, y): 
#         sess.run(train_op, feed_dict={X: xi, Y: yi})
        sess.run(train_op2, feed_dict={X: xi, Y: yi})

print(sess.run(w), sess.run(b))

cost是规则平方误差,acost而是上述不对称损失函数。

如果使用,cost您会得到

1.00764 -3.32445

成本

如果使用,acost您会得到

1.02604 -1.07742

代价

acost显然不要小看。我没有检查收敛性,但是您明白了。


感谢您提供这个详细的答案:acost尽管对函数的定义存在一个问题。y_model-Y两次计算有关系吗?
asPlankBridge

你的意思是速度?我不知道; 您必须自己安排时间以查看tensorflow是否避免了重新计算。否则很好。
Emre'3

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.