首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >状态模型OLS与scikit线性回归的差异

状态模型OLS与scikit线性回归的差异
EN

Stack Overflow用户
提问于 2021-11-23 13:17:02
回答 1查看 816关注 0票数 0

我尝试在虹膜数据集上使用线性回归模型。

代码语言:javascript
运行
复制
from sklearn import datasets
import seaborn as sns
import pandas as pd

import statsmodels.api as sm
import statsmodels.formula.api as smf
from sklearn.linear_model import LinearRegression

# load iris data
train = sns.load_dataset('iris')
train

# one-hot-encoding
species_encoded = pd.get_dummies(train["species"], prefix = "speceis")
species_encoded

train = pd.concat([train, species_encoded], axis = 1)
train

# Split by feature and target
feature = ["sepal_length", "petal_length", "speceis_setosa", "speceis_versicolor", "speceis_virginica"]
target  = ["petal_width"]

X_train = train[feature]
y_train = train[target]

案例1:状态模型

代码语言:javascript
运行
复制
# model
X_train_constant = sm.add_constant(X_train)
model = sm.OLS(y_train, X_train_constant).fit() 
print("const : {:.6f}".format(model.params[0]))
print(model.params[1:])

result :
const : 0.253251
sepal_length         -0.001693
petal_length          0.231921
speceis_setosa       -0.337843
speceis_versicolor    0.094816
speceis_virginica     0.496278

案例2:科学知识-学习

代码语言:javascript
运行
复制
# model                          
model = LinearRegression()
model.fit(X_train, y_train)
print("const : {:.6f}".format(model.intercept_[0]))
print(pd.Series(model.coef_[0], model.feature_names_in_))

result :
const : 0.337668
sepal_length         -0.001693
petal_length          0.231921
speceis_setosa       -0.422260
speceis_versicolor    0.010399
speceis_virginica     0.411861 

为什么状态模型和滑雪板的结果不同?

此外,这两个模型的结果是相同的,除了全部或部分的单一热编码功能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-23 21:19:43

你包括了一个完整的一个热编码的虚拟人作为回归元,这导致了一个等于常数的线性组合,因此你有完美的多重共线性:你的协方差矩阵是奇异的,你不能取它的逆。

statsmodelssklearn都依赖摩尔-彭罗斯伪逆,可以很好地反演奇异矩阵,问题是在奇异协方差矩阵情况下得到的系数在任何物理意义上都没有任何意义。不同包之间的实现略有不同(sklearn依赖于scipy.stats.lstsqstatsmodels有一些自定义过程statsmodels.tools.pinv_extended,基本上是具有最小更改的numpy.linalg.svd ),因此在一天结束时,它们都会显示无意义的值(因为不能获得有意义的系数),这只是在设计中选择显示什么样的胡说八道。

如果你取一个热编码模型的系数之和,你可以看到,对于statsmodels,它等于常数,对于sklearn,它等于0,而常数与statsmodels常数不同。不对完美多重共线性负责的变量的系数不受影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70081611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档