Лінійна регресія з несиметричною функцією витрат?


13

Y(x)Y^(x)Y(x)

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

Я думаю, що проста лінійна регресія повинна зробити абсолютно чудово. Тож я дещо знаю, як це реалізувати вручну, але, мабуть, я не перший із подібними проблемами. Чи є там якісь пакети / бібліотеки (бажано python), які роблять те, що я хочу зробити? Яке ключове слово потрібно шукати?

Що робити, якщо я знав функцію де . Який найкращий спосіб здійснити ці обмеження?Y ( x ) > Y 0 ( x )Y0(x)>0Y(x)>Y0(x)


Напевно, найпростішим рішенням є використання різної ваги, виходячи з того, чи є прогноз позитивним чи негативним. Я повинен був подумати про це раніше.
asPlankBridge

Відповіді:


11

Якщо я вас правильно зрозумів, ви хочете помилитися з боку переоцінки. Якщо це так, вам потрібна відповідна асиметрична функція витрат. Один з простих кандидатів - це виправити втрати в квадраті:

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

де - параметр, який можна використовувати для вимкнення штрафу заниження і завищення. Позитивні значення штрафують завищення, тому вам потрібно встановити негатив. У python це виглядає такα α1<α<1ααdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2

Функції втрати для двох значень a

Далі генеруємо деякі дані:

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

Довільна функція

Нарешті, ми зробимо наш регрес у tensorflowбібліотеці машинного навчання від Google, яка підтримує автоматизовану диференціацію (спрощуючи оптимізацію таких проблем на градієнті). Я буду використовувати цей приклад як вихідний пункт.

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є регулярною помилкою у квадраті, тоді acostяк згадана асиметрична функція втрат.

Якщо ви використовуєте, costви отримуєте

1.00764 -3.32445

вартість

Якщо ви використовуєте, acostви отримуєте

1.02604 -1.07742

acost

acostявно намагається не недооцінювати. Я не перевіряв конвергенцію, але ви розумієте.


Дякую за детальну відповідь: acostХоча одне питання щодо визначення функції. Чи має значення те, що ви обчислюєте y_model-Yдвічі?
asPlankBridge

Ви маєте на увазі швидкість? Не знаю; вам доведеться самостійно встигнути побачити, чи тензорфлоу уникає перерахунку. Інакше добре.
Емре

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.