gpt4 book ai didi

python - Scikit-learn 返回的确定系数 (R^2) 值小于 -1

转载 作者:太空狗 更新时间:2023-10-29 17:22:13 33 4
gpt4 key购买 nike

我正在做一个简单的线性模型。我有

fire = load_data()
regr = linear_model.LinearRegression()
scores = cross_validation.cross_val_score(regr, fire.data, fire.target, cv=10, scoring='r2')
print scores

产生

[  0.00000000e+00   0.00000000e+00  -8.27299054e+02  -5.80431382e+00
-1.04444147e-01 -1.19367785e+00 -1.24843536e+00 -3.39950443e-01
1.95018287e-02 -9.73940970e-02]

这怎么可能?当我对内置的糖尿病数据做同样的事情时,它工作得很好,但对于我的数据,它返回这些看似荒谬的结果。我做错了什么吗?

最佳答案

没有理由 r^2 不应该是负数(尽管它的名称中有 ^2)。 doc 中也说明了这一点.您可以将 r^2 视为模型拟合(在线性回归的上下文中,例如 1 阶模型(仿射))与 0 阶模型(仅拟合常数)的比较,两者都是通过最小化平方损失。最小化平方误差的常数是平均值。由于您正在使用遗漏的数据进行交叉验证,因此测试集的均值可能会与训练集的均值大相径庭。与仅预测测试数据的均值相比,仅此一项就可以在您的预测中产生更高的平方误差,从而导致负的 r^2 分数。

在最坏的情况下,如果您的数据根本无法解释您的目标,这些分数可能会变得非常负。尝试

import numpy as np
rng = np.random.RandomState(42)
X = rng.randn(100, 80)
y = rng.randn(100) # y has nothing to do with X whatsoever
from sklearn.linear_model import LinearRegression
from sklearn.cross_validation import cross_val_score
scores = cross_val_score(LinearRegression(), X, y, cv=5, scoring='r2')

这将导致负 r^2 值。

In [23]: scores
Out[23]:
array([-240.17927358, -5.51819556, -14.06815196, -67.87003867,
-64.14367035])

现在的重要问题是,这是否是因为线性模型在您的数据中找不到任何东西,或者是由于在数据预处理过程中可能修复的其他问题。您是否尝试过缩放列以使其均值为 0 和方差为 1?您可以使用 sklearn.preprocessing.StandardScaler 执行此操作。事实上,您应该通过使用 sklearn.pipeline.PipelineStandardScalerLinearRegression 连接到管道中来创建一个新的估算器。接下来您可能想尝试 Ridge 回归。

关于python - Scikit-learn 返回的确定系数 (R^2) 值小于 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23036866/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com