OLS回归python

时间:2018-12-10 09:45:24

标签: python numpy regression statsmodels

我有一个dataframe,正在尝试运行statsmodel.api OLS回归。 它正在打印摘要。但是当我使用predict()函数时,它给我一个错误-

  

形状(75,7)和(6,)不对齐:7(dim 1)!= 6(dim 0)

我的代码是:

X = newdf.loc[:, newdf.columns != 'V-9'].values
y = newdf.iloc[:,3].values
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 
0.2,random_state=0)
import statsmodels.formula.api as sm
model = sm.OLS(y_train,X_train[:,[0,1,2,3,4,6]])
result = model.fit()
print(result.summary())`

执行此操作时出错:

y_pred = result.predict(X_test)

我的X_train的形状是-(297,7)
我的X_test的形状是-(75,7)
dtypenumpy.ndarray

此问题曾被问过。我关注了stackoverflow.com上的一些帖子,并尝试使用reshape函数来解决它。但是,它没有帮助我。谁能解释我为什么收到此错误?怎么解决?

1 个答案:

答案 0 :(得分:1)

以这种方式训练的情况下,model行中的

model = sm.OLS(y_train,X_train[:,[0,1,2,3,4,6]])假定输入数据是6维的,因为X_train的第5列已删除。这也要求测试数据(在这种情况下为X_test)也是6维的。这就是y_pred = result.predict(X_test)无效的原因,因为X_test最初是7维的。正确的解决方法是:

y_pred = result.predict(X_test[:, [0,1,2,3,4,6]]

奖金

我看到您正在使用Pandas库。删除列的一种更好的做法是使用.drop,而不是

newdf.loc[:, newdf.columns != 'V-9'].values

您可以使用

newdf.drop('V-9', axis=1) # axis=1 makes sure cols are dropped, not rows

同样地代替

X_train[:,[0,1,2,3,4,6]]

您可以使用

X_train.drop(X_train.columns[5], axis=1) # this like dropping the 5th column of the dataFrame

这使代码更易读,更容易编写代码,尤其是如果您使用50个尺寸而不是7个尺寸。

我很高兴能有所帮助!