【问题标题】:How to predict new values using statsmodels.formula.api (python)如何使用 statsmodels.formula.api (python) 预测新值
【发布时间】:2016-12-21 18:46:56
【问题描述】:

我使用以下来自乳腺癌数据的逻辑模型训练了逻辑模型,并且仅使用了一个特征“mean_area”

from statsmodels.formula.api import logit
logistic_model = logit('target ~ mean_area',breast)
result = logistic_model.fit()

训练模型中有一个内置的预测方法。然而,这给出了所有训练样本的预测值。如下

predictions = result.predict()

假设我想要一个新值的预测,比如 30 我如何使用经过训练的模型来输出该值? (而不是手动读取系数和计算)

【问题讨论】:

    标签: python machine-learning scikit-learn logistic-regression statsmodels


    【解决方案1】:

    您可以为.predict() 模型提供新值,如来自文档的notebook 中的输出#11 所示,用于单个观察。您可以提供多个观察结果为2d array,例如DataFrame - see docs

    由于您使用的是公式 API,因此您的输入需要采用 pd.DataFrame 的形式,以便列引用可用。在您的情况下,您可以使用 .predict(pd.DataFrame({'mean_area': [1,2,3]}) 之类的东西。

    statsmodels .predict() 仅在没有提供替代方案时将用于拟合的观测值用作默认值。

    【讨论】:

    • 感谢您的回答。我看了一下笔记本,但是在我尝试给出 .predict(30) 的情况下,它会引发错误“'int' object has no attribute 'getitem''。
    • 您收到此错误是因为exog 参数必须为array-like,因此您必须使用[30]。数组具有getitem 方法,因为它们可以包含多个项目,而不是int
    • 感谢当我尝试 .predict([30]) 我收到以下错误。 "TypeError: 列表索引必须是整数,而不是 str"
    • 对不起,因为公式 api 输入为DataFrame,请参阅更新的答案。
    • 请注意,您可以简单地将字典传递到任何接受数据帧的 statsmodel 的 API - 无需不必要地创建数据帧。以下示例笔记本在最后一步中显示了这一点:statsmodels.org/dev/examples/notebooks/generated/predict.html
    【解决方案2】:
    import statsmodels.formula.api as smf
    
    
    model = smf.ols('y ~ x', data=df).fit()
    
    # Predict for a list of observations, list length can be 1 to many..**
    prediction = model.get_prediction(exog=dict(x=[5,10,25])) 
    prediction.summary_frame(alpha=0.05)
    

    【讨论】:

      【解决方案3】:

      我在使用新的 pandas 数据框预测值时遇到了困难。 所以我在拟合后将要预测的数据添加到原始数据集

         y = data['price']
         x1 = data[['size', 'year']]
         data.columns
         #Index(['price', 'size', 'year'], dtype='object')
         x=sm.add_constant(x1)
         results = sm.OLS(y,x).fit()
         results.summary()
         ## predict on unknown data
         data = data.append(pd.DataFrame({'size': [853.0,777], 'year': [2012.0,2013], 'price':[None, None]}))
         data.tail()
         new_x = data.loc[data.price.isnull(), ['size', 'year']]
         results.predict(sm.add_constant(new_x))
      

      【讨论】:

        【解决方案4】:

        这已经回答了,但我希望这会有所帮助。

        根据文档,第一个参数是“exog”。

        exog:array_like,可选 您要预测的值

        进一步说,

        "如果使用了一个公式,那么 exog 的处理方式与 原始数据。此转换需要对 相同的变量名,可以是 pandas DataFrame 或 dict 之类的 包含 numpy 数组的对象。

        如果没有使用公式,则提供的 exog 需要具有相同的 作为模型中原始 exog 的列数。没有转型 除了将其转换为 numpy 数组之外,执行的数据。

        支持 pandas 数据帧中的行索引,并将其添加到 返回预测”

        from statsmodels.formula.api import logit
        
        logistic_model = logit('target ~ mean_area',breast)
        result = logistic_model.fit()
        

        因此,您可以为 exog 参数提供 pandas 数据框(例如:df),并且数据框应包含 mean_area 作为列。因为 'mean_area' 是预测变量或自变量。

        predictions = logistic_model.predict(exog=df)
        

        【讨论】:

          猜你喜欢
          • 2021-12-16
          • 2018-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-06
          • 2020-02-01
          • 1970-01-01
          相关资源
          最近更新 更多