かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

回帰問題で目的関数を対数変換して使う手法について

表題の内容の自分用の備忘録です。

回帰問題で目的変数の log1p を取ったもの (log ではなく) を新しく目的変数に据えて学習を進める手法がありますが、勉強のために kaggle などで言及されている箇所をまとめました。


メモ

  • (評価関数が RMSLE の時) target の log を目的変数に据えると RMSE を目的関数にして学習することができる

  • log 変換によって scaling 作用が期待できる

    • 大きい値の外れ値の影響を軽減できる
  • 小さい値のバラつきを強調しなくなる

    • input value が小さい場合は np.expm1 を代わりに使用できる
  • log1p を使用するのは 目的変数に 0台の値がある場合, 直接対数変換ができないためである (log0 は定義されない)

  • log(1+ax) > log1p の場合もある

  • 正規分布でないデータを扱う場合, アプローチ/分析/modeling に制約が発生する

    • そのため様々なテクニックを使い、データの分布を正規分布に見せることがある

    • データが bi-modal であれば、2つの異なる正規分布の和のように見えるかどうかを見て

    • データが歪んでいる場合は対数正規分布を見ます

  • 小さな𝑥 に対して expm1 を使って exp(𝑥)-1 を計算すべきである

    • 数ULPSオーダーのエラーが発生しうる
  • データセットがすべて1より大きい場合、logは通常問題ない. しかし,データセットが0から1の間の数を含む場合は,log1pの方がよいのが普通である.

    • もし𝑥 の値が 0 に近い場合, ln(𝑥) の値は大きな負の数になる可能性がある

    • これは, 特にデータセットにゼロよりもはるかに大きな数が含まれている場合には、データを大きな負の数に歪めてしまう.

    • 𝑥 が 0 に近づくにつれて、ln(𝑥+1) の値は正の方向から 0 に近づく

    • 例えば, ln(1+1𝑒)は∼0.31、ln(1+1𝑒10)は∼0.000045となる.

    • log1pは正の値だけを生成し、大きな負の数の「危険」を取り除く

    • データセットがゼロに近い数を含む場合,一般的にはより均質な分布を保証する.


図表

f:id:kaeru_nantoka_py:20200515052157p:plain


参考 URL