如何使用 statsmodels.formula.api (python) 预测新值

Posted

技术标签:

【中文标题】如何使用 statsmodels.formula.api (python) 预测新值【英文标题】:How to predict new values using 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 我如何使用经过训练的模型来输出该值? (而不是手动读取系数和计算)

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于如何使用 statsmodels.formula.api (python) 预测新值的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:模块“statsmodels.formula.api”没有属性“OLS”

Python:多元线性回归:statsmodels.formula.api.ols()

获取没有匹配指定签名和转换错误的循环

[精选] Mysql分表与分库如何拆分,如何设计,如何使用

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话