使用statsmodels的OLS模型预测数值

15

我使用OLS(多元线性回归)计算了一个模型。我将数据分为训练集和测试集(各一半),然后我想预测标签的后一半的值。

model = OLS(labels[:half], data[:half])
predictions = model.predict(data[half:])

问题在于我收到了一个错误信息: File "/usr/local/lib/python2.7/dist-packages/statsmodels-0.5.0-py2.7-linux-i686.egg/statsmodels/regression/linear_model.py", line 281, in predict return np.dot(exog, params) ValueError: matrices are not aligned
以下是我的数组形状: data.shape: (426, 215) labels.shape: (426,)
如果我将输入转置到model.predict中,我确实得到了一个结果,但形状为(426,213),所以我认为这也是错误的(我希望得到一个由213个数字组成的标签预测向量)。
model.predict(data[half:].T)

有什么办法让它工作起来吗?
2个回答

21

对于statsmodels >= 0.4,如果我没记错的话

model.predict 不知道参数,并需要在调用中提供它们。 请参见http://statsmodels.sourceforge.net/stable/generated/statsmodels.regression.linear_model.OLS.predict.html

在您的情况下应该起作用的是拟合模型,然后使用结果实例的 predict 方法。

model = OLS(labels[:half], data[:half])
results = model.fit()
predictions = results.predict(data[half:])

更短

results = OLS(labels[:half], data[:half]).fit()
predictions = results.predict(data[half:])

http://statsmodels.sourceforge.net/stable/generated/statsmodels.regression.linear_model.RegressionResults.predict.html 目前缺少文档说明。

注意:在开发版本中已更改(向后兼容),可以利用“公式”信息进行预测。 http://statsmodels.sourceforge.net/devel/generated/statsmodels.regression.linear_model.RegressionResults.predict.html


8
尽管这是正确的答案,关于模型拟合和数据分割有一个严重的警告。您应该使用80%的数据(或更大部分)进行训练/拟合,将20%(其余部分)用于测试/预测。将数据划分为50:50就像薛定谔的猫一样。我们无法确定我们的数据全部正确还是全部错误。因此,对模型的置信度位于中间位置。我们希望对我们的模型有更好的置信度,因此我们应该在更多的数据上训练,然后再进行测试。 - lukassos
70/30或80/20的分配比例是小数据集(多达数十万个示例)的经验法则,但不应视为所有情况下的唯一标准。在深度学习中,您通常需要使用数十亿个示例进行训练,因此您需要在99%的数据上进行训练,并在1%的数据上进行测试,这仍然可以是数千万条记录。但50/50的分配比例通常不是一个好主意。 - Max Power
只要你的结果在统计学上是显著的,它们就是可以接受的。例如,在数据高度不平衡的情况下,上述任何一种方法都不能得出统计学上显著的比较,因为数据高度偏倚,即使是简单的平均值也会导致频繁正确的答案! - Ash

6
你也可以调用 Results 对象的 get_prediction 方法,以获取预测值及其误差估计和置信区间。 示例:
import numpy as np
import statsmodels.api as sm

X = np.array([0, 1, 2, 3])
y = np.array([1, 2, 3.5, 4])
X = sm.add_constant(X)
model = sm.OLS(y, X)
results = model.fit()

预测:

# Predict at x=2.5
X_test = np.array([1, 2.5])  # "1" refers to the intercept term
results.get_prediction(X_test).summary_frame(alpha=0.05)  # alpha = significance level for confidence interval

提供:

    mean    mean_se mean_ci_lower   mean_ci_upper   obs_ci_lower    obs_ci_upper
0   3.675   0.198431    2.821219    4.528781    2.142416    5.207584

mean_ci置信区间,而obs_ci则指预测区间


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接