目录
一、 背景简述¶
二、 环境准备
三、 数据预处理
四、 模型的选择&训练&调优
五、 模型部署
本文简单介绍一个工业领域的机器学习建模到生产环境部署的案例。涉及机器学习开发项目的以下几个步骤
用到的主要工具库和框架
PyCaret:开源的低代码机器学习库,可用于自动化机器学习工作流
FastAPI:快速高性能的Web框架
plotly:数据可视化工具库
numpy:高效的数据计算工具库
pandas:DataFrame的高效处理工具库
uvicorn:高效的ASGI服务器
# 如未安装,可以通过以下命令行进行安装
pip install pycaret
pip install fastapi
pip install plotly
pip install uvicorn
如果 pycaret 下载缓慢,或者无法安装,可以尝试以下命令行
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pycaret
考虑到pycaret依赖的工具库可能和已经安装的工具库有版本的冲突,可以单独创建一个虚拟环境,安装所需的工具库pycaret等,再将虚拟环境作为核添加 至jupyter。可以通过以下步骤实现虚拟环境的创建和添加。
conda create --name yourenvname # 创建名为yourenvname的虚拟环境
conda activate yourenvname # 激活yourenvname虚拟环境
conda install python=3.6.2 # 安装python
pip install pycaret # 安装需要的工具包
pip install ipykernel ipython # 安装kernel
ipython kernel install --user --name yourenvname # 添加虚拟环境
jupyter kernelspec remove yourenvname # 删除虚拟环境(根据后续的需要执行)
安装并添加虚拟环境之后,重启jupyter,即可在【新建】菜单栏中看到新添加的虚拟环境。
# 导入所需的工具库
from pycaret.datasets import get_data
from pycaret.regression import *
import plotly.express as px
import numpy as np
index = get_data('index')
# 加载数据
# 如果导入数据出现 URLError, 可以首先执行以下, 再返回读取数据
# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
data = get_data('diamond')
# 绘制散点图,观察特征变量与目标变量之间的关系
fig = px.scatter(x = data['Carat Weight'], y = data['Price'], facet_col = data['Cut'], opacity = 0.25,
template = 'plotly_dark', trendline = 'ols', trendline_color_override = 'red',
title = 'Diamon Price against Weight and Cut')
fig.show()
# 查看目标变量price的分布
fig = px.histogram(data, x = ['Price'], template = 'plotly_dark', title = 'Histogram of Price')
fig.show()
# 目标变量的分布右偏,可以考虑通过取对数使分布趋近正态分布
Temp = data.copy()
Temp['log_price'] = np.log(data['Price'])
fig = px.histogram(Temp, x = ['log_price'], template = 'plotly_dark', title = 'Histogram of Log Price')
fig.show()
# 初始化
s = setup(data, target = 'Price', transform_target = True)
# 对所有回归模型进行实验和评估
best = compare_models()
# 查看模型的预估结果残差
plot_model(best, plot = 'residuals_interactive')
# 查看特征的重要度
plot_model(best, plot = 'feature')
保存最佳模型结果
final_best = finalize_model(best)
save_model(final_best, 'diamond-pipline')
导入工具库
import pandas as pd
from pycaret.regression import load_model, predict_model
from fastapi import FastAPI
import uvicorn
部署模型
# 构建app对象
app = FastAPI()
# 加载模型
model = load_model('diamond-pipline')
# 定义预估函数
@app.post('/predict')
def predict(carat_weight, cut, color, clarity, polish, symmetry, report):
data = pd.DataFrame([[carat_weight, cut, color, clarity, polish, symmetry, report]])
data.columns = ['Carat Weight', 'Cut', 'Color', 'Clarity', 'Polish', 'Symmetry', 'Report']
predictions = predict_model(model, data = data)
return {'prediction':int(predictions['Label'][0])}
if __name__=='__main__':
uvicorn.run(app = 'main:app', host = '127.0.0.1', port = 8080, reload = True)
调用API访问
import requests
def get_predictions(carat_weight, cut, color, clarity, polish, symmetry, report):
url = 'http//localhost:8000/predict?carat_weight={carat_weight}&cut={cut}&color={color}&clarity={clarity}&polish={polish}&symmetry={symmetry}&report={report}'\
.format(carat_weight = carat_weight, cut = cut, color = color, clarity = clarity, polish = polish, symmetry = symmetry, report = report)
x = requests.post(url)
print(x.text)
get_predictions(1.1, 'Ideal', 'H', 'SI1', 'VG', 'EX', 'GIA')