Jika saya mengerti Anda dengan benar, Anda ingin berbuat salah di sisi perkiraan terlalu tinggi. Jika demikian, Anda memerlukan fungsi biaya asimetris yang sesuai. Satu kandidat sederhana adalah untuk mengubah kerugian kuadrat:
L:(x,α)→x2(sgnx+α)2
di mana adalah parameter yang dapat Anda gunakan untuk menukar penalti perkiraan terlalu rendah terhadap perkiraan terlalu tinggi. Nilai positif dari menghukum penilaian berlebihan, jadi Anda ingin mengatur negative. Dalam python ini terlihat seperti−1<α<1ααdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2
Selanjutnya mari kita menghasilkan beberapa data:
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))
Akhirnya, kami akan melakukan regresi kami di tensorflow
, pustaka pembelajaran mesin dari Google yang mendukung diferensiasi otomatis (membuat optimasi berbasis gradien dari masalah seperti itu lebih mudah). Saya akan menggunakan contoh ini sebagai titik awal.
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
adalah kesalahan kuadrat biasa, sedangkan acost
fungsi kerugian asimetris tersebut di atas.
Jika Anda menggunakan cost
Anda dapatkan
1,00764 -3,32445
Jika Anda menggunakan acost
Anda dapatkan
1.02604 -1.07742
acost
jelas berusaha untuk tidak meremehkan. Saya tidak memeriksa konvergensi, tetapi Anda mendapatkan ide.