Simetrik olmayan maliyet fonksiyonu ile doğrusal regresyon?


13

Bazı değerini tahmin etmek istiyorum ve olabildiğince düşük olmakla birlikte yine de den daha büyük olmak için optimize edilen bazı tahmin almaya çalışıyorum . Başka bir deyişle: Y(x)Y^(x)Y(x)

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

Bence basit bir doğrusal regresyon tamamen iyi olmalı. Bu yüzden bunu manuel olarak nasıl uygulayacağımı biliyorum, ama sanırım bu tür bir sorunu olan ilk kişi ben değilim. Ne yapmak istediğimi yapan herhangi bir paket / kütüphane (tercihen python) var mı? Aramam gereken anahtar kelime nedir?

Y_0 (x)> 0 fonksiyonunu bilsemY0(x)>0 , Y(x)>Y0(x) . Bu kısıtlamaları uygulamanın en iyi yolu nedir?


Muhtemelen, en basit çözüm, tahminin pozitif veya negatif olmasına bağlı olarak farklı ağırlıklar kullanmaktır. Bunu daha önce düşünmeliydim.
asPlankBridge

Yanıtlar:


11

Seni doğru anlarsam, fazla tahmin etmenin yanına girmek istersiniz. Eğer öyleyse, uygun, asimetrik bir maliyet fonksiyonuna ihtiyacınız vardır. Basit bir aday, kare kaybını düzeltmektir:

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

burada , fazla hesaplamaya karşı hafife alma cezasını takas etmek için kullanabileceğiniz bir parametredir. pozitif değerleri fazla tahmin yapmayı cezalandırır, bu nedenle negatif ayarlamak isteyeceksiniz . Python'da bu gibi görünüyor1<α<1ααdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2

A'nın iki değeri için kayıp fonksiyonları

Şimdi biraz veri üretelim:

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

Keyfi işlev

Son olarak, tensorflowGoogle'dan otomatik farklılaştırmayı destekleyen (bu tür sorunların gradyan tabanlı optimizasyonunu basitleştiren) bir makine öğrenme kütüphanesi olan regresyonumuzu yapacağız . Bu örneği bir başlangıç ​​noktası olarak kullanacağım .

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

costacostyukarıda belirtilen asimetrik kayıp fonksiyonu , normal kare hatasıdır .

Eğer kullanırsanız costsize olsun

1.00764 -3.32445

maliyet

Eğer kullanırsanız acostsize olsun

1.02604 -1.07742

acost

acostaçıkça hafife almamaya çalışır. Yakınsama için kontrol etmedim, ama fikri anladınız.


Bu ayrıntılı cevap için teşekkür ederim: acostAncak fonksiyonun tanımına bir soru . y_model-Yİki kez hesaplamanız önemli mi?
asPlankBridge

Hız açısından mı demek istiyorsun? Bilmiyorum; tensorflow'un yeniden hesaplamayı önleyip önlemediğini görmek için kendiniz zamanlamanız gerekir. Aksi takdirde gayet iyi.
Emre

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.