SciKit Learn R-квадрат сильно отличается от квадрата корреляции Пирсона R

#python #scikit-learn #pearson-correlation #scipy.stats #coefficient-of-determination

#python #scikit-learn #pearson-корреляция #scipy.stats #коэффициент детерминации

Вопрос:

У меня есть 2 numpy-массива, поэтому:

 a = np.array([32.0, 25.97, 26.78, 35.85, 30.17, 29.87, 30.45, 31.93, 30.65, 35.49, 
              28.3, 35.24, 35.98, 38.84, 27.97, 26.98, 25.98, 34.53, 40.39, 36.3])

b = np.array([28.778585, 31.164268, 24.690865, 33.523693, 29.272448, 28.39742,
              28.950092, 29.701189, 29.179174, 30.94298 , 26.05434 , 31.793175,
              30.382706, 32.135723, 28.018875, 25.659306, 27.232124, 28.295502,
              33.081223, 30.312504])
 

Когда я вычисляю R-квадрат с помощью SciKit Learn, я получаю совершенно другое значение, чем когда я вычисляю корреляцию Пирсона, а затем возводю результат в квадрат:

 sk_r2 = sklearn.metrics.r2_score(a, b)
print('SciKit R2: {:0.5f}n'.format(sk_r2))

pearson_r = scipy.stats.pearsonr(a, b)
print('Pearson R: ', pearson_r)
print('Pearson R squared: ', pearson_r[0]**2)
 

Результаты:
SciKit R2: 0,15913

Pearson R: (0.7617075768854164, 9.534162339384296e-05)
Pearson R в квадрате: 0.5801984323799696

Я понимаю, что значение R-квадрата иногда может быть отрицательным для плохо подходящей модели (https://stats.stackexchange.com/questions/12900/when-is-r-squared-negative ) и, следовательно, квадрат корреляции Пирсона не всегда равен R-квадрату. Однако я думал, что для положительного значения R-квадрата оно всегда равно квадрату корреляции Пирсона? Чем эти значения R-квадрата так отличаются?

Ответ №1:

Коэффициент корреляции Пирсона R и коэффициент детерминации R-квадрат — это две совершенно разные статистики.

Вы можете взглянуть на https://en.wikipedia.org/wiki/Pearson_correlation_coefficient и https://en.wikipedia.org/wiki/Coefficient_of_determination


Обновить

Коэффициент r Persons является мерой линейной корреляции между двумя переменными и равен

введите описание изображения здесь

где bar x и bar y являются средними значениями выборок.

Коэффициент детерминации R2 является мерой соответствия и равен

введите описание изображения здесь

где hat y — прогнозируемое значение y и bar y среднее значение выборки.

Таким образом

  1. они измеряют разные вещи
  2. r**2 не равно R2 , потому что их формулы совершенно разные

обновление 2

r**2 равно R2 только в том случае, если вы вычисляете r с помощью переменной (скажем y ) и прогнозируемой переменной hat y из линейной модели

Давайте приведем пример, используя два предоставленных вами массива

 import numpy as np
import pandas as pd
import scipy.stats as sps
import statsmodels.api as sm
from sklearn.metrics import r2_score as R2
import matplotlib.pyplot as plt

a = np.array([32.0, 25.97, 26.78, 35.85, 30.17, 29.87, 30.45, 31.93, 30.65, 35.49, 
              28.3, 35.24, 35.98, 38.84, 27.97, 26.98, 25.98, 34.53, 40.39, 36.3])

b = np.array([28.778585, 31.164268, 24.690865, 33.523693, 29.272448, 28.39742,
              28.950092, 29.701189, 29.179174, 30.94298 , 26.05434 , 31.793175,
              30.382706, 32.135723, 28.018875, 25.659306, 27.232124, 28.295502,
              33.081223, 30.312504])

df = pd.DataFrame({
    'x': a,
    'y': b,
})

df.plot(x='x', y='y', marker='.', ls='none', legend=False);
 

введите описание изображения здесь

теперь мы подходим к модели линейной регрессии

 mod = sm.OLS.from_formula('y ~ x', data=df)
mod_fit = mod.fit()
print(mod_fit.summary())
 

вывод

                             OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.580
Model:                            OLS   Adj. R-squared:                  0.557
Method:                 Least Squares   F-statistic:                     24.88
Date:                Mon, 29 Mar 2021   Prob (F-statistic):           9.53e-05
Time:                        14:12:15   Log-Likelihood:                -36.562
No. Observations:                  20   AIC:                             77.12
Df Residuals:                      18   BIC:                             79.12
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     16.0814      2.689      5.979      0.000      10.431      21.732
x              0.4157      0.083      4.988      0.000       0.241       0.591
==============================================================================
Omnibus:                        6.882   Durbin-Watson:                   3.001
Prob(Omnibus):                  0.032   Jarque-Bera (JB):                4.363
Skew:                           0.872   Prob(JB):                        0.113
Kurtosis:                       4.481   Cond. No.                         245.
==============================================================================
 

и вычисляем оба r**2 и R2 и мы видим, что в этом случае они равны

 predicted_y = mod_fit.predict(df.x)
print("R2 :", R2(df.y, predicted_y))
print("r^2:", sps.pearsonr(df.y, predicted_y)[0]**2)
 

вывод

 R2 : 0.5801984323799696
r^2: 0.5801984323799696
 

Вы сделали R2(df.x, df.y) , что не может быть равно нашим вычисленным значениям, потому что вы использовали меру соответствия между независимыми x и зависимыми y переменными. Вместо этого мы использовали оба r и R2 с y и прогнозируемое значение y .

Комментарии:

1. Пожалуйста, прочитайте вопрос правильно. Я не сравниваю корреляцию Пирсона с R-squared напрямую. Я сравниваю квадрат корреляции Пирсона (pearson_r[0] **2) с R-квадратом. Для положительного значения R-квадрат они должны быть равны.

2. Я обновил ответ с полным объяснением

3. Это просто неверно. В случае простой линейной регрессии только с одним предиктором R2 = r2 = Corr(x, y) ** 2. Смотрите эту ссылку: economictheoryblog.com/2014/11/05/proof

4. Я объяснил больше, надеюсь, теперь это ясно 🙂

Ответ №2:

Я тоже был в такой же ситуации. Для меня это произошло, когда я сравнил R-squared в scikit-learn с R-squared, поскольку он вычисляется пакетом R caret.

R-squared в пакете каретки R, или в вашем случае in scipy.stats.pearsonr , является квадратом «Pearson R» по определению. Мера корреляции. Смотрите Его определение здесь (по определению может быть от нуля до 1).

Однако R-квадрат в scikit-learn является мерой точности, вы можете посмотреть его определение в руководстве пользователя.(по определению может быть между -Inf и 1).

Итог, не сравнивайте их. Это разные меры.

Комментарии:

1. Пожалуйста, прочитайте вопрос правильно. Я не сравниваю корреляцию Пирсона с R-squared напрямую. Я сравниваю квадрат корреляции Пирсона (pearson_r[0] **2) с R-квадратом. Для положительного значения R-квадрат они должны быть равны.