ともにゃん的データ分析ブログ

勉強したことの備忘録とかね

tree系のアルゴリズム(決定木・ランダムフォレスト・xgboostなど)で目的変数に対数を取ってはいけない

よくよく考えたら当たり前のことに気づいたのでメモです。


回帰とかをするときに、例えば目的変数が正の値しか取り得ないような場合、目的変数を対数変換したりします。
そのノリで、タイトルに挙げたのtree系のアルゴリズムを適用するときにも対数変換をしてる人がいるんじゃないでしょうか。僕もその一人です。
ただ、どうも予測値が実測値を過小評価している感がすごかったのです。そこで原因を考えてみました。


tree系のアルゴリズムは、(テスト)データが最終ノードにたどり着いたときに、そのノードにある学習データの平均値を予測値として返します。
ある最終ノードにあるデータ数をN個, データをx_{i}, i=1,...,Nとしましょう。もし目的変数に対数変換をしていた場合、返される結果は


\frac{1}{N}\sum_{i=1}^{N}\log(x_{i})

です。これを元のスケールに戻すと、つまり\expをかましてやると


\exp(\sum_{i=1}^{N}\log x_{i}^{\frac{1}{N}})=(\prod_{i=1}^{N}x_{i})^{\frac{1}{N}}

です。おっと、これは幾何平均じゃないですか。

御存知の通り、算術平均 ≧ 幾何平均 ですから、元のスケールに戻したときに過小評価されるのはあたりまえのことなのです。


時系列データの解析をするときにこれをするとエライことになりますね。この事実に気が付かないと、「過小評価をしているということはトレンドが考慮できていないのか?学習をしたときよりも正のトレンドがあるのか?」などと勘違いをしてしまいます。私のことです。