我刚刚开始在python中学习机器学习,我正在学习多元线性回归。在那里我了解了虚拟变量陷阱,它可以通过反向消除来解决,但在应用反向消除时,我得到了这个错误。(PatsyError:模型缺少必需的结果变量)
这些是我导入的文件
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import LabelEncoder , OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import statsmodels.formula.api as sm
下面是我的数据集的前5行:
gender age exercise hours grade
0 female 17 3 10 82.4
1 male 18 4 4 78.2
2 male 18 5 9 79.3
3 female 14 2 7 83.2
4 female 18 4 15 87.4
real_x = data_frame.iloc[:,:4].values
real_y = data_frame.iloc[:,4:].values
label_encoder_obj = LabelEncoder()
real_x[:,0] = label_encoder_obj.fit_transform(real_x[:,0])
one_hot_encoder = OneHotEncoder(categorical_features=[2])
real_x = one_hot_encoder.fit_transform(real_x).toarray()
real_x = real_x[:,1:]
training_x,test_x,training_y,test_y=
train_test_split(real_x,real_y,test_size=0.2,random_state=0)
multiple_linear_regression = LinearRegression()
multiple_linear_regression.fit(training_x,training_y)
predection_y = multiple_linear_regression.predict(test_x)
real_x=np.append(arr=np.ones((real_x.shape[0],1)).astype(int),
values=real_x,axis=1)
x_optimization = real_x[:,[0,1,2,3,4,5]]
在下面的代码行中,我得到了错误。
regresion_ordinary_least_squar = sm.ols(real_y,data=x_optimization).fit();
如果缺少== 'raise‘,则不存在missing_mask
PatsyError: model is missing required outcome variables
我在网上看到过一些例子,其中的一些代码
sm.OLS()
被使用,而不是
sm.ols()
有什么关系?
发布于 2020-12-02 08:52:15
前面的简短回答是:你混淆了statsmodel的ols实现的两个不同版本,并且给出了你选择了错误输入的模型。
长答案: Statsmodel包括普通最小二乘模型的两个版本。
我所看到的可接受的导入设置是:
import statsmodels.api as sm
import statsmodels.formula.api as smf
然后这是一个选择:
sm.OLS()
smf.ols()
它们的行为也不同。
sm.OLS采用单独的x和y数据帧(或exog和endog)。sm.OLS也不会向模型中添加常量。您需要先添加它。还要注意的是,statsmodel版本从sklearn模型输入数据的方式向后切换了输入变量的顺序-Y,然后是X。
X = sm.add_constant(X)
model = sm.OLS(Y,X)
results = model.fit()
result.summary()
这也是可行的:
X = sm.add_constant(X)
model = sm.OLS(Y,X).fit()
model.summary()
.summary()
表示模型的分数、系数和p值的输出。
smf.ols采用补丁短语和数据帧,其中包括响应或目标变量以及所有功能。patsy短语允许您告诉模型在为response变量创建其ols模型时使用哪些列。拼凑的短语是一个看起来像'y ~ X1 + X2 + X3'
的字符串。此外,smf.ols版本在默认情况下添加了截取。
df = pd.DataFrame({'X1':x, 'X2':x2, 'X3':x3, 'y':Y})
model = smf.ols('y ~ X1 + X2 + X3', df).fit()
或者,
phrase = 'y ~ X1 + X2 + X3 + X4'
model = smf.ols(phase,df).fit()
然后执行以下操作:
model.summary2()
检索分数、系数和p值的格式良好的摘要,与sm.OLS
摘要非常相似,但略有不同。
如果您为您选择的statsmodel版本正确地构建了输入,那么这个错误应该会消失。
就我个人而言,我更喜欢公式模型。但是当你把你的数据帧分成X_train、y_train、X_test、y_test时,这就变得很尴尬了。
当我这样做的时候,我设置我的模型如下:
frames =[y_train, X_train]
df_train = pd.concat(frames, axis=1).reindex(y_train.index)
model = smf.ols(formula, df_train).fit()
我注意到你也在使用sklearn的LinearRegression。默认情况下,它还包括截取。如果您将常量添加到sm.OLS模型中,这三种方法都应该在相同的数据上给出类似的答案。在kaggle here上阅读一篇关于这方面的文章。
发布于 2019-12-23 01:43:19
你应该使用
将statsmodels.regression.linear_model导入为sm;
而不是
将statsmodels.formula.api导入为sm
并使用
regresion_ordinary_least_squar = sm.OLS(endog = real_y,exog = x_optimization).fit()
而不是
regresion_ordinary_least_squar = sm.ols(real_y,data=x_optimization).fit();
https://stackoverflow.com/questions/57909858
复制相似问题