半歩ずつ進める機械学習　～scikit-learn 回帰モデルの評価指標～

##前回
[前回の投稿][1]でscikit-learnの`LinearRegression`を使用して作成した
ボストン住宅価格の予測を行うモデルの交差検証を行いました。
交差検証は`cross_val_score`と`cross_validate`を使って行いましたが
その際に、`score`という引数で評価指標を変更出来るという所まで勉強しました。
今回はscikit-learnに実装されている評価指標について、回帰モデル用の物に絞って勉強します

##回帰用の評価指標
scikit-learnに実装されている、回帰用の評価指標は以下の6種です


+ **explained_variance**
+ **mean_absolute_error**
+ **mean_squared_error**
+ **mean_squared_log_error**
+ **median_absolute_error**
+ **r2**

ではひとつずつ確認していきます
また、ここからは良く使うモデルの予測値などを以下の記号で定義します

```math
y = 正解値\\
\hat{y} = 予測値\\
n = サンプル数\\
```
##!!注意!!
`cross_val_score`と`cross_validate`から出力されるスコアは
**高い程良く、低い程悪い**という風に統一されています
その為、例えば平均誤差や平均二乗誤差等、本来小さい程良い結果となる指標は
`cross_val_score`と`cross_validate`では符号を逆転させて出力されます。
その為、`cross_val_score`と`cross_validate`の`score`引数に指定する時に`neg_(negative)`という文字が頭に付く場合があります。


## **explained_variance**
誤差の分散を表す指標です

```math
var() = 分散の関数\\
1 - \frac{var(y-\hat{y})}{var(y)}
```

あくまで分散を表す物なので、他の評価指標と組み合わせて
誤差の大きさも同時に見るのが良いと思います。
[リファレンス][2]

## **mean_absolute_error**
平均絶対誤差
**MAE(mean absolute error)**と表記される事があります。
`score`に指定する場合**"neg_mean_absolute_error"**

```math
MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y_i}|
```

単純に、誤差の絶対値の平均です
プラス方向かマイナス方向かはさておき、誤差の大きさが平均でどの程度あるのか
誤差の**大きさ**の指標になるかと思います
[リファレンス][3]

## **mean_squared_error**
平均二乗誤差
**MSE(mean squared error)**と表記される事があります。
`score`に指定する場合**"neg_mean_squared_error"**

```math
MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2
```

これも平均絶対値誤差と同じく、基本的に誤差の**大きさ**の指標になるかと思います。
[リファレンス][4]

## **mean_squared_log_error**
平均二乗対数誤差
**MSLE(mean squared log error**と表記される事があります
`score`に指定する場合**"neg_mean_squared_log_error"**

```math
MSLE = \frac{1}{n}\sum_{i=1}^{n}(\log_e(1+y_i) - \log_e(1+\hat{y_i}))^2
```

~~データの特性上、誤差の値がどうしても巨大になってしまう場合に、数字を圧縮する効果があります。
例えば国家予算の予測を行うモデルを評価する時
数%の誤差にも関わらず、数兆という誤差が出てしまうので、これを扱いやすい小さい数字にする事が出来ます~~
誤差の大きさは、学習データを予め標準化しておけば基本的に防げる問題で、平均二乗対数誤差の特徴を表すものとして不適切でした
平均二乗対数誤差は**実測値と予測値の比率(自然対数の）**を表す指標です
例えば計算結果が4だった場合、予測値と実測値の間には、約e^√4倍(2.7182^2)の関係があるという事になります。

[リファレンス][5]


## **median_absolute_error**
絶対誤差中央値
`score`に指定する場合**"neg_median_absolute_error"**


```math
median = 中央値を計算する関数\\
median(|y_1 - \hat{y_1}|,|y_2 - \hat{y_2}|...|y_n - \hat{y_n}|)
```

誤差の絶対値の中央値を計算します。
絶対平均誤差や二乗平均誤差は、例えば1個のとてつもなく大きい誤差があると
その結果が足を引っ張って全体の結果が悪くなってしまう可能性があります。
平均絶対値誤差等と組み合わせて使う事で
**平均誤差:大　中央値:小**　といったケースで外れ値・異常値の存在を疑う
といった使い方が出来るかと思います
[リファレンス][6]


## **r2**
決定係数
**R^2**と表記される事があります

```math
\bar{y} = 正解値の平均\\
R^2 = 1 - \frac{\sum_{i=1}^{n}(y_i - \hat{y_i})^2}{\sum_{i=1}^{n}(y_i - \bar{y})^2}\\
```
決定係数には複数の定義があるようで、上記はscikit-learnに実装されている物の定義です
単純に正解値の平均を返すだけのモデルと比較してどの程度、モデルが有効かという指標になります


[リファレンス][7]

##次回へ
今回はscikit-learnに実装されているモデル評価指標の中でも
回帰モデル用の物だけをピックアップして学びました。
いずれ分類モデル用の評価指標なども纏めたいと思います。
次回は、scikit-learnに実装されているLinearRegression以外の回帰関数を使って
ボストン住宅価格予測モデルの作成と、検証を行いたいと思います。

##お願い
機械学習の初心者が、学んだ知識の確認と備忘用に投稿しています。
間違っている部分や、何かお気づきの事がありましたらご指摘頂けますと幸いです
あと、独学者なので「私も今勉強中なんです！」みたいな人がいればコメント貰えると喜びます。


[1]:https://qiita.com/Mukomiz/items/f5c562ff8b538c1502d7
[2]:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.explained_variance_score.html#sklearn.metrics.explained_variance_score
[3]:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_absolute_error.html#sklearn.metrics.mean_absolute_error
[4]:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html#sklearn.metrics.mean_squared_error
[5]:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_log_error.html#sklearn.metrics.mean_squared_log_error
[6]:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.median_absolute_error.html#sklearn.metrics.median_absolute_error
[7]:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html#sklearn.metrics.r2_score