¿Regresión lineal con función de costo no simétrica?


13

Y(X)Y^(X)Y(X)

costo{Y(X)Y^(X)}>>costo{Y^(X)Y(X)}

Creo que una regresión lineal simple debería funcionar totalmente bien. Así que sé cómo implementar esto manualmente, pero supongo que no soy el primero con este tipo de problema. ¿Hay algún paquete / biblioteca (preferiblemente python) que haga lo que quiero hacer? ¿Cuál es la palabra clave que debo buscar?

¿Qué pasaría si supiera una función donde ? ¿Cuál es la mejor manera de implementar estas restricciones?Y0(x)>0Y(x)>Y0(x)


Probablemente, la solución más simple es usar diferentes pesos, en función de si la predicción es positiva o negativa. Debería haber pensado en eso antes.
asPlankBridge

Respuestas:


11

Si te entiendo correctamente, quieres equivocarte por sobreestimar. Si es así, necesita una función de costo asimétrica adecuada. Un candidato simple es ajustar la pérdida al cuadrado:

L:(X,α)X2(ssolnorteX+α)2

donde es un parámetro que puede utilizar para compensar la penalización de la subestimación por la sobreestimación. Los valores positivos de α penalizan la sobreestimación, por lo que querrá establecer α negativo. En python esto parece-1<α<1ααdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2

Funciones de pérdida para dos valores de un

A continuación, generemos algunos datos:

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))

Función arbitraria

Finalmente, haremos nuestra regresión en tensorflowuna biblioteca de aprendizaje automático de Google que admite la diferenciación automatizada (simplificando la optimización basada en gradiente de tales problemas). Usaré este ejemplo como punto de partida.

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))

costes el error al cuadrado regular, mientras que acostes la función de pérdida asimétrica mencionada anteriormente.

Si costusas obtienes

1.00764 -3.32445

costo

Si acostusas obtienes

1.02604 -1.07742

Un coste

acostclaramente trata de no subestimarlo. No verifiqué la convergencia, pero entiendes la idea.


Gracias por esta respuesta detallada: Sin acostembargo, hay una pregunta para la definición de la función. ¿Importa que calcules y_model-Ydos veces?
asPlankBridge

¿Quieres decir en términos de velocidad? No lo sé; tendrá que cronometrarlo usted mismo para ver si el tensorflow evita el recálculo. Está bien de lo contrario.
Emre

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.