1. 使用Flask构建简单的模型API

使用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')

运行与验证

  1. 生成模型:python train_model.py
  2. 启动服务:python app.py
  3. 另开终端发送请求:
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服务。