为什么线性回归特征系数变得超大?

数据挖掘 Python scikit-学习 特征选择 线性回归 特征
2022-02-25 15:44:31

介绍

我已经使用实现了线性回归,sklearn并且在所有计算之后我得到了这样的结果:

Feature: 0, coef: -9985335237.46533
Feature: 1, coef: 417387013140.39661
Feature: 2, coef: -2.85809
Feature: 3, coef: 1.50522
Feature: 4, coef: -1.07076

数据

我的数据是基于用户在健身房的访问。所有数据归一化0 <= x <= 1数据集有 10k 个观测值。

X:

  • feature_0:健身房的评分
  • feature_1:健身房的评论(评分)计数
  • feature_2:健身房的单次访问价格
  • feature_3:健身房的无限订阅价格
  • feature_4:从用户家到健身房的距离| 计算min(x / 30, 1.0),因为平均值是 15.17

Y:用户对该健身房的访问次数

数据样本


代码

from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
from matplotlib import pyplot
from numpy import loadtxt

# define dataset
x = loadtxt('formatted_data_x.txt')
y = loadtxt('formatted_data_y.txt')
# define the model
model = LinearRegression()
# fit the model
model.fit(x, y)
# get importance
importance = model.coef_
# summarize feature importance
for i,v in enumerate(importance):
    print('Feature: %0d, coef: %.5f' % (i,v))

问题

为什么线性回归特征系数变得超大?没事吧?

Feature: 0, coef: -9985335237.46533
Feature: 1, coef: 417387013140.39661
...

PS:我完全不熟悉StackExchangeML\DS的这个“部分” ,所以如果我做错了什么或者我必须提供更多信息,请告诉我!任何帮助,将不胜感激。提前致谢!

1个回答

线性回归中的大系数不一定是问题。它们可能很大,因为某些变量被重新调整。你提到你做了一些重新调整,但没有提供细节。因此,无法确定到底发生了什么。

这是一个(一般)示例,解释了系数如何变得“大”(在 中R)。假设我们要建模“访问”(y)取决于“评级”(x):

# Data
df = data.frame(c(1,3,5,3,7,5,8,9,7,10),c(34,54,31,45,65,78,56,87,69,134))
colnames(df)<-c("rating","visits")

# Regression 1
reg1 = lm(visits~rating,data=df)
summary(reg1)

回归结果为:

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   19.452     15.273   1.274   0.2385  
rating         7.905      2.379   3.322   0.0105 *

这告诉我们,当增加一个单位时,visits增加约 7.9 。rating这基本上是一个线性函数,截距为 19.45,斜率为 7.9。由于我们的模型是

y=β0+β1x+u,
相应的(估计的)线性函数如下所示:
f(x)=19.45+7.9x.

我们可以预测和绘制我们的模型。结果和预期的一样,是一个正的线性函数。

# Predict and plot
pred1 = predict(reg1,newdata=df)
plot(df$rating,df$visits,xlab="Rating",ylab="Visits")
lines(df$rating,pred1)

在此处输入图像描述

现在是有趣的部分:我对x. 即,我划分x通过一些“大”数字,我运行与以前相同的回归:

# Transform x
large_integer = 10000000
df$rating2 = df$rating/large_integer
df

   rating visits rating2
1       1     34   1e-07
2       3     54   3e-07
3       5     31   5e-07
4       3     45   3e-07
5       7     65   7e-07
6       5     78   5e-07
7       8     56   8e-07
8       9     87   9e-07
9       7     69   7e-07
10     10    134   1e-06

# Regression 2 (with transformed x)
reg2 = lm(visits~rating2,data=df)
summary(reg2)

结果是:

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) 1.945e+01  1.527e+01   1.274   0.2385  
rating2     7.905e+07  2.379e+07   3.322   0.0105 *

如您所见,rating现在的系数相当大。但是,当我进行预测和绘图时,我得到的结果与以前基本相同。唯一改变的是“规模”x(道路x表示)。

在此处输入图像描述

让我们比较rating两个回归中的系数。

在第一种情况下,它是:

# Relevant coefficient "rating" from reg1 (the "small" one)
reg1$coefficients[2]

  rating 
7.904762 

在第二种情况下,它是:

# Relevant coefficient "rating2" from reg2 (the "large" one)
reg2$coefficients[2]

 rating2 
79047619

但是,当我将系数除以rating2与“重新缩放”数据时相同的“大”数时,我得到:

# "Rescale" large coefficient
reg2$coefficients[2]/large_integer

 rating2 
7.904762

如您所见,“重新缩放”的系数rating2与 的原始系数完全相同rating

你可以做些什么来检查你的回归:

  • 运行回归而不进行任何重新缩放,看看结果是否有意义

  • 从回归中做出预测

  • 重新调整您的数据(即“标准化”),这应该有助于获得更好的预测,因为在这种情况下数据不那么“不稳定”。然而,系数不再有自然的解释

  • 将标准化数据与非标准化数据进行比较,以了解您的数据如何变化。根据上面的讨论,您应该知道标准化后非常小的或大的系数是否有意义

  • 做出预测,与上面的预测进行比较