1. 使用Flask构建简单的模型API
任务目标
构建一个Flask应用,加载训练好的机器学习模型(以scikit-learn逻辑回归为例),通过HTTP POST接口接收特征数据并返回预测结果,最后用curl命令验证接口功能。
环境与依赖
需要安装:flask、scikit-learn、numpy。模型文件model.pkl由训练脚本生成,本案例直接提供训练与保存代码,确保可复现。
完整实现
# app.py
import pickle
import numpy as np
from flask import Flask, request, jsonify
app = Flask(__name__)
# 加载模型(首次请求时加载,避免启动阻塞)
model = None
def load_model():
global model
if model is None:
with open('model.pkl', 'rb') as f:
model = pickle.load(f)
@app.route('/predict', methods=['POST'])
def predict():
load_model()
data = request.get_json()
# 输入格式: {"features": [[x1, x2, ...], ...]}
features = np.array(data['features'])
pred = model.predict(features).tolist()
return jsonify({'prediction': pred})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
# train_model.py —— 生成model.pkl
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
import pickle
X, y = load_iris(return_X_y=True)
# 只取前两类做二分类,简化演示
X, y = X[y < 2], y[y < 2]
clf = LogisticRegression(max_iter=200)
clf.fit(X, y)
with open('model.pkl', 'wb') as f:
pickle.dump(clf, f)
print('model.pkl saved')
运行与验证
- 生成模型:
python train_model.py - 启动服务:
python app.py - 另开终端发送请求:
curl -X POST http://127.0.0.1:5000/predict \
-H "Content-Type: application/json" \
-d '{"features": [[5.1, 3.5, 1.4, 0.2], [6.7, 3.1, 4.7, 1.5]]}'
通过条件:返回JSON包含prediction数组,且第一个值为0(setosa类),第二个值为1(versicolor类)。若返回结果与此一致,说明模型加载、接口逻辑与数据解析均正确。
常见问题
- 端口占用:若5000端口被占用,修改
app.run中的port值。 - 输入维度不匹配:确保
features中每个样本的特征数量与训练时一致(本例为4个特征)。 - 模型文件缺失:先运行
train_model.py生成model.pkl,再启动Flask服务。