【问题标题】:Multiple Regression Python多元回归 Python
【发布时间】:2018-04-30 08:38:02
【问题描述】:

我真的不明白我的(简单)代码有什么问题......

我只想测试一个多元线性回归(....!)。

 import pandas as pd
 import numpy as np
 import scipy.stats as st
 import sklearn
 n = 1000

 X1 = linspace(2, 8.5, n)
 X2 = linspace(-4, 2.9, n)
 X3 = linspace(-1, 16, n)

 X = np.transpose( [X1, X2, X3] )

 Y = 2*X1 + 3.2*X2 -1.2*X3  +  4  + st.norm.rvs(size = n, loc = 0, scale = 0.6)

 X = pd.DataFrame( X , columns = ["X1", "X2", "X3"])
 Y = pd.DataFrame(Y, columns = ["Y"])

 #Create linear regression object:
 my_reg = sklearn.linear_model.LinearRegression()

 #Train:
 my_reg.fit(X, Y)

 print('Coefficients: \n', my_reg.coef_)
 print('Constant: \n', my_reg.intercept_)

我得到了一些愚蠢的结果,比如系数是 [ 0.25127347 0.26673645 0.65717676] ...

我也尝试过OLS的方式,但我仍然得到无意义的coef(略有不同但仍然很愚蠢)

(它适用于单变量线性回归,例如 Y = 2*X + 5,我会得到 coef 并截距非常接近真实值)

【问题讨论】:

  • 这里习惯性地包含所有必要的导入语句,以确保希望帮助您的每个人都可以轻松地做到这一点。请考虑相应地编辑您的帖子。
  • 我认为主要问题是您的矩阵几乎是秩不足的。您的X1X2 如此强烈共线,以至于数值结果变得不可靠。我的猜测是,如果您在这些列中添加噪音,您将获得“真实”系数。这里的关键词是多重共线性。

标签: python regression


【解决方案1】:

谢谢大家!

我有一段时间没有执行线性回归,当然这是因为 X 不可逆(在 R 中,它给了我 'nan')。

所以这不是一个聪明的问题......

再次感谢!

【讨论】:

  • 实际上,我很惊讶sklearn 中没有内置检查,R 中也有。
【解决方案2】:

系数与您设置的“真实”系数完全不同的事实表明多重共线性可能是一个问题。您的代码的问题是您的 X 矩阵几乎是奇异的,这会导致数值结果不稳定。从@R.yan 的图表中可以看出,您的X1X2 几乎相同,除了线性移位。您的 X 矩阵(包含 1000 行和三列)的秩仅为 2,这一事实证实了这一点。请参阅:

np.linalg.matrix_rank(X)
Out[26]: 2

请尝试以下方法:

import pandas as pd
import numpy as np
import scipy.stats as st
import sklearn
from sklearn.linear_model import LinearRegression
n = 1000

# adding noise to your data:
X1 = np.linspace(2, 8.5, n) + st.norm.rvs(size=n ,loc = 0, scale = 1)
X2 = np.linspace(-4, 2.9, n) + st.norm.rvs(size=n ,loc = 0, scale = 1)
X3 = np.linspace(-1, 16, n) + st.norm.rvs(size=n ,loc = 0, scale = 1)

X = np.transpose( [X1, X2, X3] )

Y = 2*X1 + 3.2*X2 -1.2*X3  +  4  + st.norm.rvs(size=1000 ,loc = 0, scale = 1)

X = pd.DataFrame( X , columns = ["X1", "X2", "X3"])
Y = pd.DataFrame(Y, columns = ["Y"])
#Create linear regression object:
my_reg = sklearn.linear_model.LinearRegression(fit_intercept = True)

#Train:
res = my_reg.fit(X, Y)

print('Coefficients: \n', my_reg.coef_)
print('Constant: \n', my_reg.intercept_)

Coefficients: 
 [[ 1.99273588  3.20068392 -1.19688422]]
Constant: 
 [ 4.02296003]

现在,我们得到正确的系数和满秩矩阵:

np.linalg.matrix_rank(X)
Out[32]: 3

请注意,在线性回归中,X 的排名必须等于列数(或行数,如果少的话)。如果不是,则意味着存在多重共线性,这会使X'X 的逆的数值结果不稳定(取决于使用的算法)。有关多重共线性的更多信息,请参阅this description

【讨论】:

  • 很好的解释:)
【解决方案3】:

我猜代码给了你正确的答案。我根据你的回归中的 coef_ 和 intercept_ 绘制预测的 Y,并得到下图。

import pandas as pd
import numpy as np
import scipy.stats as st
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
n = 1000

X1 = np.linspace(2, 8.5, n)
X2 = np.linspace(-4, 2.9, n)
X3 = np.linspace(-1, 16, n)

X = np.transpose( [X1, X2, X3] )

Y = 2*X1 + 3.2*X2 -1.2*X3  +  4  + st.norm.rvs(size=1000 ,loc = 0, scale = 0.6)

X = pd.DataFrame( X , columns = ["X1", "X2", "X3"])
Y = pd.DataFrame(Y, columns = ["Y"])
#Create linear regression object:
my_reg = sklearn.linear_model.LinearRegression()
plt.plot(Y, color='blue', label='Y')
#Train:
res = my_reg.fit(X, Y)

print('Coefficients: \n', my_reg.coef_)
print('Constant: \n', my_reg.intercept_)

plt.scatter(X.index.values,X['X1'], c='black')
plt.scatter(X.index.values,X['X2'], c='black')
plt.scatter(X.index.values,X['X3'], c='black')


Y_pred = my_reg.coef_[0][0]*X['X1'] + my_reg.coef_[0][1]*X['X2'] +my_reg.coef_[0][2]*X['X3'] + my_reg.intercept_
plt.plot(Y_pred, color="red", label='predict')
plt.legend()

Out[]: ('Coefficients: \n', array([[  3.13842691e+12,   1.01316187e+13,  -5.31223199e+12]]))
('Constant: \n', array([  2.89373889e+13]))

【讨论】:

    猜你喜欢
    • 2017-02-25
    • 2013-07-17
    • 2010-11-12
    • 2018-12-19
    • 1970-01-01
    • 2016-10-15
    • 2021-07-07
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多