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

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

https://qiita.com/shnchr/items/a88b1eb2bba8002ecd5d

# 比較一覧
|評価関数|GridSearchCVでの指定方法|lightGBMでの指定方法|メモ|
|:---:|:---:|:---:|:---:|
|平均絶対誤差 <br/> MAE| [`neg_mean_absolute_error`](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-absolute-error)|regression_l1 <br/> mae|L1_loss。中央値に最適化|
|平均二乗誤差 <br/> MSE| [`neg_mean_squared_error`](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-squared-error)|regression_l2 <br/> mse|L2_loss。平均値に最適化。<br/> LightGBMはalias多数あり。|
|対数平均二乗誤差 <br/> MSLE| [`neg_mean_squared_log_error`](https://scikit-learn.org/stable/modules/model_evaluation.html#mean-squared-log-error)|**無し**|対数をとったMSE|
|残差中央値| [`neg_median_absolute_error`](https://scikit-learn.org/stable/modules/model_evaluation.html#median-absolute-error)|**無し**|残差の中央値|
|残差最大値| [`max_error`](https://scikit-learn.org/stable/modules/model_evaluation.html#max-error)|**無し**|残差の最大値|
|R2決定係数| [`r2`](https://scikit-learn.org/stable/modules/model_evaluation.html#r2-score-the-coefficient-of-determination)|**無し**|当てはまりの良さ<br/>[詳細はこちら](https://qiita.com/shnchr/items/fc321bfe4fca2b8565d7)|
|Explaind Variance| [`explained_variance`](https://scikit-learn.org/stable/modules/model_evaluation.html#explained-variance-score)|**無し**|残差の分散の大きさの割合|
|MAPE loss|**無し**|mape|平均何％ずれているか|
|Huber loss|**無し**|huber|MAEとMSEのいいとこ取り|
|Quantile regression|**無し**|quantile|パーセンタイル値に対する回帰|
|Fair loss|**無し**|fair|読み解けず..|
|Poisson regression|**無し**|poisson|ポアソン回帰 <br/> 離散的な事象の発生回数|
|Gamma regression|**無し**|gamma|ガンマ回帰 <br/> 事象がn回発生するまでの時間分布|
|Tweedie regression|**無し**|tweedie|Tweedie回帰 <br/>（poisson+gamma)|

# GridSearchCV(sklearn)とLightGBM　共通
* なんと、*MAE*と*MSE*の2つだけだった。

### 平均絶対誤差(MAE)
* まずは、一番わかり易い絶対誤差。
* 予測と実績の絶対差の平均なのでとても理解しやすい。 

```math
\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が最小値をとる条件は一致するのでどちらを利用しても良いでしょう。

```math
\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）を計算してから、予測と実績を引き算。
        * 予測と実績の誤差を幅ではなく比率として表現
    * 対数を取る前に、予測、実績共に＋１
        * 予測または、実績が0の場合、log(0)となり計算できなくなるので、＋１する。

```math
\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
```

### 残差中央値
* 残差＝予測-実績を計算し、その中央値を評価指標として採用する。

```math
\text{MedAE}(y, \hat{y}) = \text{median}(| y_i - \hat{y}_i |)
```

### 残差最大値
* 残差＝予測-実績を計算し、その最大値を評価指標として採用する。

```math
\text{Max Error}(y, \hat{y}) = max(| y_i - \hat{y}_i |)
```

### R2決定係数
* 回帰モデルのデータに対する当てはまりの良さですね。
* [中学数学で理解する回帰分析とr2決定係数](https://qiita.com/shnchr/items/fc321bfe4fca2b8565d7)にて詳細に説明しています。

```math
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
* 適切な日本語訳が見つから無かった。。（誰か教えて下さい）
* 残差の分散／実績の分散を１から引くので、１に近づけば近づくほど残差の分散が小さくなる。
* y_test（真の値）の分布に対して、残差の分布がどれほどに収まっているのかが評価できそう。

```math
explained\_{}variance(y, \hat{y}) = 1 - \frac{Var\{ y - \hat{y}\}}{Var\{y\}}
```

# LightGBMのみ
###MAPE loss
* MAEのパーセンテージ版
* 全体として、実績値に対して平均何％ずれているのか？が評価可能
* パーセンテージなので、割合を出したあとに×100しています。

```math
\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
* こちらの「**[損失関数まとめ](https://qiita.com/Hatomugi/items/d00c1a7df07e0e3925a8#huber-loss)**」がとてもわかり易かったでリンクさせていただきました。
* MAE（L1）、MSE（L2）のいいとこ取りといった感じでしょうか。正則化におけるElasticNetに似たものを感じました。
* 上記ページでRefしている、Cornell Univの下記ページもわかりやすいです。(出典：[Cornell University CS4780 ML Course](http://www.cs.cornell.edu/courses/cs4780/2015fa/web/lecturenotes/lecturenote10.html))

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/42c90ab7-1ff2-dd57-8121-15fa6df7f7a3.png)


###Quantile regression
* Quantile（分位値）のregression（回帰）です。[Quantile_regression](https://en.wikipedia.org/wiki/Quantile_regression)を参照

```math
\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%タイル値）を最適化するので、下記の２つの予測器は同じ動きとなります。

```python
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へのリンクが示されているだけで、読み解けず。。
    * [Fair loss](https://www.kaggle.com/c/allstate-claims-severity/discussion/24520)

###Poisson,Gamma,Tweedie
* DataRobot社のブログにわかりやすくまとまっています。
* リンクさせていただきます。[評価指標の選び方](https://blog.datarobot.com/jp/%E3%83%A2%E3%83%87%E3%83%AB%E6%9C%80%E9%81%A9%E5%8C%96%E6%8C%87%E6%A8%99-%E8%A9%95%E4%BE%A1%E6%8C%87%E6%A8%99%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9)

# 参考
#### scikit-learn
* https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
* https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter
* https://scikit-learn.org/stable/modules/generated/sklearn.metrics.explained_variance_score.html

#### lightgbm
* https://github.com/microsoft/LightGBM/blob/master/docs/Parameters.rst
* https://lightgbm.readthedocs.io/en/latest/Parameters.html?highlight=core%20parameter#core-parameters

#### その他
* https://qiita.com/Hatomugi/items/d00c1a7df07e0e3925a8#huber-loss
* http://www.cs.cornell.edu/courses/cs4780/2015fa/web/lecturenotes/lecturenote10.html
* https://en.wikipedia.org/wiki/Quantile_regression
* https://blog.datarobot.com/jp/%E3%83%A2%E3%83%87%E3%83%AB%E6%9C%80%E9%81%A9%E5%8C%96%E6%8C%87%E6%A8%99-%E8%A9%95%E4%BE%A1%E6%8C%87%E6%A8%99%E3%81%AE%E9%81%B8%E3%81%B3%E6%96%B9