#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
среднее значение выборки.
Таким образом
- они измеряют разные вещи
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-квадрат они должны быть равны.