Значительное несоответствие между "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-это тоже правильно. Большое спасибо за вашу помощь!
3 ответов:
Упомянутый вопрос верен - если вы работаете через вычисление для остаточной суммы квадратов и общей суммы квадратов, вы получаете то же значение, что и склеарн:
Идея отрицательного значения заключается в том, что вы были бы ближе к фактическим значениям, если бы каждый раз предсказывали среднее значение (которое соответствовало бы r2 = 0).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
Я думаю, что вы неверно истолковали Википедию. Пример в Википедии делает это нет состояние:
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^20,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