为了演示Python机器学习的完整流程,包括数据清洗、模型训练、模型文件生成、部署模型文件和算法到推理落地,下面提供一个从头到尾的完整例子。这个例子使用的是一个简单的分类问题(如鸢尾花数据集),并使用scikit-learn进行处理和Flask进行部署。

1. 数据清洗和模型训练

首先,进行数据清洗和模型训练。

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
import joblib

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建数据处理和模型训练流水线
pipeline = make_pipeline(StandardScaler(), RandomForestClassifier(n_estimators=100, random_state=42))

# 训练模型
pipeline.fit(X_train, y_train)

# 评估模型
accuracy = pipeline.score(X_test, y_test)
print(f'Model accuracy: {accuracy:.2f}')

# 保存模型
joblib.dump(pipeline, 'iris_model.pkl')

2. 创建API服务进行模型部署

接下来,创建一个Flask应用,将训练好的模型进行部署。

from flask import Flask, request, jsonify
import joblib
import numpy as np

app = Flask(__name__)

# 加载预训练模型
model = joblib.load('iris_model.pkl')

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json  # 获取请求中的JSON数据
    features = np.array(data['features']).reshape(1, -1)  # 转换为numpy数组
    prediction = model.predict(features)  # 进行预测
    return jsonify({'prediction': int(prediction[0])})  # 返回预测结果

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

3. 创建Dockerfile进行容器化

为了在不同环境中保持一致,使用Docker进行容器化。

# Dockerfile
FROM python:3.8-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "app.py"]

4. requirements.txt 文件

为了确保所有的依赖都可以正确安装,创建一个 requirements.txt 文件。

Flask==2.0.1
scikit-learn==0.24.2
joblib==1.0.1
numpy==1.21.0

5. 构建和运行Docker容器

构建Docker镜像并运行容器。

# 构建Docker镜像
$ docker build -t iris-model-api .

# 运行Docker容器
$ docker run -p 5000:5000 iris-model-api

6. 测试API服务

使用以下Python脚本测试API服务是否正常工作。

import requests

url = 'http://localhost:5000/predict'
data = {'features': [5.1, 3.5, 1.4, 0.2]}  # 示例输入数据

response = requests.post(url, json=data)
print(response.json())  # 输出预测结果

结论

通过上述步骤,我们实现了一个完整的机器学习工程化流程,包括数据清洗、模型训练、模型保存、创建API服务、容器化和测试API服务。这个流程可用于将任何机器学习模型部署到生产环境,并通过API进行预测。