回帰モデルの誤差と誤差を最小にする値について

# はじめに
回帰分析を行うときMSEやMAEなどの誤差の指標を使用しますが、それらの誤差が最小になる予測値は誤差の指標によって異なります。誤差構造を正しく理解して使用しないと的外れな回帰分析をしてしまう可能性があります。

そこで、ここでは普段使用する誤差の定義と、それを最小にする値について復習しましょう。

## 参考
- 平均絶対誤差については[こちら](http://www5e.biglobe.ne.jp/~emm386/2016/distance/manhattan01.html)が参考になります。

## 平均二乗誤差
ある値 $c$ に対して、各データ値 $x_i$ と $c$ との差の二乗の平均値のことを $c$ の平均二乗誤差（Mean square error）といい、それを $\mathrm{MSE}(c)$ と表します。

```math
\mathrm{MSE}(c)=\frac{1}{N}\sum_{i=1}^N(x_i−c)^2
```
$\mathrm{MSE}(c)$は$c$について微分可能なので、微分して$0$になる値を求めれば$\mathrm{MSE}(c)$を最小にする$c$を求めることができます。$c$ はデータ$\\{x_i\\}_{i=1}^N$の平均値になります。

## 平均絶対誤差
ある値 $c$ に対して、各データ値 $x_i$ と $c$ との差の絶対値の平均値のことを $c$ の平均絶対誤差（Mean absolute error）といい、それを $\mathrm{MAE}(c)$ と表します。

```math
\mathrm{MAE}(c)=\frac{1}{N}\sum_{i=1}^N\left|x_i−c\right|
```
$\mathrm{MAE}(c)$を最小にする$c$はデータ$\\{x_i\\}_{i=1}^N$の中央値になります。証明は[こちら](http://www5e.biglobe.ne.jp/~emm386/2016/distance/manhattan02.html)が分かりやすいです。

## 平均二乗誤差率
ある値 $c$ に対して、各データ値 $x_i$ と $c$ との二乗誤差率の平均のことを $c$ の平均二乗誤差率（Mean squared percentage error）といい、それを $\mathrm{MSPE}(c)$ と表します。

```math
\mathrm{MSPE}(c)=\frac{1}{N}\sum_{i=1}^N\left(\frac{x_i−c}{x_i}\right)^2
```
この指標が使えるのは各データ$x_i$が$x_i>0$を満たすときのみです。平均二乗誤差と同様の計算で$\mathrm{MSPE}(c)$を最小にする点を求めることができます。$\mathrm{MSPE}(c)$を最小にする$c$は次の式で表されます。

```math
c=\frac{\sum_{i=1}^N\left(\prod^N_{\substack{j=1 \\ (j\neq i)}}x_j\right)\left( 
x_i - \frac{1}{2} \right)}{\sum_{i=1}^N\left(\prod^N_{\substack{j=1 \\ (j\neq i)}}x_j\right)} =\frac{1}{\frac{1}{N}\sum_{i=1}^N\frac{1}{x_i}}-\frac{1}{2}\\
```

## 平均絶対誤差率
ある値 $c$ に対して、各データ値 $x_i$ と $c$ との絶対誤差率の平均のことを $c$ の平均二乗誤差率（Mean squared percentage error）といい、それを $\mathrm{MAPE}(c)$ と表します。

```math
\mathrm{MAPE}(c)=\frac{1}{N}\sum_{i=1}^N\left|\frac{x_i−c}{x_i}\right|^2
```

この指標が使えるのは各データ$x_i$が$x_i>0$を満たすときのみです。
$\mathrm{MAPE}(c)$を最小にする$c$を求めるのは少々複雑です。データ$\\{x_i\\}_{i=1}^N$が従う分布を$f(x)$としたとき、分布$f(x)/x$の中央値が$\mathrm{MAPE}(c)$を最小にする$c$になります。詳細を知りたい人は[こちらの論文](https://arxiv.org/abs/0912.0902)を参照してください。
[こちら](https://stats.stackexchange.com/questions/213897/best-way-to-optimize-mape)にもMAPEについての議論があります。

## 平均相対誤差
ある値 $c$ に対して、各データ値 $x_i$ と $c$ との相対誤差の平均のことを $c$ の平均相対誤差（Mean relative error）といい、それを $\mathrm{MRE}(c)$ と表します。

```math
\mathrm{MRE}(c)=\frac{1}{N}\sum_{i=1}^N\left|\frac{x_i−c}{c}\right|^2
```

この指標が使えるのは各データ$x_i$が$x_i>0$を満たすときのみです。
データ$\\{x_i\\}_{i=1}^N$が従う分布を$f(x)$としたとき、分布$xf(x)$の中央値が$\mathrm{MRE}(c)$を最小にする$c$になります。

# 例
誤差が対数正規分布に従う場合を考えてみましょう。対数正規分布の確率密度関数は次のようになります。

```math
f(x)=\frac{1}{\sqrt{2\pi }\sigma x}\exp\left( -\frac{(\ln x -\mu)^2}{2\sigma^2} \right)
```
対数正規分布の平均は$e^{\mu+\sigma^2/2}$、中央値は$e^\mu$です。

$f(x)/x$の中央値は次のようにして示せます。

```math
\int_0^m dx \frac{f(x)}{x} = \int_m^\infty dx \frac{f(x)}{x}
```
ここで$m$は$m=e^{\mu-\sigma^2}$で、対数正規分布の最頻値です。これについては[こちら](https://stats.stackexchange.com/questions/389315/what-is-the-best-point-forecast-for-lognormally-distributed-data)に議論があります。

下記では$y\sim f(y|e^{\mu+\sigma^2/2}=x, \sigma=0.4)$から生成される$y$に対して、平均値、中央値、最頻値での曲線を描いています。

```python
import numpy as np
from scipy.stats import lognorm
import matplotlib.pyplot as plt


x = np.linspace(0, 1, 1000)
std = 0.4
y = np.random.lognormal(np.log(x), std)

mean_val = np.exp(x+std**2/2)
median_val = x*np.exp(-std**2/2)
mode_val = x*np.exp(-std**2*3/2)

plt.plot(x, y, '.', alpha=1.0, color="lightgray")
plt.plot(x, x, '-', linewidth=3, color="C1", label="mean")
plt.plot(x, median_val, '-', linewidth=3, color="C2", label="median")
plt.plot(x, mode_val, '-', linewidth=3, color="C3", label="mode")
plt.legend()
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/66c7b329-0319-fbcd-d381-6f1ba9a0f380.png)

最小化する誤差を変えると、得られるフィッティング曲線は（理想的には）これだけ異なってしまうことになります。

# おわりに
ライブラリや回帰モデルの種類によっては、誤差の指標が実装されていない場合があります。
例えばコンペの指標はMAPEだけど、モデルにはMAEしかない、、、なんか似てるしMAEでいっか♪、というように選んでしまうと、モデルは誤差の選択によるズレを含んでしまうことになります。本当は、これを正すためズレを取り除くキャリブレーションが必要です。