如何在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序列化
三、错误排查步骤
- 查看训练时的特征信息:在训练模型的代码中加入
print(model.feature_names_in_)(适用于sklearn模型),确认特征列表 - 检查Flask输入数据:在
predict函数中加入print(input_df.columns)或print(input_array.shape),对比和训练时的特征差异 - 本地离线测试:直接加载
model.pkl,传入和Flask中相同的输入数据,验证是否报错,排除Flask的影响
内容的提问来源于stack exchange,提问作者Foxtrot
相关产品推荐
相关产品推荐

