#はじめに
機械学習の回帰モデルの評価としてはRMSE(平均平方二乗誤差)がよく使われます。一方で、RMSEは外れ値に弱いということが紹介の中でよく書かれていますが気にせず使われている例が見られます。
「それじゃあ一体どれくらい弱いのか?」というのを考えることでアンチパターンとして抑えておきましょう。
先に結論を書くと**「目安として、平均の10倍以上の値が存在する場合は気をつけて使用する必要がある。その場合は対数をとったRMSLEを使用するのが良い」**となります。
#①RMSE(平均平方二乗誤差)とはどんなもの?
まあ、名前のとおりです。誤差、つまり実際の値と予測値の差分を二乗した後に平均してルートを取るというものです。
\textrm{RMSE} = \sqrt{\frac{1}{N}\sum_{i=1}^{N}(y_{i}-\hat{y}_{i})^{2}}
計算式は偏差値にかなり近くて、偏差が誤差に変わっただけです。なので上手く使えば「このモデルはだいたいこれぐらいの誤差を出すんだろうな」というイメージが作れます。
#②RMSEがおかしくなるときは? 値のスケールについて。
RMSEは人気があって使う人が多いですが、外れ値が存在する場合に外れ値に値が引きずられやすいという欠点があります。
意外と気にしてない人が多いのではないでしょうか。
誤差としての値しか計算に入らないので**「10を20」と予測した場合の誤差と、「100を110」と予測した誤差が同じものとして評価されます。
また、殆ど数十くらいのデータの中に「1,000を900」と予測する誤差があった場合に1つのデータだけ重要度がぜんぜん違う**という扱いとなってしまいます。
import numpy as np
a = np.array([10]*100) # 誤差10を100個用意したと仮定
print(np.sqrt((a**2).mean())) # RMSEはもちろん10
a = np.append(a, [100]*1) # 101個目に100を追加
print(np.sqrt((a**2).mean())) # RMSEは14.07まで上昇!
計算の際に二乗されるので10倍のスケールの誤差は指標上の重要度は100倍となります。もし平均的な誤差の100倍もの値が存在するとしたら、その重要度は平均的な誤差10,000倍、つまり10,000レコード分にもなってしまいます。
そして機械学習では外れ値ほど予測が難しいので、外れ値が存在する場合必然的に評価が安定しなくなります。
# ③じゃあ評価指標はどうすればよいの?
個人的には比率として考えられるRMSLEもしくはMAEがいいかなと思っています。機械学習モデルはまずオーダーを正しく当てるくらいで考えておくべきなのかなと。
RMSLEはRMSEの対数をとったものです。yのlogを取ることでRMSLEにできます。こうしてRMSEとして扱って最後にexpにするのが使いやすいかなと考えます。
MAEは平均する際に二乗ではなく絶対値をとったものです。こうすると誤差が増幅されることがないので外れ値に強くなります。ただ、モデル学習の際の損失係数として使いにくいです。
もちろん**「外れ値は殆どない」「大きな値のミスが問題だ」**という場合はRMSEを使っても問題はないです。
④実例紹介
最近のコンペだとProbSpaceさんの不動産取引価格予測コンペでRMSEが使われて、データの中に平均の100倍以上の値が紛れていて順位が大きく変動したというのがありました。「スケールの差によってどれくらいRMSEが変化するのか分析したトピック」(ログイン必要)もありますので興味があればご覧ください。
実案件でも「RMSEは知っているけど外れ値の可能性を考えた場合にモデル評価に適切かまでは認識してなかった」というのを見たことがあります。
#結論
結論としては**「スケールが違うデータが来る可能性がある場合はRMSEを使わない!RMSLEを使う!」**に尽きると思います。RMSEしか見ないのは、分類でAccuracyしか見ないくらい危険だと思います。
ちなみに上で上げたProbSpaceさんの不動産価格予測コンペですが、2020年8月11日締切で評価指標をRMSLEに変更して再度開催されています。前回参加した人の解法などがある状態から参加できるので初心者におすすめなコンペになっていると思います。アンチパターンの例としてあげて申し訳ない気分ですが、このように再度開いていただけるのは素晴らしく思っております。
以上、評価指標は注意しておかないと大きな落とし穴にはまったり、逆に気をつけるだけでコンペで良い順位取れたりするので、気にしておいて損はないものだ、という話でした。