機械学習の実用的な評価値チートシート

機械学習の評価値として、Accuracy/Precision/Recall/F1などが教科書にも載っており、最も有名な評価値だと思います。

ただ実産業への応用において、これらの評価値では正しくモデルの性能を評価できないことが多く、多くの機械学習エンジニアやデータサイエンティストにとって頭を悩ますポイントだと思います。

これまで自分なりに調査したり試行錯誤したりする中で、大体これでいいだろというものが何となく固まってきたので、備忘録のためにチートシート的なものにしました。

機械学習モデルの評価をする際の一助になれば幸いです。

分類問題では二値分類問題のみを対象としています。

f:id:pompom168:20190410234352p:plain

RMSE (Root Mean Squared Error)

回帰問題の場合は基本的にRMSEを使えば良いと思います。

RMSEは予測値と目的変数の値の二乗誤差の平均値に平方根をとったものです。

これは非常に分かりやすく、予測値が平均的にどれくらい外れているかを評価できるものですね。

AUC (Area Under the Curve)

一般的なROC曲線(正例と予測するしきい値を変化させたときのTPRとFPRをプロットした曲線)の面積ですね。

完全に正確に予測できた場合は1、ランダムに予測したときは0.5になります。

最初に紹介したAccuracy/Precision/Recall/F1などは、しきい値によって変動する値ですが、AUCはしきい値による変動がないので、分類性能自体を見たい場合はこのAUCを見れば良いと思います。

ただし欠点があり、正例に対して負例の数が圧倒的に多い不均衡データの場合は、ROC曲線のAUCでは複数のモデルを比較が上手くできません。

不均衡データの場合は、PR曲線のAUC (=AP) を使うべきです。

この辺の説明は、以下の記事などが詳しいです。

aotamasaki.hatenablog.com

qiita.com

AP (Average Precision)

PR曲線(Recallを横軸に、Precisionを縦軸にとってしきい値を変化させてプロットした曲線)の面積です。

これは、AP (Average Precision) と呼ばれる値と等価であり、不均衡データの分類性能についてはこの評価値を見ればよいです。

計算方法などは以下の記事を参照ください。

レコメンドつれづれ ~第3回 レコメンド精度の評価方法を学ぶ~ - Platinum Data Blog by BrainPad

LogLoss

ここからは、分類問題であっても予測確率が重要な場合です。

例えば、Webのディスプレイ広告などではその広告が表示された場合クリックされる確率(Click Through Rate; CTR)の予測が重要であるなど、割と実産業においてはここらの評価値が重要だと思います。

LogLoss (別名、クロスエントロピー) は、正解ラベルと予測値との距離を考慮した評価値であり、値は小さいほど良いです。

予測確率を p_i 、正解ラベルを y_i \in \{ 0,1 \} とすると式で表されます。

LogLoss = - \frac{1}{N} \sum_{i=1}^{N} y_i log (p_i) + (1 - y_i) log (1 - p_i)

注意が必要なのは絶対的な値には意味がなく、相対的な評価しかできないことです。

つまり同一のテストデータ間でしか比較が出来ません。

Normalized Entropy

一般的な評価値ではないですが、予測確率が重要な場合であって不均衡データの場合はこの評価値が良いと思います。

以下のFacebookのCTR予測の論文において、この評価値が用いられています。

https://quinonero.net/Publications/predicting-clicks-facebook.pdf

この評価値は正規化されたLogLossです。(Normalized LogLossと呼んだ方がいいかもしれませんが、論文に従ってNormalized Entropyと呼んでおきます)

全テストサンプルが、全サンプルの内の正例の割合の値で予測されたときのエントロピーでLogLossを正規化します。

正規化する理由は、正例の割合が0 or 1に近いほどLogLossを小さくすることが簡単であり、この影響を低減するためです。

これも小さいほど良く、絶対的な値には意味がありません。

正例の割合を p とすると、以下の式で表されます。

Normalized Entropy = \frac{LogLoss}{- (p * log (p) + (1-p) * log (1-p) )} = \frac{- \frac{1}{N} \sum_{i=1}^{N}  y_i log (p_i) + (1 - y_i) log (1 - p_i)}{- (p * log (p) + (1-p) * log (1-p) )}