【问题标题】:How to fix Stats Model (model is missing required outcome variables)如何修复统计模型(模型缺少所需的结果变量)
【发布时间】:2020-01-14 12:24:44
【问题描述】:

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

有什么区别?

【问题讨论】:

  • 查看您的代码,上面的 api 似乎是 smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()(取自 statsmodels.org/stable/index.html 文档),因此您似乎需要传入一个公式。
  • 以及如何传递公式?它是什么意思?你能告诉我引擎盖下发生了什么吗? @Chinny84
  • 您可以在命令行/单元格块等中键入此内容sm.ols? 这将向您展示如何使用该功能(我提供的链接也应该清楚)。你以前用过R吗?您必须给出<outcome> ~ independent variables list 的公式作为公式。
  • 是的,我以前学过 R 的基础知识。我将搜索公式,非常感谢您的帮助。 @Chinny84
  • 不用担心。希望对您有所帮助。

标签: python machine-learning linear-regression statsmodels


【解决方案1】:

你应该使用

将 statsmodels.regression.linear_model 导入为 sm;

而不是

将 statsmodels.formula.api 导入为 sm

并使用

regression_ordinary_least_squar = sm.OLS(endog = real_y, exog = x_optimization).fit()

而不是

regression_ordinary_least_squar = sm.ols(real_y,data=x_optimization).fit();

【讨论】:

    【解决方案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 here 上阅读有关该内容的文章。

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      相关资源
      最近更新 更多