機械学習の勉強仲間の友人がKaggleのハウスプライスの課題で、
>Box-cox変換をした
という話をしていました!
それで精度が上がったとのこと!
https://sonaeru-blog.com/kaggle-4/
上記の記事を参考にしたそうです。
そもそもBox-cox変換ってなんや!!と思いましたので、
自分なりに調べたことをメモにします。
その友人曰く、
>正規分布に近づけるという意味では対数化と同じようなものなのかなと
とのこと。
Box-cox変換ってなに??
こちらの記事が、大変参考になりました。
https://gakushukun1.hatenablog.com/entry/2019/04/29/112424
対数変換をより一般化したものと考えると良いように思います。
実際λ=0のときには、対数変換になります。
対数変換は、どちらかというと、上の図に近いような0でピークがあって、
裾野が正規分布よりずっと長い分布なら、理論的に完璧に正規分布に置き換えることができる。
実際上の方のグラフは下に比べて、λが0に近い値なので、
これくらいの分布なら、多分、対数変換でも線形回帰でほぼ問題ないような気がします。
(なんとなくこれまで拙い自分の経験則。と言いつつ、Box-cox変換したらもっと精度上がる?)
しかし、そもそもこれって、線形回帰アルゴリズムを前提としてますよね!
決定木系のアルゴリズムはBox-coxが必要か?
Kagglerとしての順位を少しでも上げたい自分として、
個人的に一番きになるのは、LGBMのような、いわゆる「木系」は、
説明変数の特徴量エンジニアリングとして、
box_coxが不要と考えて問題ないのか?それとも使った方が良いのか??
https://toukei-lab.com/box-cox%E5%A4%89%E6%8F%9B%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E3%81%AB%E5%BE%93%E3%82%8F%E3%81%AA%E3%81%84%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%A7%A3%E6%9E%90
>最近流行りの機械学習手法はノンパラメトリックモデルと呼ばれ、
>背後に分布を想定していないものが多いです。
こちらの記事によると不要とのこと!!
「numericなパラメータも、結局大小関係でしか判定され得ないから」
が理由だと思ってます。
ただ、目的変数に関しては、必ずしもそうでないように思う。
(実際、目的変数を対数にとることも多いので)
その理由は数少ない大きな外れ値への、モデルのペナルティを下げるため
と理解しています。
じゃあ、
目的変数をBoxCock変換する場合はあり得るのか?
https://books.google.co.jp/books?id=t1a_DwAAQBAJ&pg=PA222&lpg=PA222&dq=%E7%9B%AE%E7%9A%84%E5%A4%89%E6%95%B0+boxcox&source=bl&ots=L7yjHQ6y6G&sig=ACfU3U3U1ugf0XhDVN_4fKAVnYe9xcFBSQ&hl=ja&sa=X&ved=2ahUKEwi2p_-itoLmAhXZA4gKHUutDmcQ6AEwBXoECAoQAQ#v=onepage&q=%E7%9B%AE%E7%9A%84%E5%A4%89%E6%95%B0%20boxcox&f=false
どうやらあるようです。
ただそれはすなわち、コスト関数にRMSEを使わないことと、
多分同義なので、そちらの選択の方が直観的な気がします。
https://www.sciencedirect.com/science/article/abs/pii/S0031320396000775?via%3Dihub
そして、見事に目的変数をboxcox変換するようなコスト関数を実装しましたというabstractの論文を発見しました。
中身は見れねぇ!し、ちょっと飽きたので、この辺にしておきます。
勉強は積み重ね
今回、知らない言葉を調べ初めて、自分なりに納得感のある答えに辿り着いた上で、
新たな疑問の仮説を立て、それについての知見を得られたのは、非常に気持ち良い体験でした。
でも、一つ一つは最近知ったばかりのことの積み重ねだなと感じました。
・指数関数についてそこそこ知ってる(これは昔のおかげ)
・β関数について知ってる(これは統計勉強会です)
・木系は変換が不要(これは昨日、渡辺さんが言ってました)
・目的変数は変換することがある(これは最近よく出くわす)
・RMSEは残差の分布を正規分布と仮定してる(これは授業でやりましたね)
・コスト関数は個別に実装できる(これは最近のKaggleです)
引き続き頑張ろうと思います。