statsmodels中相同形状样本出现shapes not aligned错误如何解决
错误触发原因
- 调用对象错误:你错误使用未拟合的
sm.OLS实例model调用predict方法,而非拟合后得到的results实例。model.predict的第一个入参要求传入拟合参数,你传入的测试集x_test被识别为参数输入,最终触发两个二维矩阵点乘的维度不匹配错误。 - 预处理逻辑不一致:训练集
X_train调用了sm.add_constant添加常数项,特征维度为5列,测试集x_test未做相同处理,特征维度仅为4列,即使调用对象正确也会报错。你代码中的形状对比语句实际输出为False,大概率是你未注意到输出结果。
解决方案
修改两处代码即可解决问题:
- 测试集和训练集保持相同预处理逻辑,添加常数项
- 使用拟合完成的
results实例调用predict方法
修正后的代码如下:
train_df = df.loc[:50] X_train = train_df[["Value", "Momentum", "Quality", "MinimumVolatility"]] y_train = train_df["P1ExRe"] X_train = sm.add_constant(X_train) model = sm.OLS(y_train, X_train) results = model.fit() test_df = df.loc[51:100] x_test = test_df[["Value", "Momentum", "Quality", "MinimumVolatility"]] y_test = test_df["P1ExRe"] # 测试集添加常数项,和训练集预处理逻辑对齐 x_test = sm.add_constant(x_test) print(x_test.shape == X_train.shape) # 使用拟合后的结果实例调用predict方法 predict_res = results.predict(x_test)
内容的提问来源于stack exchange,提问作者Dmitry Sazhnev
相关产品推荐
相关产品推荐

