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

时间:2014-04-12 22:24:03

标签: python statistics scikit-learn

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

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]

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

4 个答案:

答案 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执行此操作。事实上,您应该通过使用StandardScalerLinearRegressionsklearn.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”)。简单的检查,但可以节省一些头痛的时间。