钻石价格预测的建模与部署

目录

一、 背景简述¶

二、 环境准备

三、 数据预处理

四、 模型的选择&训练&调优

五、 模型部署


一、 背景简述¶

本文简单介绍一个工业领域的机器学习建模到生产环境部署的案例。涉及机器学习开发项目的以下几个步骤

  1. 问题定义
  2. 数据采集
  3. EDA(探索性数据分析)
  4. 数据准备
  5. 建模
  6. 部署和监控

二、 环境准备

用到的主要工具库和框架

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

你可能感兴趣的:(机器学习实战,模型部署,PyCaret,python,机器学习,模型部署)