scikit-learnとLightGBMの評価関数比較


このページについて

  • LightGBMで学習して、そのパラメタグリッドサーチをGridSearchCV(sklearn)でという状況が多いかと思います。
  • どの評価関数であれば、ライブラリ標準で共通で利用できるのかをまとめてみようと思います。
  • 下記を書いたあとに、気になって調べ始めたので内容は重複します。(スミマセン)
  • 途中で力尽き、今回は回帰だけでまとめています。

比較一覧

評価関数 GridSearchCVでの指定方法 lightGBMでの指定方法 メモ
平均絶対誤差
MAE
neg_mean_absolute_error regression_l1
mae
L1_loss。中央値に最適化
平均二乗誤差
MSE
neg_mean_squared_error regression_l2
mse
L2_loss。平均値に最適化。
LightGBMはalias多数あり。
対数平均二乗誤差
MSLE
neg_mean_squared_log_error 無し 対数をとったMSE
残差中央値 neg_median_absolute_error 無し 残差の中央値
残差最大値 max_error 無し 残差の最大値
R2決定係数 r2 無し 当てはまりの良さ
詳細はこちら
Explaind Variance explained_variance 無し 残差の分散の大きさの割合
MAPE loss 無し mape 平均何%ずれているか
Huber loss 無し huber MAEとMSEのいいとこ取り
Quantile regression 無し quantile パーセンタイル値に対する回帰
Fair loss 無し fair 読み解けず..
Poisson regression 無し poisson ポアソン回帰
離散的な事象の発生回数
Gamma regression 無し gamma ガンマ回帰
事象がn回発生するまでの時間分布
Tweedie regression 無し tweedie Tweedie回帰
(poisson+gamma)

GridSearchCV(sklearn)とLightGBM 共通

  • なんと、MAEMSEの2つだけだった。

平均絶対誤差(MAE)

  • まずは、一番わかり易い絶対誤差。
  • 予測と実績の絶対差の平均なのでとても理解しやすい。
\text{MAE}(y, \hat{y}) = \frac{1}{n} \sum_{i=0}^{n-1} \left| y_i - \hat{y}_i \right|

平均二乗誤差(MSE)

  • もう一つの定番、MSE(平均二乗誤差)でしょうか。
  • 機械学習ライブラリの回帰関数のデフォルトの評価関数だったりします。
    • MSEの最小化が、誤差が正規分布の最尤推定と同義である背景からでしょう。(最小二乗法)
  • なお、ルートがつくとRMSEとなります
    • MSEは正の値ですので、MSEとRMSEが最小値をとる条件は一致するのでどちらを利用しても良いでしょう。
\text{MSE}(y, \hat{y}) = \frac{1}{n} \sum_{i=0}^{n - 1} (y_i - \hat{y}_i)^2

GridSearchCV(sklearn)のみ

対数平均二乗誤差(MSLE)

  • ある値は10、ある値は10億といった、値のレンジが大きな(対数正規分布に近い)データの学習に利用します。
  • 先程のMSEと見比べると下記のような感じ。
    • 対数(log)を計算してから、予測と実績を引き算。
      • 予測と実績の誤差を幅ではなく比率として表現
    • 対数を取る前に、予測、実績共に+1
      • 予測または、実績が0の場合、log(0)となり計算できなくなるので、+1する。
\text{MSLE}(y, \hat{y}) = \frac{1}{n} \sum_{i=0}^{n - 1} (\log_e (1 + y_i) - \log_e (1 + \hat{y}_i) )^2

残差中央値

  • 残差=予測-実績を計算し、その中央値を評価指標として採用する。
\text{MedAE}(y, \hat{y}) = \text{median}(| y_i - \hat{y}_i |)

残差最大値

  • 残差=予測-実績を計算し、その最大値を評価指標として採用する。
\text{Max Error}(y, \hat{y}) = max(| y_i - \hat{y}_i |)

R2決定係数

R^2(y, \hat{y}) = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2}

Explaind Variance

  • 適切な日本語訳が見つから無かった。。(誰か教えて下さい)
  • 残差の分散/実績の分散を1から引くので、1に近づけば近づくほど残差の分散が小さくなる。
  • y_test(真の値)の分布に対して、残差の分布がどれほどに収まっているのかが評価できそう。
explained\_{}variance(y, \hat{y}) = 1 - \frac{Var\{ y - \hat{y}\}}{Var\{y\}}

LightGBMのみ

MAPE loss

  • MAEのパーセンテージ版
  • 全体として、実績値に対して平均何%ずれているのか?が評価可能
  • パーセンテージなので、割合を出したあとに×100しています。
\text{MAE}(y, \hat{y}) = \frac{1}{n} \sum_{i=0}^{n-1} \left| \frac{y_i - \hat{y}_i}{y_i} \right| × 100

Huber loss

  • こちらの「損失関数まとめ」がとてもわかり易かったでリンクさせていただきました。
  • MAE(L1)、MSE(L2)のいいとこ取りといった感じでしょうか。正則化におけるElasticNetに似たものを感じました。
  • 上記ページでRefしている、Cornell Univの下記ページもわかりやすいです。(出典:Cornell University CS4780 ML Course)

Quantile regression

\underset{u}{minE}(\rho_{\tau}(Y -u)) = \underset{u}{min} \left\{(\tau - 1) \int_{-\infty}^u (y-u)dF_{Y}(y) + \tau \int_u^{\infty} (y-u)dF_{Y}(y) \right\}

  • MAEは中央値に、MSEは平均値に最適化しますが、Quantile regressionでは、alphaで指定されたパーセンタイル値に対して最適化します。
  • 具体的には、MAEは中央値(50%タイル値)を最適化するので、下記の2つの予測器は同じ動きとなります。
In [4]: # l1を指定したので、MAEで中央値に最適化される。
   ...: MAE_clf = lgb.LGBMRegressor(objective='regression_l1', metrics='l1') 
   ...: MAE_clf.fit(X,y)
   ...: MAE_pred = MAE_clf.predict(X)
   ...:
   ...: # 50%タイル値(中央値)に最適化される。
   ...: p50_clf = lgb.LGBMRegressor(objective='quantile',alpha=0.5) # 50 percentile
   ...: p50_clf.fit(X,y)
   ...: p50_pred = p50_clf.predict(X)
   ...:
   ...: np.bincount(MAE_pred == p50_pred)

Out[4]: array([  0, 300], dtype=int64) # 結果が一致
  • 種類的には、線形系アルゴリズムに実装されていても良さそうなのですが、、
  • sklearnでもこの評価関数に対応しているのは、勾配ブースティング木くらいのようでした。(意外)

Fair loss

  • Microsoftの公式ドキュメントでも、Kaggleへのリンクが示されているだけで、読み解けず。。

Poisson,Gamma,Tweedie

  • DataRobot社のブログにわかりやすくまとまっています。
  • リンクさせていただきます。評価指標の選び方

参考

scikit-learn

lightgbm

その他