我正在做一个简单的线性模型。我有
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]
这怎么可能?当我对内置的糖尿病数据做同样的事情时,它的效果非常好,但对于我的数据,它会返回这些看似荒谬的结果。我做错了什么吗?
答案 0 :(得分:20)
r^2
没有理由不应该是否定的(尽管名称中有^2
)。这也在doc中说明。你可以看到r^2
作为模型拟合的比较(在线性回归的上下文中,例如1阶(仿射)的模型)到0阶模型(只是拟合常数),两者都是通过最小化a平方损失。常数最小化平方误差的是平均值。由于您使用遗漏数据进行交叉验证,因此您的测试集的平均值可能会与训练集的平均值大不相同。仅这一点就可以在预测中产生更高的平方误差,而不仅仅是预测测试数据的平均值,从而导致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
执行此操作。事实上,您应该通过使用StandardScaler
将LinearRegression
和sklearn.pipeline.Pipeline
连接到管道来创建新的估算工具。
接下来,您可能想尝试Ridge回归。
答案 1 :(得分:8)
R²= 1 - RSS / TSS,其中RSS是残差平方和Σ(y - f(x))²,TSS是平方和的总和Σ(y - mean(y))²。现在对于R²≥-1,需要RSS /TSS≤2,但是很容易构建一个不适用的模型和数据集:
>>> x = np.arange(50, dtype=float)
>>> y = x
>>> def f(x): return -100
...
>>> rss = np.sum((y - f(x)) ** 2)
>>> tss = np.sum((y - y.mean()) ** 2)
>>> 1 - rss / tss
-74.430972388955581
答案 2 :(得分:5)
仅仅因为R^2
可能是否定的并不意味着它应该是。
可能性1:代码中的错误。
您应该仔细检查的常见错误是您正确传递参数:
r2_score(y_true, y_pred) # Correct!
r2_score(y_pred, y_true) # Incorrect!!!!
可能性2:小数据集
如果你得到负R ^ 2,你也可以检查过度拟合。请记住,cross_validation.cross_val_score()
不会随机改变您的输入,因此如果您的样本无意中被排序(例如按日期),那么您可能会在每个折叠上构建模型,这些模型不能预测其他折叠。
尝试减少功能数量,增加样本数量,减少折叠次数(如果使用cross_validation
)。虽然此处没有官方规则,但您的m x n
数据集(其中m
是样本数,n
是要素数)应该是一个形状
m > n^2
当您使用交叉验证f
作为折叠数时,您应该瞄准
m/f > n^2
答案 3 :(得分:0)
如果回归r ^ 2得分为负,请确保在对模型进行拟合/评分之前从数据集中删除所有唯一标识符(例如“ id”或“ rownum”)。简单的检查,但可以节省一些头痛的时间。