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

Flask应用接收Postman发送JSON请求时出现reshape报错如何解决

报错触发逻辑

出现这个reshape报错的核心原因有两个,直接导致输入数据维度和模型预期不匹配:

  • Postman传入的单条JSON是字典结构,直接传入column_trans.fit_transform()时,sklearn会将字典的每个键值对解析为一个独立的单特征样本,最终输出形状为(特征数, 1)的数组,等价于传入了N个只有1个特征的样本,和模型要求的(样本数, 特征数)二维输入格式完全不符。
  • 你在接口中调用fit_transform()是错误用法:预处理器的拟合逻辑必须和训练阶段完全一致,线上每次请求重新fit会覆盖编码规则,不仅会触发维度问题,还会直接导致预测结果完全错误。
修复步骤
  1. 修正输入格式:单条JSON字典需要先转为pandas DataFrame,指定index=[0]保证生成的是1行N列的二维结构,符合sklearn的输入要求。
  2. 修正预处理器调用逻辑:预处理器必须在模型训练阶段完成拟合,和模型一起持久化保存,Flask应用加载后预测时只能调用transform(),禁止在线上执行fit操作。
  3. 调整训练阶段的保存逻辑,确保线上加载的预处理器和训练时的拟合状态完全一致。
修正后的代码参考

训练阶段(必须执行后保存文件)

训练时完成预处理器拟合,和模型一起保存,不要在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:06:21