如何使用 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”