用Streamlit+FastAPI打造机器学习应用:从本地调试到Docker部署全流程
在数据科学和机器学习领域,快速构建和部署应用一直是个挑战。传统方法需要前端开发、后端API和部署运维的多方面技能,而Streamlit和FastAPI的组合彻底改变了这一局面。本文将带你从零开始,通过一个汽车评估案例,完整演示如何构建前后端分离的机器学习应用,并最终通过Docker容器化部署。
1. 技术栈选择与项目架构设计
Streamlit和FastAPI的组合为数据科学家提供了全栈开发能力。Streamlit以其极简的Python API著称,能让开发者用几行代码构建交互式Web界面。FastAPI则是高性能的Python Web框架,特别适合构建机器学习API服务。
我们的汽车评估应用将采用前后端分离架构:
- 前端:Streamlit构建用户界面,收集用户输入并展示预测结果
- 后端:FastAPI提供RESTful API,处理模型推理请求
- 部署:Docker容器化,使用Docker Compose编排服务
这种架构的优势在于:
- 前后端开发完全解耦,可独立迭代
- 容器化部署确保环境一致性
- 易于扩展为微服务架构
2. 环境准备与依赖安装
开始编码前,我们需要设置开发环境。推荐使用Python 3.8+和虚拟环境:
# 创建并激活虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# 安装核心依赖
pip install streamlit fastapi uvicorn pandas scikit-learn
对于汽车评估案例,我们将使用UCI的Car Evaluation数据集。可以通过以下代码快速加载:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
# 加载数据集
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data"
columns = ["buying", "maint", "doors", "persons", "lug_boot", "safety", "class"]
data = pd.read_csv(url, names=columns)
# 数据预处理
X = pd.get_dummies(data.drop("class", axis=1))
y = data["class"].astype("category").cat.codes
# 训练简单模型
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = RandomForestClassifier().fit(X_train, y_train)
3. 构建FastAPI后端服务
FastAPI后端负责模型推理,我们将创建一个标准的RESTful API:
# api/main.py
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
import pandas as pd
import joblib
app = FastAPI()
# 定义请求体模型
class CarFeatures(BaseModel):
buying: str
maint: str
doors: str
persons: str
lug_boot: str
safety: str
# 加载预训练模型
model = joblib.load


3245

被折叠的 条评论
为什么被折叠?



