• 钻石价格预测的ML全流程!从模型构建调优道部署应用!⛵


    💡 作者:韩信子@ShowMeAI
    📘 数据分析 ◉ 技能提升系列http://www.showmeai.tech/tutorials/33
    📘 AI 面试题库系列http://www.showmeai.tech/tutorials/48
    📘 本文地址http://www.showmeai.tech/article-detail/302
    📢 声明:版权所有,转载请联系平台与作者并注明出处
    📢 收藏ShowMeAI查看更多精彩内容

    我们经常会谈到工业界端到端的机器学习建模,所谓端到端,是指的把整个过程构建在一个完整的流程(比如pipeline管道)中,包括数据侧的处理、模型建模调优,及模型部署应用等环节,如我们之前所说,完整的机器学习开发流程如下:

    在本篇内容中,ShowMeAI将给大家讲解到下述内容:

    • 使用 PyCaret 构建端到端机器学习管道
    • ML 模型部署 & FastAPI 开发实时预测

    💡 工具库

    📌 PyCaret

    PyCaret 是一个开源的低代码机器学习库,内置Python端到端模型管理工具,被用于自动化机器学习工作流。因其易用性、简单性以及快速高效地构建和部署端到端 ML 原型的能力而广受欢迎。

    更多有关 PyCaret 的信息,可以在官方 📘 GitHub 查看。

    我们先通过 pip 安装 pycaret 工具库:

    pip install pycaret
    
    • 1

    📌 FastAPI

    FastAPI 是一个快速(高性能)的Web框架,主要特点是:

    • 快速 :非常高的性能,是目前可用的最快的 Python 框架之一 。
    • 快速编码 :将开发速度提高2到3倍。
    • 简单 :易于学习和使用。

    更多有关 FastAPI 的信息,请查看官方 📘 GitHub

    我们也通过 pip 安装 fastapi:

    pip install fastapi
    
    • 1

    💡 业务背景

    本篇内容中涉及的案例来自达顿商学院(案例研究发表在 📘 哈佛商学院),案例中收集了 6000 颗钻石的数据,包括它们的价格和切工、颜色、形状等属性。

    🏆 实战数据集下载(百度网盘):公众号『ShowMeAI研究中心』回复『实战』,或者点击 这里 获取本文 [13] 钻石价格预测的ML全流程!从模型构建调优道部署应用! 『** pycaret-master 数据集**』

    ShowMeAI官方GitHubhttps://github.com/ShowMeAI-Hub

    💡 数据

    我们在本篇内容中,使用钻石的克拉重量、切工、颜色和其他特征等属性来预测钻石的价格。 数据集可从 📘 此处下载。

    # 加载数据
    from pycaret.datasets import get_data
    data = get_data('diamond')
    
    • 1
    • 2
    • 3

    💡 探索性数据分析

    我们先做一些快速数据分析和可视化来评估数据字段属性(重量、切工、颜色、净度等)与目标变量/标签Price的关系。

    # 绘制carat_weight和Price的散点图
    import plotly.express as px
    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 = 'SARAH GETS A DIAMOND - A CASE STUDY')
    fig.show()
    
    • 1
    • 2
    • 3
    • 4

    我们绘制并了解一下目标变量Price的分布。

    # 绘制灰度图查看分布
    fig = px.histogram(data, x=["Price"], template = 'plotly_dark', title = 'Histogram of Price')
    fig.show()
    
    • 1
    • 2
    • 3

    可以从上图看出Price是明显右偏分布的,对于有偏的分布,我们可以做一些数据变换以调整数据分布,比如对数变换,下面我们先用对数变换对Price进行处理。

    import numpy as np
    
    # 构建一份数据备份
    data_copy = data.copy()
    
    # log对数变换
    data_copy['Log_Price'] = np.log(data['Price'])
    
    # 绘制灰度图查看分布
    fig = px.histogram(data_copy, x=["Log_Price"], title = 'Histgram of Log Price', template = 'plotly_dark')
    
    fig.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    大家可以明显看到,经过log变换后的数据分布,更加接近正态分布。

    💡 数据准备

    我们先导入PyCaret工具库,并做基本的设置。

    # 初始化
    from pycaret.regression import *
    s = setup(data, target = 'Price', transform_target = True)
    
    • 1
    • 2
    • 3

    注意上面的 transform_target = True,PyCaret会对Price字段使用 box-cox 变换,这个变换与对数转换是类似的,也能对有偏分布进行校正。

    💡 模型选择&训练&调优

    数据准备完毕后,我们使用模型对其进行训练,pycaret中最简单的方式是使用 compare_models函数,它使用交叉验证来训练和评估模型库中可用的模型,它的返回值是具有平均交叉验证分数的评分网格。 这个过程只需要下列简单代码:

    # 对所有可用模型进行实验和评估
    best = compare_models()
    
    • 1
    • 2

    上图是最终的实验结果,我们可以看到,对所有模型使用平均绝对误差 (MAE) 评估,CatBoost Regressor模型有最好的效果。

    # 训练模型的预估结果残差
    plot_model(best, plot = 'residuals_interactive')
    
    • 1
    • 2
    # 输出特征重要度
    plot_model(best, plot = 'feature')
    
    • 1
    • 2

    💡 模型保存

    我们把最优模型保存为 pickle 文件。

    # 最佳模型
    final_best = finalize_model(best)
    
    # 存储模型
    save_model(final_best, 'diamond-pipeline')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    💡 模型部署

    下面我们演示使用FastAPI框架快速构建模型服务,并提供实时预估的能力。

    # 导入工具库
    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-pipeline')
    
    # 定义预估函数
    @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, host='127.0.0.1', port=8000)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    接下来可以通过终端命令行运行以下命令来运行这个服务,大家确保运行命令的路径和上述python脚本和以及模型存储pickle文件在同一位置。

    uvicorn main:app --reload
    
    • 1

    命令执行完后,我们就在 localhost 上初始化 API 服务了,大家在浏览器上输入 http://localhost:8000/docs ,会显示如下内容:

    点击页面中绿色的 POST 按钮,它将打开一个像这样的表单:

    点击右上角的『Try it out』 ,在表单填入一些值,然后点击『Execute』,我们会看到以下响应:

    我们可以使用 python 的 requests 库测试一下,远程发起请求是否可以得到结果,如下图所示:

    大家可以看看,我们通过传参的方式对模型服务发起请求,并得到返回结果。

    参考资料

  • 相关阅读:
    SpringBoot的启动流程
    SwiftUI ☞ Animation
    【Javaweb】会话跟踪技术Cookie&Session
    基于 hugging face 预训练模型的实体识别智能标注方案:生成doccano要求json格式
    centOs云服务器安装Docker
    java-php-python-ssm点餐系统计算机毕业设计
    小柏实战学习Liunx(图文教程二十二)
    矿产行业智能采购管理系统开发,采购平台提升矿企核心竞争力
    【C++】模板(初级)
    用友第五届开发者大赛初赛晋级公示,复赛火热进行中!
  • 原文地址:https://blog.csdn.net/ShowMeAI/article/details/126022198