0

我刚开始使用 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();

# if missing == 'raise' 没有missing_mask

PatsyError: model is missing required outcome variables

我看过一些在线示例,其中一些代码

sm.OLS() 

被用来代替

sm.ols()

有什么区别?

4

2 回答 2

2

前面的简短回答:您正在混合 statsmodels 的 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 版本切换输入变量的顺序 - Y 然后 X。从 sklearn 模型输入数据的方式向后。

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 短语和一个包含响应或目标变量和所有特征的数据框。patsy 短语允许您告诉模型在创建响应变量的 ols 模型时使用哪些列。patsy 短语是一个字符串,看起来像'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 的文章。

于 2020-12-02T08:52:15.067 回答
1

你应该使用

将 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();

于 2019-12-23T01:43:19.203 回答