?? 作者:韓信子@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
?? FastAPI
FastAPI 是一個快速(高性能)的Web框架,主要特點是:
- 快速 :非常高的性能,是目前可用的最快的 Python 框架之一 ,
- 快速編碼 :將開發速度提高2到3倍,
- 簡單 :易于學習和使用,
更多有關 FastAPI 的資訊,請查看官方 ?? GitHub ,
我們也通過 pip 安裝 fastapi:
pip install fastapi
?? 業務背景
本篇內容中涉及的案例來自達頓商學院(案例研究發表在 ?? 哈佛商學院),案例中收集了 6000 顆鉆石的資料,包括它們的價格和切工、顏色、形狀等屬性,
?? 實戰資料集下載(百度網盤):公眾號『ShowMeAI研究中心』回復『實戰』,或者點擊 這里 獲取本文 [13] 鉆石價格預測的ML全流程!從模型構建調優道部署應用! 『** pycaret-master 資料集**』
? ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub
?? 資料
我們在本篇內容中,使用鉆石的克拉重量、切工、顏色和其他特征等屬性來預測鉆石的價格, 資料集可從 ?? 此處下載,
# 加載資料
from pycaret.datasets import get_data
data = https://www.cnblogs.com/showmeai/p/get_data('diamond')
?? 探索性資料分析
我們先做一些快速資料分析和可視化來評估資料欄位屬性(重量、切工、顏色、凈度等)與目標變數/標簽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()
我們繪制并了解一下目標變數Price的分布,
# 繪制灰度圖查看分布
fig = px.histogram(data, x=["Price"], template = 'plotly_dark', title = 'Histogram of Price')
fig.show()
可以從上圖看出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()
大家可以明顯看到,經過log變換后的資料分布,更加接近正態分布,
?? 資料準備
我們先匯入PyCaret工具庫,并做基本的設定,
# 初始化
from pycaret.regression import *
s = setup(data, target = 'Price', transform_target = True)
注意上面的 transform_target = True,PyCaret會對Price欄位使用 box-cox 變換,這個變換與對數轉換是類似的,也能對有偏分布進行校正,
?? 模型選擇&訓練&調優
資料準備完畢后,我們使用模型對其進行訓練,pycaret中最簡單的方式是使用 compare_models函式,它使用交叉驗證來訓練和評估模型庫中可用的模型,它的回傳值是具有平均交叉驗證分數的評分網格, 這個程序只需要下列簡單代碼:
# 對所有可用模型進行實驗和評估
best = compare_models()
上圖是最終的實驗結果,我們可以看到,對所有模型使用平均絕對誤差 (MAE) 評估,CatBoost Regressor模型有最好的效果,
# 訓練模型的預估結果殘差
plot_model(best, plot = 'residuals_interactive')
# 輸出特征重要度
plot_model(best, plot = 'feature')
?? 模型保存
我們把最優模型保存為 pickle 檔案,
# 最佳模型
final_best = finalize_model(best)
# 存盤模型
save_model(final_best, 'diamond-pipeline')
?? 模型部署
下面我們演示使用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 = https://www.cnblogs.com/showmeai/p/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=https://www.cnblogs.com/showmeai/p/data)
return {'prediction': int(predictions['Label'][0])}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
接下來可以通過終端命令列運行以下命令來運行這個服務,大家確保運行命令的路徑和上述python腳本和以及模型存盤pickle檔案在同一位置,
uvicorn main:app --reload
命令執行完后,我們就在 localhost 上初始化 API 服務了,大家在瀏覽器上輸入 http://localhost:8000/docs ,會顯示如下內容:
點擊頁面中綠色的 POST 按鈕,它將打開一個像這樣的表單:
點擊右上角的『Try it out』 ,在表單填入一些值,然后點擊『Execute』,我們會看到以下回應:
我們可以使用 python 的 requests 庫測驗一下,遠程發起請求是否可以得到結果,如下圖所示:
大家可以看看,我們通過傳參的方式對模型服務發起請求,并得到回傳結果,
參考資料
- ?? 實戰資料集下載(百度網盤):公眾號『ShowMeAI研究中心』回復『實戰』,或者點擊 這里 獲取本文 [13] 鉆石價格預測的ML全流程!從模型構建調優道部署應用! 『** pycaret-master 資料集**』
- ? ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub
- ?? PyCaret GitHub:https://www.github.com/pycaret/pycaret
- ?? FastAPI GitHub:https://github.com/tiangolo/fastapi
- ?? 哈佛商學院 Sarah Gets a Diamond:https://hbsp.harvard.edu/product/UV0869-PDF-ENG
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/501509.html
標籤:其他
上一篇:API 網關的功能
