Keras模型预测输入形状不匹配问题求助
解决Keras房价预测模型输入维度不匹配问题
问题根源
训练时对Località列用pd.get_dummies()做哑编码,会根据该列的所有类别生成新的数值列,导致特征总数从5维变成7维;但预测时仅对单个用户输入的Località值做哑编码,只会生成对应类别的1列(而非训练时的全部类别列),总特征数仍为5维,与模型训练时接收的7维输入不匹配,从而触发维度错误。
具体解决方案
方案1:基于pd.get_dummies()的特征列对齐
适配你当前的编码方式,核心是保存训练时的特征列结构,预测时强制对齐:
- 训练阶段保存特征列名
做完哑编码后,把所有特征的列名保存下来,确保预测时的特征列与训练时完全一致:
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) # 后续训练模型的代码(略)
- 预测阶段对齐特征列
加载保存的列名,对用户输入做哑编码后,补全缺失的特征列并设为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可以保存编码状态,自动处理未知类别,避免手动对齐的麻烦:
- 训练阶段构建并保存预处理管道
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) # 后续模型训练代码(略)
- 预测阶段加载管道处理输入
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
相关产品推荐
相关产品推荐

