You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建OLS模型后无法预测,请求排查维度不匹配报错问题

解决OLS模型预测时的维度不匹配问题

你遇到的ValueError: shapes (3,1) and (11,) not aligned错误,核心是预测代码里完全搞反了自变量和因变量,同时特征列和训练时的维度不匹配,咱们一步步拆解问题并修正:

问题分析

  1. 自变量/因变量混淆:训练时Y是Total(要预测的目标),X是各类特征;但你在预测代码里把df1['Total']当成了自变量x_new,把特征列当成了y_new,这完全搞反了逻辑。
  2. 特征列维度不匹配:训练时的X包含10个特征列(Lisbon/London/Madrid/New York/Tokyo/Bitcoin/Master Card/Visa/No/Yes),加上常数项后对应11个模型参数;但你预测时只选了5个特征列,导致输入特征的维度和模型参数数量不匹配。
  3. 缺少常数项:训练时用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:22:31