Значительное несоответствие между "r2 score" из " scikit-learn` и вычислением R^2



Вопрос



Почему существует значительная разница между r2_score функция в scikit-learn и формула для коэффициента детерминации , как описано в Википедии ? Какой из них правильный?






Контекст



Я использую Python 3.5 для предсказания линейных и квадратичных моделей ,и одна из мер хорошей подгонки, которую я пробую, - это. Тем не менее, во время тестирования есть заметная разница между r2_score метрика в scikit-learn и расчет, представленный в Википедии.






Код



Я предоставляю свой код здесь в качестве ссылки, которая вычисляет пример на странице Википедии, связанной выше.




from sklearn.metrics import r2_score
import numpy

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

# Convert to numpy array and ensure double precision to avoid single precision errors
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, а справочное значение в Википедии - 0.998.



Спасибо!



UPDATE: это отличается от этого вопроса о том, как R^2 вычисляется в scikit-learn как то, что я попытка понять и прояснить-это расхождение между обоими результатами. В этом вопросе говорится, что формула, используемая в scikit, совпадает с Формулой Википедии, которая не должна приводить к различным значениям.



UPDATE #2: оказывается, я ошибся, читая пример статьи Википедии. Ответы и комментарии ниже упоминают, что пример, который я предоставляю, предназначен для линейного, наименьшего квадратического соответствия значений (x, y) в Примере. Для этого ответ в статье Википедии: правильный. Для этого, предоставленное значение R^2 составляет 0,998. Для R^2 между обоими векторами, ответ пакет scikit-это тоже правильно. Большое спасибо за вашу помощь!

949   3  

3 ответов:

Упомянутый вопрос верен - если вы работаете через вычисление для остаточной суммы квадратов и общей суммы квадратов, вы получаете то же значение, что и склеарн:

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).

Я думаю, что вы неверно истолковали Википедию. Пример в Википедии делает это нет состояние:

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

Вместо этого он говорит, что R^2 для линейного наименьшего квадрата соответствует данным:

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

Равно 0.998

Рассмотрим этот сценарий, который сначала использует np.linalg.lstsq чтобы найти наименьшие квадраты подходят, и использует оба метода, чтобы найти R^2 0,998 для обоих:

import numpy as np
from sklearn.metrics import r2_score

x=np.arange(1,6,1)
y=np.array([1.9, 3.7, 5.8, 8.0, 9.6])

A=np.vstack([x, np.ones(len(x))]).T

# Use numpy's least squares function
m, c = np.linalg.lstsq(A, y)[0]

print m,c
# 1.97 -0.11

# Define the values of our least squares fit
f=m*x+c

print f
# [ 1.86  3.83  5.8   7.77  9.74]

# Calculate R^2 explicitly
yminusf2=(y-f)**2
sserr=sum(yminusf2)
mean=float(sum(y))/float(len(y))
yminusmean2=(y-mean)**2
sstot=sum(yminusmean2)
R2=1.-(sserr/sstot)

print R2
# 0.99766066838

# Use scikit
print r2_score(y,f)
# 0.99766066838

r2_score(y,f) == R2
# True

Коэффициент детерминации эффективно сравнивает дисперсию в данных с дисперсией в остатке. Остаток-это разность между предсказанным и наблюдаемым значением, а его дисперсия-сумма квадратов этой разности.

Если предсказание совершенно, то дисперсия остатка равна нулю. Следовательно, коэффициент детерминации равен единице. Если предсказание не является совершенным, некоторые из остатков не равны нулю, а дисперсия остатков положительна. Следовательно, коэффициент детерминации меньше единицы. Очевидно, что игрушечная задача имеет низкий коэффициент детерминации, так как большинство предсказанных значений далеки. Коэффициент детерминации -3.86 означает, что дисперсия остатка в 4.86 раз больше дисперсии наблюдаемых значений.

Значение 0.998 исходит из коэффициента определения линейного соответствия наименьших квадратов набора данных. Это означает, что наблюдаемые значения связаны с предсказанные значения с помощью линейной зависимости (плюс константа), которая минимизирует дисперсию остатка. Наблюдаемые и прогнозируемые значения из игрушечной задачи сильно линейно зависят, и поэтому коэффициент определения линейной подгонки наименьших квадратов очень близок к единице.

Comments

    Ничего не найдено.