【问题标题】:sklearn.metrics r2_score negativesklearn.metrics r2_score 负数
【发布时间】:2023-01-24 20:31:33
【问题描述】:

我无法理解 sklearn.metrics 中的r2_score,它似乎返回无意义的值。我遵循了 stackoverflow 提出的所有“类似问题”(其中一些避免了错误的参数序列,这就是为什么我在下面包含两个命令),但我仍然迷路了:

import pandas as pd
from sklearn import linear_model
from sklearn.metrics import r2_score

data = [[0.70940504,0.81604095],
        [0.69506565,0.78922145],
        [0.66527803,0.72174502],
        [0.75251691,0.74893098],
        [0.72517034,0.73999503],
        [0.68269306,0.72230534],
        [0.75251691,0.77163700],
        [0.78954422,0.81163350],
        [0.83077994,0.94561242],
        [0.74107290,0.75122162]]

df = pd.DataFrame(data)
x  = df[0].to_numpy().reshape(-1,1)
y  = df[1].to_numpy()
print("r2               = ", r2_score(y, x))
print("r2 (wrong order) = ", r2_score(x, y))

lreg = linear_model.LinearRegression()
lreg.fit(x, y)
y_pred = lreg.predict(x)
print("predicted values: ", y_pred)
print("slope           = ", lreg.coef_)
print("intercept       = ", lreg.intercept_)
print("score           = ", lreg.score(x, y))

回报

r2               =  0.01488309898850404  # surprise!!
r2 (wrong order) =  -0.7313385423077101  # even more of a surprise!!

predicted values:  [0.75664194 0.74219177 0.71217403 0.80008687 0.77252903 0.7297236 0.80008687 0.83740023 0.87895451 0.78855445]
slope           =  [1.00772544]
intercept       =  0.04175643677503682
score           =  0.5778168671193278

在 Excel 中绘制数据和预测值表明 linear_model 返回值有意义(橙色点落在 Excel 趋势线上),但 r2_score 返回值没有意义(在两个参数序列中):

【问题讨论】:

    标签: scikit-learn sklearn-pandas


    【解决方案1】:

    您的模型解释了近 60% 的目标方差,这比平均预测变量(解释 0)要好得多。

    为什么你的单一​​特征解释得少?主要是因为在这种情况下拦截:r2_score(y, x + 0.042) 几乎可以正常工作。

    简单来说,您可以将 R2 视为 1 - (mean_squared_error(y, y_pred) / y.var())。不以目标均值为中心不可避免地会增大残差平方和,从而导致 R2 较差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-27
      • 2020-02-23
      • 1970-01-01
      • 2016-12-10
      • 2017-07-16
      • 1970-01-01
      • 2016-11-14
      • 2019-03-07
      相关资源
      最近更新 更多