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( s g n x + α )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
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))
Schließlich werden wir unsere Regression in tensorflow
einer 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))
cost
ist der reguläre quadratische Fehler, während acost
die oben erwähnte asymmetrische Verlustfunktion ist.
Wenn Sie verwenden, erhalten cost
Sie
1.00764 -3.32445
Wenn Sie verwenden, erhalten acost
Sie
1,02604 -1,07742
acost
versucht eindeutig nicht zu unterschätzen. Ich habe nicht auf Konvergenz geprüft, aber Sie haben die Idee.