Flask应用接收Postman发送JSON请求时出现reshape报错如何解决
报错触发逻辑
出现这个reshape报错的核心原因有两个,直接导致输入数据维度和模型预期不匹配:
- Postman传入的单条JSON是字典结构,直接传入
column_trans.fit_transform()时,sklearn会将字典的每个键值对解析为一个独立的单特征样本,最终输出形状为(特征数, 1)的数组,等价于传入了N个只有1个特征的样本,和模型要求的(样本数, 特征数)二维输入格式完全不符。 - 你在接口中调用
fit_transform()是错误用法:预处理器的拟合逻辑必须和训练阶段完全一致,线上每次请求重新fit会覆盖编码规则,不仅会触发维度问题,还会直接导致预测结果完全错误。
修复步骤
- 修正输入格式:单条JSON字典需要先转为pandas DataFrame,指定
index=[0]保证生成的是1行N列的二维结构,符合sklearn的输入要求。 - 修正预处理器调用逻辑:预处理器必须在模型训练阶段完成拟合,和模型一起持久化保存,Flask应用加载后预测时只能调用
transform(),禁止在线上执行fit操作。 - 调整训练阶段的保存逻辑,确保线上加载的预处理器和训练时的拟合状态完全一致。
修正后的代码参考
训练阶段(必须执行后保存文件)
训练时完成预处理器拟合,和模型一起保存,不要在Flask应用中重新初始化未拟合的预处理器:
import joblib import pandas as pd from sklearn.preprocessing import OneHotEncoder from sklearn.compose import make_column_transformer # 以下为训练流程示例,替换为你自己的训练数据读取逻辑即可 # df = pd.read_csv("your_train_data.csv") # X = df.drop("college_admission", axis=1) # 替换为你的标签列名 # y = df["college_admission"] # 初始化预处理器 column_trans = make_column_transformer( (OneHotEncoder(), ['type_school','school_accreditation', 'gender','interest','residence','parent_was_in_college']), remainder='passthrough') # 训练阶段拟合预处理器并处理特征 X_processed = column_trans.fit_transform(X) # 训练模型 college_model.fit(X_processed, y) # 分别保存预处理器和模型,供Flask应用加载 joblib.dump(column_trans, "column_trans.pkl") joblib.dump(college_model, "college_model.pkl")
Flask接口修正
import pandas as pd from flask import Flask, request, jsonify import joblib app = Flask(__name__) @app.route("/") def index(): return '<h1>Flask Running</h>' # 加载训练好的模型和预处理器,不要在代码里重新初始化column_trans college_model = joblib.load("college_model.pkl") column_trans = joblib.load("column_trans.pkl") @app.route('/college', methods=['POST']) def prediction(): content = request.json # 单条样本转为DataFrame,保证是(1, 特征数)的二维结构 input_df = pd.DataFrame(content, index=[0]) # 直接调用transform,禁止使用fit_transform encode = column_trans.transform(input_df) pred = college_model.predict(encode) return jsonify(pred.tolist()) if __name__=='__main__': app.run()
- 注意:如果需要支持批量预测,只需要接收JSON数组格式的请求,转DataFrame时不需要指定index即可,单条预测逻辑不需要改动。
内容的提问来源于stack exchange,提问作者Tyrone_Slothrop
相关产品推荐
相关产品推荐

