Lineare Regression mit unsymmetrischer Kostenfunktion?


13

Ich möchte einen Wert vorhersagen und ich versuche, eine Vorhersage zu erhalten, bei der so niedrig wie möglich ist, aber immer noch größer als . Mit anderen Worten: Y ( x ) , Y ( x ) Kosten { Y ( x ) Y ( x ) } > > Kosten { Y ( x ) Y ( x ) }Y.(x)Y.^(x)Y.(x)

Kosten{Y.(x)Y.^(x)}>>Kosten{Y.^(x)Y.(x)}

Ich denke, eine einfache lineare Regression sollte völlig in Ordnung sein. Ich weiß also etwas, wie man dies manuell implementiert, aber ich glaube, ich bin nicht der erste, der mit dieser Art von Problem konfrontiert ist. Gibt es Pakete / Bibliotheken (vorzugsweise Python), die das tun, was ich tun möchte? Nach welchem ​​Schlüsselwort muss ich suchen?

Was wäre, wenn ich eine Funktion wüsste, wobei . Wie können diese Einschränkungen am besten umgesetzt werden?Y ( x ) > Y 0 ( x )Y.0(x)>0Y.(x)>Y.0(x)


Die einfachste Lösung besteht wahrscheinlich darin, unterschiedliche Gewichte zu verwenden, je nachdem, ob die Vorhersage positiv oder negativ ist. Daran hätte ich früher denken sollen.
asPlankBridge

Antworten:


11

Wenn ich dich richtig verstehe, willst du auf der Seite der Überschätzung irren. In diesem Fall benötigen Sie eine entsprechende asymmetrische Kostenfunktion. Ein einfacher Kandidat besteht darin, den quadratischen Verlust zu optimieren:

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

Dabei ist -1<α<1 ein Parameter, mit dem Sie die Strafe der Unterschätzung gegen die Überschätzung austauschen können. Positive Werte von α beeinträchtigen die Überschätzung, daher sollten Sie α negativ setzen. In Python sieht das so ausdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2

Verlustfunktionen für zwei Werte von a

Als nächstes generieren wir einige Daten:

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

Beliebige Funktion

Schließlich werden wir unsere Regression in tensorfloweiner maschinellen Lernbibliothek von Google durchführen, die die automatisierte Differenzierung unterstützt (wodurch die gradientenbasierte Optimierung solcher Probleme einfacher wird). Ich werde dieses Beispiel als Ausgangspunkt verwenden.

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

costist der reguläre quadratische Fehler, während acostdie oben erwähnte asymmetrische Verlustfunktion ist.

Wenn Sie verwenden, erhalten costSie

1.00764 -3.32445

Kosten

Wenn Sie verwenden, erhalten acostSie

1,02604 -1,07742

Kosten

acostversucht eindeutig nicht zu unterschätzen. Ich habe nicht auf Konvergenz geprüft, aber Sie haben die Idee.


Vielen Dank für diese ausführliche Antwort: Eine Frage zur Definition der acostFunktion. Ist es wichtig, dass Sie y_model-Yzweimal kalkulieren ?
AsPlankBridge

Du meinst in Sachen Geschwindigkeit? Ich weiß es nicht; Sie müssen die Zeit selbst bestimmen, um festzustellen, ob der Tensorflow eine Neuberechnung vermeidet. Sonst ist es gut.
Emre

0

Wählen Sie eine asymmetrische Verlustfunktion. Eine Option ist die Quantilregression (linear, jedoch mit unterschiedlichen Steigungen für positive und negative Fehler).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.