LoginSignup
6
4

More than 3 years have passed since last update.

scikit-learnのr2_score関数の取りうる範囲に関するメモ

Last updated at Posted at 2020-11-30

はじめに

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の関数の仕様です」と胸をはっていえそうだ。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4