使用sklearn LinearRegression拟合多元线性回归时a0系数异常问题排查
问题原因与解决方法
你的问题出在sklearn的LinearRegression默认会自动拟合截距项(也就是你要的a0),但你手动在特征矩阵X里加入了全1的x0列,这就造成了多重共线性——模型识别到x0和默认的截距项完全线性相关,所以把x0的系数强制设为0,而真正的a0其实存在模型的intercept_属性里。
两种修正方案
方案一:移除手动添加的x0列(推荐)
让模型自动处理截距,只传入x1和x2作为特征:
import pandas from sklearn import linear_model df = pandas.read_csv("multi_regress.csv") # 只取x1和x2作为特征,去掉x0 X = df[['x1', 'x2']] y = df['y'] regr = linear_model.LinearRegression() regr.fit(X,y) # a0是截距项 print("a0 =", regr.intercept_) # a1和a2是系数数组的两个元素 print("a1 =", regr.coef_[0]) print("a2 =", regr.coef_[1])
运行后会得到和你手动计算一致的结果:a0≈3.7148,a1≈1.1013,a2≈1.8517。
方案二:关闭自动拟合截距
如果你非要保留手动添加的x0列,可以初始化模型时设置fit_intercept=False,告诉模型不要自动添加截距:
import pandas from sklearn import linear_model df = pandas.read_csv("multi_regress.csv") X = df[['x0', 'x1', 'x2']] y = df['y'] # 关闭自动拟合截距 regr = linear_model.LinearRegression(fit_intercept=False) regr.fit(X,y) # 此时coef_的第一个元素就是a0,后面是a1、a2 print(regr.coef_)
输出会和你手动计算的结果完全匹配:[3.71481481 1.10129032 1.8516129 ]。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

