非対称コスト関数を使用した線形回帰?


13

私はいくつかの値を予測したいのですが、可能な限り低く、よりも大きい間で最適化する予測を取得しようとしています。つまり、 Y(x)Y^(x)Y(x)

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

単純な線形回帰は完全にうまくいくと思います。だから私はこれを手動で実装する方法をいくらか知っていますが、私はこの種の問題を抱えた最初の人ではないと思います。私がやりたいことをしているパッケージ/ライブラリ(できればpython)がありますか?探す必要があるキーワードは何ですか?

関数Y_0(x)> 0を知っていたらY0(x)>0Y(x)>Y0(x)ます。これらの制限を実装する最良の方法は何ですか?


おそらく、最も単純な解決策は、予測が正か負かに基づいて、異なる重みを使用することです。もっと早く考えたはずです。
asPlankBridge

回答:


11

私があなたを正しく理解しているなら、あなたは過大評価の側で間違いを犯したいと思うでしょう。その場合、適切な非対称コスト関数が必要です。1つの簡単な候補は、損失の2乗を調整することです。

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

ここで、1<α<1は、過小評価のペナルティと過大評価のトレードオフに使用できるパラメーターです。\ alphaの正の値はα過大評価にペナルティを科すため、α負に設定する必要があります。Pythonでは、これは次のようになりますdef loss(x, a): return x**2 * (numpy.sign(x) + a)**2

aの2つの値の損失関数

次に、いくつかのデータを生成しましょう:

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。ただし、関数の定義に対する1つの質問です。y_model-Y2回計算することは重要ですか?
asPlankBridge

あなたは速度の面で意味ですか?知りません; テンソルフローが再計算を回避するかどうかを確認するには、自分で時間を計る必要があります。それ以外は大丈夫です。
エマー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.