#はじめに
scikit-learnでR^2を計算した結果をそのまま出力していたのだが、R^2にしてはマイナスの値が大きくない?というつっこみがあったのであらためて調べてみた。
#scikit-learnのR^2(r2_score関数)定義
ソースを見てみる。
https://github.com/scikit-learn/scikit-learn/blob/0fb307bf3/sklearn/metrics/_regression.py#L499
重みなどいろいろ複雑な処理がはいっているが、定義はよくある以下の数式のようだ。
1 - \sum{(y-\hat{y})^2} / \sum{(y-\bar{y})^2}
ちなみに、データ数が1の場合、定義からも分かるように、後ろの項の分母が0になるため計算できない。
#とりうる値
では、このr2_scoreのとりうる値について考えて見よう。
最大値は定義から1である。
最小値はということ、$y$ と$\hat{y}$ の差を大きくすれば、後ろの項の分子はいくらでも大きくできるため、ものすごく大きなはずれ値があれば、いくらでもマイナスになりそうだ。
#やってみよう
まずは同じ値を持つ者同士を引数に。
>>>from sklearn.metrics import r2_score
>>>r2_score([1,2,3,4,5],[1,2,3,4,5])
1.0
ちょっとだけ変えてみる。
>>> r2_score([1,2,3,4,5],[1,3,3,3,5])
0.8
全然違うものにしてみる。
おっと、いきなりマイナス。
>>> r2_score([1,2,3,4,5],[5,4,3,2,1])
-3.0
めっちゃでかいはずれ値を入れる
>>> r2_score([1,2,3,4,5],[100,4,3,2,1])
-981.5
なるほど、いくらでもマイナスはとれそうだ。
#おわりに
これで次回から「scikit-learnの関数の仕様です」と胸をはっていえそうだ。