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

如何在Flask应用输出pickle模型预测数组?排查特征名报错

在Flask中输出Pickle模型的预测数组及错误排查

一、“feature names unseen at fit time”错误原因

这个错误和model.pkl、Flask框架本身无关,核心问题是预测时传入的特征与模型训练时的特征不匹配,常见场景包括:

  • 预测用的特征列名和训练时的列名不一致(比如训练时是['age', 'gender'],预测时写成了['Age', 'sex'])
  • 预测时传入的特征数量和训练时不同(少传/多传了特征)
  • 特征顺序和训练时不一致(部分模型对特征顺序敏感)

二、Flask中输出预测数组的实现示例

1. 基础代码结构

from flask import Flask, request, jsonify
import pickle
import pandas as pd

app = Flask(__name__)

# 加载模型
with open('model.pkl', 'rb') as f:
    model = pickle.load(f)

@app.route('/predict', methods=['POST'])
def predict():
    # 获取请求中的特征数据(JSON格式,键为特征列名)
    data = request.get_json()
    # 转换成模型训练时用的DataFrame格式(保证列名一致)
    input_df = pd.DataFrame([data])
    # 执行预测
    prediction = model.predict(input_df)
    # 将numpy数组转为可序列化的列表,返回JSON
    return jsonify({'prediction': prediction.tolist()})

if __name__ == '__main__':
    app.run(debug=True)

2. 关键注意事项

  • 必须保证传入的特征列名和训练模型时完全一致,包括大小写、拼写
  • 如果训练时用的是numpy数组而非DataFrame,预测时也要传入相同维度的numpy数组,示例:
    import numpy as np
    # 假设训练时传入的是形状为(n_samples, 3)的数组
    input_array = np.array([[data['f1'], data['f2'], data['f3']]])
    prediction = model.predict(input_array)
    
  • 返回时要把numpy数组转为列表(tolist()),因为numpy数组无法直接被JSON序列化

三、错误排查步骤

  1. 查看训练时的特征信息:在训练模型的代码中加入print(model.feature_names_in_)(适用于sklearn模型),确认特征列表
  2. 检查Flask输入数据:在predict函数中加入print(input_df.columns)或print(input_array.shape),对比和训练时的特征差异
  3. 本地离线测试:直接加载model.pkl,传入和Flask中相同的输入数据,验证是否报错,排除Flask的影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:53:20