機(jī)器之心報(bào)道
機(jī)器之心編輯部
PyCaret 庫(kù)支持在「低代碼」環(huán)境中訓(xùn)練和部署有監(jiān)督以及無(wú)監(jiān)督的機(jī)器學(xué)習(xí)模型,提升機(jī)器學(xué)習(xí)實(shí)驗(yàn)的效率。
想提高機(jī)器學(xué)習(xí)實(shí)驗(yàn)的效率,把更多精力放在解決業(yè)務(wù)問(wèn)題而不是寫代碼上?低代碼平臺(tái)或許是個(gè)不錯(cuò)的選擇。
最近,機(jī)器之心發(fā)現(xiàn)了一個(gè)開(kāi)源低代碼機(jī)器學(xué)習(xí) Python 庫(kù) PyCaret,它支持在「低代碼」環(huán)境中訓(xùn)練和部署有監(jiān)督以及無(wú)監(jiān)督的機(jī)器學(xué)習(xí)模型。
GitHub 地址:https://github.com/pycaret/pycaret
用戶文檔:https://www.pycaret.org/guide
Notebook 教程:https://www.pycaret.org/tutorial
PyCaret 庫(kù)支持?jǐn)?shù)據(jù)科學(xué)家快速高效地執(zhí)行端到端實(shí)驗(yàn),與其他開(kāi)源機(jī)器學(xué)習(xí)庫(kù)相比,PyCaret 庫(kù)只需幾行代碼即可執(zhí)行復(fù)雜的機(jī)器學(xué)習(xí)任務(wù)。該庫(kù)適合有經(jīng)驗(yàn)的數(shù)據(jù)科學(xué)家、傾向于低代碼機(jī)器學(xué)習(xí)解決方案的公民數(shù)據(jù)科學(xué)家,以及編程背景較弱甚至沒(méi)有的新手。
PyCaret 庫(kù)支持多種 Notebook 環(huán)境,包括 Jupyter Notebook、Azure notebook 和 Google Colab。從本質(zhì)上來(lái)看,PyCaret 是一個(gè) Python 封裝器,封裝了多個(gè)機(jī)器學(xué)習(xí)庫(kù)和框架,如 sci-kit-learn、XGBoost、Microsoft LightGBM、spaCy 等。
機(jī)器學(xué)習(xí)實(shí)驗(yàn)中所有步驟均可使用 PyCaret 自動(dòng)開(kāi)發(fā)的 pipeline 進(jìn)行復(fù)現(xiàn)。在 Pycaret 中所執(zhí)行的所有操作均按順序存儲(chǔ)在 Pipeline 中,該 Pipeline 針對(duì)模型部署進(jìn)行了完全配置。
不管是填充缺失值、轉(zhuǎn)換類別數(shù)據(jù)、執(zhí)行特征工程設(shè)計(jì),還是調(diào)參,Pycaret 都能夠自動(dòng)執(zhí)行。而且 pipeline 可以保存為二進(jìn)制文件格式,支持在不同環(huán)境中進(jìn)行遷移。
PyCaret 包含一系列函數(shù),用戶通過(guò)它們完成機(jī)器學(xué)習(xí)實(shí)驗(yàn)。PyCaret 庫(kù)的函數(shù)可分為以下五個(gè)大類,涵蓋初始化、模型訓(xùn)練、集成、分析與部署:
此外,PyCaret 提供 6 個(gè)模塊,支持有監(jiān)督和無(wú)監(jiān)督模型的訓(xùn)練和部署,分別是分類、回歸、聚類、異常檢測(cè)、自然語(yǔ)言處理和關(guān)聯(lián)規(guī)則挖掘。每個(gè)模塊封裝特定的機(jī)器學(xué)習(xí)算法和不同模塊均可以使用的函數(shù)。用戶可以根據(jù)實(shí)驗(yàn)類型,將模塊導(dǎo)入環(huán)境中。
PyCaret 庫(kù)提供的六個(gè)模塊。
接下來(lái),我們就來(lái)了解一下 PyCaret 庫(kù)的安裝和使用方法吧。
啟動(dòng) PyCaret
使用 pip 安裝 PyCaret。
使用命令行界面或 notebook 環(huán)境,運(yùn)行下面的代碼進(jìn)行安裝:
pip install pycaret
Azure notebook 和 Google Colab 用戶,可以運(yùn)行下列代碼進(jìn)行安裝:
!pip install pycaret
安裝 PyCaret 時(shí)會(huì)自動(dòng)安裝所有依賴項(xiàng),過(guò)程非常簡(jiǎn)單,如下圖所示:
?
PyCaret 分步教程
數(shù)據(jù)獲取
該教程使用「糖尿病」數(shù)據(jù)集,目標(biāo)是根據(jù)血壓、胰島素水平以及年齡等多種因素預(yù)測(cè)患者的預(yù)后情況(1 或 0)。數(shù)據(jù)集參見(jiàn) PyCaret 的 GitHub 地址。
直接從 PyCaret 庫(kù)中導(dǎo)入數(shù)據(jù)集的最簡(jiǎn)單方法是使用 pycaret.datasets 模塊中的 get_data 函數(shù)。
from *pycaret.datasets* import *get_data*
diabetes = *get_data*('diabetes')
get_data 的輸出。
PyCaret 可以直接處理 Pandas 數(shù)據(jù)幀。
環(huán)境配置
在 PyCaret 中執(zhí)行任意機(jī)器學(xué)習(xí)實(shí)驗(yàn)的第一步都是,通過(guò)導(dǎo)入所需模塊并初始化 setup() 來(lái)設(shè)置環(huán)境。如下示例中使用的模塊是 pycaret.classification。
模塊導(dǎo)入后,將通過(guò)定義數(shù)據(jù)結(jié)構(gòu)「糖尿病」和目標(biāo)變量「類變量」來(lái)初始化 setup()。
from *pycaret.classification* import ***exp1 = *setup*(diabetes, target = 'Class variable')
所有預(yù)處理的步驟都會(huì)應(yīng)用至 setup() 中,PyCaret 擁有 20 余項(xiàng)功能可運(yùn)用于 ML 相關(guān)的數(shù)據(jù)準(zhǔn)備,例如根據(jù) setup 函數(shù)中定義的參數(shù)來(lái)創(chuàng)建 Transformation pipeline,同時(shí)也會(huì)自動(dòng)協(xié)調(diào) Pipeline 中所有的相關(guān)性及依賴關(guān)系。這樣面對(duì)測(cè)試或者未見(jiàn)過(guò)的數(shù)據(jù)集,用戶無(wú)需再手動(dòng)管理或是調(diào)整執(zhí)行的順序。
PyCaret 的 Pipeline 可輕松地在各環(huán)境之間相互遷移,比如大規(guī)模運(yùn)行或是輕松部署到生產(chǎn)環(huán)境中。下圖展示了 PyCaret 首次發(fā)布時(shí)可用的預(yù)處理功能:
PyCaret 的預(yù)處理功能。
數(shù)據(jù)預(yù)處理是機(jī)器學(xué)習(xí)的必要步驟,比如當(dāng)初始化 setup() 時(shí),缺失值填充、分類變量編碼、標(biāo)簽編碼(將 yes or no 轉(zhuǎn)化為 1 or 0)以及 train-test-split 會(huì)自動(dòng)執(zhí)行。
模型比較
這是監(jiān)督機(jī)器學(xué)習(xí)實(shí)驗(yàn)(分類或回歸模塊)應(yīng)該進(jìn)行的第一步。compare_models 函數(shù)訓(xùn)練模型庫(kù)中的所有模型,并使用 k 折交叉驗(yàn)證(默認(rèn) k=10)來(lái)比較常見(jiàn)的評(píng)估指標(biāo)。所使用的評(píng)估指標(biāo)如下所示:
分類模塊:準(zhǔn)確度、AUC、Recall、精度、F1 和 Kappa;
回歸模塊:MAE、MSE、RMSE、R2、RMSLE 和 MAPE。
*compare_models*()
compare_models() 函數(shù)的輸出。Output from compare_models( ) function
默認(rèn)使用 10 折交叉驗(yàn)證來(lái)評(píng)估指標(biāo),可以通過(guò)改變 fold 參數(shù)值來(lái)改變?cè)u(píng)估結(jié)果。默認(rèn)使用精度值(由高到低)來(lái)分類 table,同樣可以通過(guò)改變 sort 參數(shù)值來(lái)改變分類結(jié)果。
模型創(chuàng)建
在 PyCaret 的任何模塊中,創(chuàng)建模型就像編寫 create_model 一樣簡(jiǎn)單,它只需要一個(gè)參數(shù),即作為字符串輸入來(lái)傳遞的模型名稱。此函數(shù)返回具有 k 折交叉驗(yàn)證分?jǐn)?shù)和訓(xùn)練好的模型對(duì)象的表格。
adaboost = *create_model*('adaboost')
變量「adaboost」存儲(chǔ)一個(gè)由*create_model*函數(shù)返回的訓(xùn)練模型對(duì)象,該對(duì)象是 scikit 學(xué)習(xí)估計(jì)器??梢酝ㄟ^(guò)在變量后使用標(biāo)點(diǎn)(.)來(lái)訪問(wèn)訓(xùn)練對(duì)象的原始屬性。參見(jiàn)下面的示例:
訓(xùn)練好的模型對(duì)象的屬性。
PyCaret 有 60 多個(gè)開(kāi)源即用型算法。
模型調(diào)優(yōu)
tune_model 函數(shù)用于自動(dòng)調(diào)優(yōu)機(jī)器學(xué)習(xí)模型的超參數(shù)。PyCaret 在預(yù)定義的搜索空間上使用隨機(jī)網(wǎng)格搜索。此函數(shù)返回具有 k 折交叉驗(yàn)證分?jǐn)?shù)和訓(xùn)練好的模型對(duì)象的表格。
tuned_adaboost = tune_model('ada')
在無(wú)監(jiān)督模塊中的 tune_model 函數(shù),比如 pycaret.nlp,pycaret.clustering 和 pycaret.anomaly 可以和監(jiān)督模塊結(jié)合使用。舉例而言,通過(guò)評(píng)估監(jiān)督 ML 模型中的目標(biāo)或者損失函數(shù),PyCaret 的 NLP 模塊可以用來(lái)調(diào)整準(zhǔn)確度或 R2 等指標(biāo)的數(shù)值。
模型集成
ensemble_model 函數(shù)用于集成訓(xùn)練好的模型。它只需要一個(gè)參數(shù),即訓(xùn)練好的模型對(duì)象。此函數(shù)返回具有 k 折交叉驗(yàn)證分?jǐn)?shù)和訓(xùn)練好的模型對(duì)象的表格。
# creating a decision tree model
dt = *create_model*('dt')# ensembling a trained dt model
dt_bagged = *ensemble_model*(dt)
該庫(kù)默認(rèn)使用 Bagging 方法用于模型集成,用戶也可使用 ensemble_model 函數(shù)中的 method 參數(shù)將其轉(zhuǎn)換為 Boosting。
PyCaret 還提供了 blend_models 和 stack_models 功能,來(lái)集成多個(gè)訓(xùn)練好的模型。
模型繪制
訓(xùn)練好的機(jī)器學(xué)習(xí)模型的性能評(píng)估和診斷可以通過(guò) plot_model 函數(shù)來(lái)完成,具體而言,將訓(xùn)練模型對(duì)象和 plot 類型作為 plot_model 函數(shù)中的字符串輸入(string input)。
# create a model
adaboost = *create_model*('ada')# AUC plot
*plot_model*(adaboost, plot = 'auc')# Decision Boundary
*plot_model*(adaboost, plot = 'boundary')# Precision Recall Curve
*plot_model*(adaboost, plot = 'pr')# Validation Curve
*plot_model*(adaboost, plot = 'vc')
此外,用戶還可以使用 evaluate_model 函數(shù)在 notebook 的用戶界面上看到可視化圖。
*evaluate_model*(adaboost)
pycaret.nlp 模塊中的 plot_model 函數(shù)可用于可視化文本語(yǔ)料庫(kù)和語(yǔ)義主題模型。
?模型解釋?
數(shù)據(jù)中的關(guān)系呈非線性是實(shí)踐中常常出現(xiàn)的情況。這時(shí)總會(huì)看到基于樹(shù)的模型要比簡(jiǎn)單的高斯模型的表現(xiàn)好得多。但這是以犧牲可解釋性為代價(jià)的,因?yàn)榛跇?shù)的模型無(wú)法像線性模型那樣提供簡(jiǎn)單的系數(shù)。
PyCaret 通過(guò) interpret_model 函數(shù)實(shí)現(xiàn)了 SHAP(SHapley Additive exPlanations)。
# create a model
xgboost = *create_model*('xgboost')# summary plot
*interpret_model*(xgboost)# correlation plot
*interpret_model*(xgboost, plot = 'correlation')
測(cè)試數(shù)據(jù)集上特定數(shù)據(jù)點(diǎn)的解釋可以通過(guò)『reason』圖來(lái)評(píng)估。如下圖所示:在測(cè)試數(shù)據(jù)集上檢查首個(gè)實(shí)例。
*interpret_model*(xgboost, plot = 'reason', observation = 0)
模型預(yù)測(cè)
到目前為止,所看到的結(jié)果僅基于訓(xùn)練數(shù)據(jù)集上 k 折交叉驗(yàn)證(默認(rèn) 70%)。所以為了得到模型在測(cè)試或者 hold-out 數(shù)據(jù)集上的預(yù)測(cè)結(jié)果和性能,用戶可以使用 predict_model 函數(shù)。如下所示:
# create a model
rf = *create_model*('rf')# predict test / hold-out dataset
rf_holdout_pred* = predict_model*(rf)
predict_model 函數(shù)還可以用來(lái)預(yù)測(cè)未見(jiàn)過(guò)的數(shù)據(jù)集?,F(xiàn)在,將訓(xùn)練時(shí)所使用的數(shù)據(jù)集用作新的未見(jiàn)過(guò)數(shù)據(jù)集的代理(proxy)。在實(shí)踐中,predict_model 函數(shù)會(huì)被迭代地使用,每次使用都會(huì)有一個(gè)新的未見(jiàn)過(guò)的數(shù)據(jù)集。
predictions = *predict_model*(rf, data = diabetes)
此外,對(duì)于使用 stack_models 和 create_stacknet 函數(shù)創(chuàng)建的模型,predict_model 函數(shù)可以預(yù)測(cè)它們的序列鏈。不僅如此,借助于 deploy_model 函數(shù),predict_model 函數(shù)還可以直接基于托管在 AWS S3 上的模型進(jìn)行預(yù)測(cè)。
模型部署
我們可以使用以下方法讓訓(xùn)練好的模型在未見(jiàn)過(guò)的數(shù)據(jù)集上生成預(yù)測(cè):在訓(xùn)練模型的同一個(gè) notebook 或 IDE 中使用 predict_model 函數(shù)。但是,在未見(jiàn)過(guò)的數(shù)據(jù)集上執(zhí)行預(yù)測(cè)是一個(gè)迭代的過(guò)程。其中,基于用例的不同,預(yù)測(cè)可以分為實(shí)時(shí)預(yù)測(cè)和批量預(yù)測(cè)。
PyCaret 的 deploy_model 函數(shù)允許部署整個(gè) pipeline,包括云端訓(xùn)練的模型。
*deploy_model*(model = rf, model_name = 'rf_aws', platform = 'aws',
authentication = {'bucket' : 'pycaret-test'})
模型/實(shí)驗(yàn)保存
訓(xùn)練完成后,包含所有預(yù)處理轉(zhuǎn)換和訓(xùn)練模型對(duì)象在內(nèi)的整個(gè) pipeline 能夠以二進(jìn)制 pickle 文件的格式保存。
# creating model
adaboost = *create_model*('ada')# saving model*
save_model*(adaboost, model_name = 'ada_for_deployment')
用戶也能夠以二進(jìn)制文件的格式保存整個(gè)實(shí)驗(yàn),包括所有中間輸出(intermediary output)。
*save_experiment*(experiment_name = 'my_first_experiment')
最后,通過(guò) PyCaret 所有模塊中可用的 load_model 和 load_experiment 函數(shù),用戶還可以下載保存的模型和實(shí)驗(yàn)。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。