构建OLS模型后无法预测,请求排查维度不匹配报错问题
解决OLS模型预测时的维度不匹配问题
你遇到的ValueError: shapes (3,1) and (11,) not aligned错误,核心是预测代码里完全搞反了自变量和因变量,同时特征列和训练时的维度不匹配,咱们一步步拆解问题并修正:
问题分析
- 自变量/因变量混淆:训练时
Y是Total(要预测的目标),X是各类特征;但你在预测代码里把df1['Total']当成了自变量x_new,把特征列当成了y_new,这完全搞反了逻辑。 - 特征列维度不匹配:训练时的
X包含10个特征列(Lisbon/London/Madrid/New York/Tokyo/Bitcoin/Master Card/Visa/No/Yes),加上常数项后对应11个模型参数;但你预测时只选了5个特征列,导致输入特征的维度和模型参数数量不匹配。 - 缺少常数项:训练时用了
sm.add_constant(X)给特征加了常数项,预测时的新数据也需要添加这个常数项,否则模型无法匹配参数。
修正后的预测代码
import numpy as np import pandas as pd import statsmodels.api as sm # 1. 定义新数据(Total可以用nan表示要预测的值,不需要填0) d1 = {'City': ['Tokyo','Tokyo','Lisbon'], 'Card': ['Visa','Visa','Visa'], 'Colateral':['Yes','Yes','No'], 'Client Number':[11,12,13], 'Total':[np.nan, np.nan, np.nan]} df1 = pd.DataFrame(data=d1).set_index('Client Number') # 2. 对新数据做独热编码,确保和训练时的特征列完全一致 df1_dummies = pd.get_dummies(df1, prefix='', prefix_sep='') # 用reindex补全缺失的特征列,填充0(因为新数据里没有这些类别) df1_dummies = df1_dummies.reindex(columns=df.columns, fill_value=0) # 3. 提取自变量X_new,添加常数项(和训练时的操作一致) X_new = df1_dummies[['Lisbon','London','Madrid','New York','Tokyo','Bitcoin','Master Card','Visa','No','Yes']] X_new1 = sm.add_constant(X_new) # 4. 用训练好的reg模型直接预测,不需要重新创建OLS模型 y_pred = reg.predict(X_new1) print(y_pred)
关键说明
- 独热编码对齐:用
reindex保证新数据的特征列和训练集完全一致,比如新数据里没有London/Madrid等类别,这些列会被补0,避免维度缺失。 - 正确使用模型:训练好的
reg已经包含了所有拟合后的参数,直接调用reg.predict()传入处理好的X_new1即可,不需要再初始化新的sm.OLS对象。 - 常数项一致:训练时给特征加了常数项,预测时必须同样添加,否则模型的11个参数和输入的10个特征维度不匹配,就会触发报错。
运行修正后的代码就能得到正确的预测结果啦!
内容的提问来源于stack exchange,提问作者Tiago Emanuel Pratas
相关产品推荐
相关产品推荐

