えんじにあのじゆうちょう

勉強したことを中心にアウトプットしていきます。

線形でないパラメータを線形回帰で扱う

はじめに

線形回帰は、端的に言えばあるデータyを別のデータxと重みトバイアスであるa, bをこうy呂してy=ax+bの関係でデータを表現するということです。
では例えば、y=ax^2で表現されるようなデータは線形回帰で扱えないのでしょうか。僕にもそう考えていた時期がありました。
このエントリでは線形でないデータをどのように線形回帰で扱うかをまとめます。

解説

コードサンプル

また、コード例は以下においてありますので、コードを見たほうが早い人達はこちらを参照してください。
github.com

データの生成

今回は適当なデータを生成します。なんでもいいのですが、 f(x) = 0.02(x-15)^2 + 10という式で表され、それぞれに対して平均0, 標準偏差0.5の正規分布で表現される誤差を乗せています。とても適当です。

f:id:marufeuillex:20190920222151p:plain
生成されたデータ

データは概ね上記の様な感じになります。
例えば電気代のように、15度位で最小になる(暖房も冷房も付けない人が多いので)が、そこを境にx^2の関係で上昇するようなものとして捉えてください。
縦軸の単位は適当なのでなんでもいいです。例えば/m^2や千円単位、ということでもいいかもしれません。適当なので何も考えてないです。

結果は見えていますが、このまま線形回帰器に突っ込んだらこうなります。

f:id:marufeuillex:20190920222423p:plain
単純に線形回帰
オレンジの線が予測値です。なんか平均らへんにのぺーっと引かれました。
ちなみにちなみに、スコアは0.0001118568724230995でした。とてもフィットしてないですね。

x軸を変換する

気を取り直していきましょう。
x軸を変換することで、yxではなく、yx'の関係にして線形の関係を作っていきます。

x軸を折り返す

左右非対称らしいデータはまず折り返します。
今回対称になる点は15と知っているのでそこで折り返しますが、そこはデータ次第で求めます。
つまり、x' = |x-15|としてみます。

f:id:marufeuillex:20190920222909p:plain
折り返し後

折り返せていることがわかります。これでも前よりは随分線形っぽく見えますが、さらに変換を加えます。

f(x)を求める

f(x)がわかれば理想ですが実際には無理なので、近似的にg(x)を求めて、x'=g(x)という変換をします。ここではそれ自体の説明は行いません。
また、今回はf(x)を知っているので、一旦それを使います。恣意的ですいません。

f:id:marufeuillex:20190920223130p:plain
x = g(x)による変換

今回g(x) g(x) = 0.02x^2としています。ただしxには1つ前で求めた通りx-15を代入します。

再度線形回帰をする

ここでの注意点は、学習時にg(x), yで学習させるので、予測する値もg(x)の変換を通した上になります。
また、g(x)の各点はxに対応していることに注意してください。
つまり、最終的にグラフを書くときは予測値をy'とすると、x, y'でグラフ化します。(例のごとく、オレンジが予測の線です)

f:id:marufeuillex:20190920223801p:plain
線形回帰
とてもいい感じです。スコアを見ると、0.9827344861326368ととても当てはまりが良いことがわかると思います。

まとめ

今回は線形でない関係を持つデータをうまいこと線形に変換し、線形回帰で扱う方法についてまとめました。
関数を見つけ出すことさえできれば、難しいデータも線形モデルとして扱えるのは非常に重要なことだと思います。