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

Keras模型预测输入形状不匹配问题求助

解决Keras房价预测模型输入维度不匹配问题

问题根源

训练时对Località列用pd.get_dummies()做哑编码,会根据该列的所有类别生成新的数值列,导致特征总数从5维变成7维;但预测时仅对单个用户输入的Località值做哑编码,只会生成对应类别的1列(而非训练时的全部类别列),总特征数仍为5维,与模型训练时接收的7维输入不匹配,从而触发维度错误。

具体解决方案

方案1:基于pd.get_dummies()的特征列对齐

适配你当前的编码方式,核心是保存训练时的特征列结构,预测时强制对齐:

  1. 训练阶段保存特征列名
    做完哑编码后,把所有特征的列名保存下来,确保预测时的特征列与训练时完全一致:
import pandas as pd
import pickle

# 训练数据处理
train_data = pd.read_csv("你的训练数据集.csv")
train_features = pd.get_dummies(train_data.drop('Prezzo', axis=1))
# 保存训练时的特征列名
feature_names = train_features.columns.tolist()
with open('feature_names.pkl', 'wb') as f:
    pickle.dump(feature_names, f)

# 后续训练模型的代码(略)
  1. 预测阶段对齐特征列
    加载保存的列名,对用户输入做哑编码后,补全缺失的特征列并设为0:
import pandas as pd
import pickle

# 加载训练时的特征列名
with open('feature_names.pkl', 'rb') as f:
    feature_names = pickle.load(f)

# 用户输入示例(替换为实际输入逻辑)
user_input = pd.DataFrame([{
    'Località': '用户输入的地区',
    '特征1': 100,
    '特征2': 200,
    '特征3': 300,
    '特征4': 400
}])

# 对用户输入做哑编码
user_input_encoded = pd.get_dummies(user_input)
# 对齐特征列,缺失列补0
user_input_aligned = user_input_encoded.reindex(columns=feature_names, fill_value=0)

# 现在可以输入模型预测
# model.predict(user_input_aligned)

方案2:使用sklearn预处理管道(更规范)

相比pd.get_dummies(),sklearn的OneHotEncoder可以保存编码状态,自动处理未知类别,避免手动对齐的麻烦:

  1. 训练阶段构建并保存预处理管道
import pandas as pd
import pickle
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

train_data = pd.read_csv("你的训练数据集.csv")
train_features = train_data.drop('Prezzo', axis=1)

# 定义分类特征和数值特征
categorical_cols = ['Località']
numeric_cols = [col for col in train_features.columns if col != 'Località']

# 构建预处理管道:分类特征做哑编码,数值特征直接保留
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(sparse_output=False, handle_unknown='ignore'), categorical_cols),
        ('num', 'passthrough', numeric_cols)
    ])

# 拟合管道(学习训练数据的编码规则)
preprocessor.fit(train_features)
# 保存管道
with open('preprocessor.pkl', 'wb') as f:
    pickle.dump(preprocessor, f)

# 用处理后的特征训练模型
train_features_processed = preprocessor.transform(train_features)
# 后续模型训练代码(略)
  1. 预测阶段加载管道处理输入
import pandas as pd
import pickle

# 加载预处理管道
with open('preprocessor.pkl', 'rb') as f:
    preprocessor = pickle.load(f)

# 用户输入示例
user_input = pd.DataFrame([{
    'Località': '用户输入的地区',
    '特征1': 100,
    '特征2': 200,
    '特征3': 300,
    '特征4': 400
}])

# 自动处理输入,保证维度与训练时一致
user_input_processed = preprocessor.transform(user_input)
# 输入模型预测
# model.predict(user_input_processed)

内容的提问来源于stack exchange,提问作者Matteo Aruta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:06:35