如何获得 statsModels 中测试数据的调整后 R 平方?

Add*_*dem 4 python statsmodels

我有一个像这样的数据集

import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm
data = pd.DataFrame({'a':[4,3,4,6,6,3,2], 'b':[12,14,11,15,14,15,10]}
test = data.iloc[:4]
train = data.iloc[4:]
Run Code Online (Sandbox Code Playgroud)

我为列车数据建立了线性模型

model = smf.ols("a ~ b", data = data)
print(model.fit().summary())
Run Code Online (Sandbox Code Playgroud)

现在我想做的是根据测试数据得到调整后的R^2值。有一个简单的命令吗?我一直在尝试从头开始构建它并不断收到错误。

我一直在尝试:

model.predict(test.b)
Run Code Online (Sandbox Code Playgroud)

但它抱怨形状。基于此:https://www.statsmodels.org/stable/examples/notebooks/ generated/predict.html

我尝试了以下方法

X = sm.add_constant(test.b)
model.predict(X)
Run Code Online (Sandbox Code Playgroud)

现在错误是

ValueError: shapes (200,2) and (200,2) not aligned: 2 (dim 1) != 200 (dim 0)
Run Code Online (Sandbox Code Playgroud)

形状匹配,但是我不明白“暗淡”的意思。但我认为我与链接中的示例匹配得很好,所以我不确定发生了什么。

Ale*_*exK 5

您应该首先运行该.fit()方法并保存返回的对象,然后.predict()对该对象运行该方法。

results = model.fit()
Run Code Online (Sandbox Code Playgroud)

运行results.params将产生这个 pandas 系列:

Intercept   -0.875
b            0.375
dtype: float64
Run Code Online (Sandbox Code Playgroud)

然后,运行results.predict(test.b)将产生这个系列:

0    3.625
1    4.375
2    3.250
3    4.750
dtype: float64
Run Code Online (Sandbox Code Playgroud)

您还可以通过调用结果类的各个属性来检索模型拟合摘要值(https://www.statsmodels.org/stable/ generated/ statsmodels.regression.linear_model.OLSResults.html):

>>> results.rsquared_adj
0.08928571428571419
Run Code Online (Sandbox Code Playgroud)

但这些将用于完整/训练模型,所以是的,您可能需要根据测试预测和真实值手动计算 SSR/SST/SSE 值,并从中获取调整后的 R 平方。