決定係数の考え方を、線形回帰の外に一般化する

# はじめに

**決定係数** は、線形回帰モデルのあてはまりの良さを測るための指標です。通常は0~1の値をとり、モデルの予測性能がどのくらい高いのかを直観的に伝えてくれるため、実務のコミュニケーションでも重要な役割を果たします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509873/be9c6d89-32d6-d9a5-c2a0-3ff2629ce71b.png)

しかし通常よく知られる決定係数は二乗誤差を前提とした線形回帰のみを想定しており、ひとたび線形回帰モデルの以外のモデルや誤差関数に手を伸ばし始めると、決定係数を評価指標として使えなくなってしまうという課題があります。

予測モデルをビジネスに活用する上で、誤差関数に実務の事情を反映してカスタマイズする姿勢は大切です。予測を上に外すと下に外すのでは重要度が異なったり、説明変数の値によって精度の優先度が高いゾーンや低いゾーンがああったりなど、ビジネスの事情を誤差関数に込めることができれば、ビジネスのニーズに寄り添ったモデルの獲得につながります。

今回の記事では、決定係数を線形回帰以外でも使えるようにできないか、調べたり考えたりしたことを共有します。

# 決定係数とは

目的変数のデータ $y_1,...,y_n$ に対して、予測値 $\hat{y}_1,...,\hat{y}_n$ があるときに、決定係数 $R^2$ は

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

で定義されます。$\bar{y}$ はデータ $y_1,...,y_n$の平均値です。

予測値 $\hat{y_1},...,\hat{y_n}$ として、データ $y_1,...,y_n$ と完全に一致する予測ができた場合は、第二項の分子が0となり、決定係数 $R^2$ は1.0となります。

予測値 $\hat{y_1},...,\hat{y_n}$ として、すべて平均値 $\bar{y}$ を返すような非常に単純な予測をしてしまった場合は、第二項の分子と分母が同じ値となり、決定係数 $R^2$ は0.0となります。

式(1)からもわかるように、決定係数は線形回帰、特に二乗誤差 $l(x,y)=(x-y)^2$ で評価することを前提としていることがわかります。

# 決定係数に込められた「気持ち」を推察する

これを一般の誤差関数 $l(x,y)$ へ広げるために、決定係数に我々が期待する「気持ち」を言語化してみます:

1. 決定係数は、予測値 $\hat{y_1},...,\hat{y_n}$ がデータ $y_1,...,y_n$ に一致するとき1.0をとりたい。さらにいえば、「これ以上ない最高の予測」ができたといえるときに1.0をとりたい。
2. 決定係数は、予測値 $\hat{y_1},...,\hat{y_n}$ が常に平均値 $\bar{y}$ で固定して予測するような、「誰でも考えつくような単純な予測」をしたときに0.0をとりたい。

つまり、決定係数は予測の誤差を「これ以上ない最高の予測」と「誰でも考えつくような単純な予測」の間で正規化するような意味合いがあると思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509873/770b66b5-6b78-869b-7bec-2acc68bd0d25.png)


## 決定係数の一般化

この「気持ち」を満たすために、決定係数を次のように一般化できないでしょうか:

$$
一般化されたR^2 = \frac{単純な予測の誤差-今回の予測の誤差}{単純な予測の誤差 -最高の予測の誤差} 
$$

数式で書くならば、「これ以上ない最高の予測」を $y^\ast_1,...,y^\ast_n$、「誰でも考えつくような単純な予測」を $\underline{y}_1,...,\underline{y}_n$としたときに、

$$
一般化されたR^2 = \frac{\sum_{i=1}^{n}l(y_i,\underline{y_i})-\sum_{i=1}^{n}l(y_i,\hat{y_i})}{\sum_{i=1}^{n}l(y_i,\underline{y_i})-\sum_{i=1}^{n}l(y_i,y^\ast_i)} \tag{2}
$$

です。

この定義は0~1の間をとり、よりよい予測ほど1に近づくという、決定係数に期待する性質を満たしています。
また (2) は通常の決定係数の定義 (1) を含んでいて、誤差を二乗誤差 $l(x,y)=(x-y)^2$ 、「これ以上ない最高の予測」をデータの値そのものをぴたりと当てられたとき、「誰でも考えつくような単純な予測」を平均値 $\bar{y}$ を返す予測としたときに、通常の決定係数の定義 (1) と一致します。

この一般化された決定係数 (2) ならば、二乗誤差以外の誤差関数を使った回帰分析でも決定係数ライクな指標として使うことができそうです。

# 例1: 非対称な誤差関数
実際の数値例でやってみましょう。データ点は100サンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509873/0f2b8e4c-5216-11d5-2c5a-22b3bf83d8c5.png)

こちらの数値例で目的変数 $Y$ を説明変数 $X$ から予測する回帰モデルを立ててみます。

あきらかに適切ではないですが、単純な線形回帰をあてはめたのがこちらです:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509873/0b2e0f8c-cbc1-ebe6-553b-12cd69da60f0.png)

このとき通常の決定係数 (1) は0.205となりました。

さてここでビジネス上の事情から、予測モデルが予測を外したときのインパクトが上下非対称で、上に外すほうが下に外すよりも「2倍痛い」と仮定しましょう。これは例えば予測モデルを使って施策を打つときに、施策を打って空振りだったときの損失よりも、施策を打なかったせいでせっかくのチャンスを逃してしまう機会損失のほうが大きいようなシチュエーションに相当します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509873/bdc1379f-ac24-0984-afa0-b880e8c3a114.png)

誤差関数として
$$
l(y,\hat{y}) = \max \Big( \sqrt{2}(y-\hat{y}), (\hat{y}-y) \Big)^2
$$
を採用すれば上下に非対称な誤差を表現できます。
この誤差関数に対しても、(2) の数式を使えば決定係数を計算することができます。

通常の線形回帰で得たモデルと、少し大きめ（1.4倍）に予測したモデルの決定係数を比べてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509873/5b1a908d-d842-e4c5-ec81-6f9780644dba.png)


|  | 決定係数（二乗誤差） | 決定係数（非対称誤差） |
|:-:|:-:|:-:|
|線形回帰モデル|0.205|**0.230**|
|大きめに予測したモデル|0.058|**0.269**|

二乗誤差に対する決定係数は通常の線形回帰で得たモデルの方が高くなっていますが、非対称誤差に対する決定係数は少し大きめに予測したモデルの方が高くなっています。ビジネスに適した誤差関数を使うことで、よりビジネスの事情に寄り添ったモデルを高く評価できています。


# 例2: 確率分布で推定する場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509873/8c22eae6-c552-74c3-5b4a-9c42dda00738.png)

この数値例では説明変数 $x$ が大きくなるほど目的変数 $y$ の分散も大きくなることから、単純に "点" で予測するのは適切でなかったかもしれません。

今度は確率分布をあてはめることを考えます。データの傾向から、期待値が説明変数 $X$ で変動するような指数回帰モデルをあてはめてみましょう。

$$
Y \sim  \text{Exp} (1/X)
$$

確率分布で当てはめる際は、対数損失という誤差関数を使うのが適しています:

$$
l(y,f) = - \ln f(y)
$$

ただし $f$ は $y$ を予測しにいっている確率分布関数または確率密度関数です。

さて、対数損失での決定係数を計算するには、「この上ない最高の予測」「誰でも考えつく単純な予測」も決めてあげる必要があります。
今回はエイヤで

* 「この上ない最高の予測」を、正解±1.0の誤差で予測する一様分布
* 「誰でも考えつく単純な予測」を、 $[0,110]$ の区間で予測する一様分布

と設定してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509873/c28a3162-e53b-950b-32a0-dbaf1678d8d4.png)

対数損失での決定係数は、

``` math
\begin{align}
対数損失でのR^2 &= \frac{単純な予測の誤差-今回の予測の誤差}{単純な予測の誤差-最高の予測の誤差}
 \\
 &= \frac{100 \times -\ln(1/110)-今回の予測の誤差}{100 \times -\ln(1/110)-100 \times -\ln(1/2)}
\end{align}
```
計算したところ指数回帰モデルの対数損失の総和が333.6だったので、
``` math
\begin{align}
対数損失でのR^2 &= \frac{470.0-333.6}{470.0-69.3}
 \\
 &= 0.340
\end{align}
```
となり、指数回帰モデル $Y \sim  \text{Exp} (1/X)$ の決定係数は **0.340** と計算することができました。


# おわりに
今回は決定係数を線形回帰の外に連れ出し、二乗誤差以外の誤差関数でも使えるような一般化を考えてみました。
0~1の間にスケールが揃っているという決定係数の利点を活かしながら、個別の事情に即したモデルのカスタマイズがやりやすくなればいいなと思います。

# 参考: 関連文献
のちのち調べたところ、線形回帰以外のモデルの決定係数は「疑似決定係数」という名称で研究が進んでいるようです。

* "FAQ: What are pseudo R-squareds?". UCLA : https://stats.oarc.ucla.edu/other/mult-pkg/faq/general/faq-what-are-pseudo-r-squareds/
* "[離散選択] ロジットモデルの決定係数" https://ill-identified.hatenablog.com/entry/2014/07/24/005247

今回の記事で提案した決定係数の一般化は、上記の記事の中ではMacFaddenの方法やNagelkerkeの方法にエッセンスは近そうですが、まったく同じでもなさそうです。