1. ホーム
  2. python

[解決済み] scikit-learn`の `r2_score` とR^2計算の間に重大な不一致がある。

2022-02-07 05:29:48

質問

質問

との間に大きな差があるのはなぜですか? r2_score の関数を使用します。 の計算式と ウィキペディアの決定係数 ? どちらが正しいのでしょうか?


コンテキスト

Python 3.5を使って線形モデルや二次モデルを予測しているのですが、適合度の測定の1つに.NET Frameworkがあります。 しかし、テストしているうちに、.NET Frameworkの間に著しい違いがあることがわかりました。 r2_score のメトリックは scikit-learn とWikipediaに掲載されている計算方法を参考にしています。


コード

上記のリンク先のWikipediaのページにある例を計算した私のコードを参考としてここに提供します。

from sklearn.metrics import r2_score
numpyをインポートする

y = [1, 2, 3, 4, 5]
f = [1.9, 3.7, 5.8, 8.0, 9.6]

# 単精度エラーを避けるため、倍精度を保証する。
observed = numpy.array(y, dtype=numpy.float64)
predicted = numpy.array(f, dtype=numpy.float64)

scipy_value = r2_score(observed, predicted)

>>> scipy_value。

明らかなように scipy の計算値は -3.8699999999999992 であるのに対し、Wikipediaの参照値では 0.998 .

ありがとうございました。

UPDATE とは異なります。 scikit-learnでR^2がどのように計算されるかについての質問です。 私が理解しようとし、明らかにしたことは、両者の結果の不一致です。 この質問では、scikitで使用されている数式はWikipediaのものと同じであり、異なる値になることはないはずだと述べています。

UPDATE #2。 Wikipediaの記事の例題を読み間違えていたことが判明しました。回答や以下のコメントで、私が提供する例は、例の(x, y)の値の線形、最小二乗フィットのためのものであることに言及しています。それについては、Wikipediaの記事の回答が正しいです。それに対して、提供されたR^2 calueは0.998です。両ベクトル間のR^2については、scikitの答えも正しいです。ご協力ありがとうございました。

どのように解決するのですか?

参照した質問は正しいです。残差平方和と総和平方和の計算をやり通すと、sklearnと同じ値が得られます。

In [85]: import numpy as np

In [86]: y = [1,2,3,4,5]

In [87]: f = [1.9, 3.7, 5.8, 8.0, 9.6]

In [88]: SSres = sum(map(lambda x: (x[0]-x[1])**2, zip(y, f)))

In [89]: SStot = sum([(x-np.mean(y))**2 for x in y])

In [90]: SSres, SStot
Out[90]: (48.699999999999996, 10.0)

In [91]: 1-(SSres/SStot)
Out[91]: -3.8699999999999992

負の値の背後にある考え方は、毎回平均を予測するだけなら実際の値に近かっただろうということです(これは、r2 = 0に相当します)。