【机器学习】用PyCaret创建整个机器学习管道
作者 | Daniel Morales?
編譯 | VK?
來源 | Towards Data Science
本教程涵蓋了整個ML過程,從數(shù)據(jù)獲取、預(yù)處理、模型訓(xùn)練、超參數(shù)擬合、預(yù)測和存儲模型以備將來使用。
我們將在不到10個命令中完成所有這些步驟,這些命令是自然構(gòu)造的,并且非常直觀易記,例如
create_model(),? tune_model(),? compare_models() plot_model() evaluate_model() predict_model()讓我們看看全局
在大多數(shù)庫中,不使用PyCaret重新創(chuàng)建整個實驗需要100多行代碼。PyCaret還允許你執(zhí)行更高級的操作,例如高級預(yù)處理、集成、廣義疊加和其他技術(shù),這些技術(shù)允許你完全定制ML管道,這是任何數(shù)據(jù)科學(xué)家必須具備的。
PyCaret是一個開源的、底層的、使用Python的ML庫,它允許你在幾分鐘內(nèi)從準(zhǔn)備數(shù)據(jù)到部署模型。允許科學(xué)家和數(shù)據(jù)分析員從頭到尾高效地執(zhí)行迭代數(shù)據(jù)科學(xué)實驗,并允許他們更快地得出結(jié)論,因為在編程上花費的時間要少得多。這個庫非常類似于Caret de R,但是用python實現(xiàn)的
在數(shù)據(jù)科學(xué)項目中,理解數(shù)據(jù)通常需要很長時間(EDA和特征工程)。那么,如果我們能把花在項目建模部分的時間減少一半呢?
讓我們看看怎么做
首先我們需要先決條件
Python 3.6或更高版本
PyCaret 2.0或更高版本
在這里你可以找到庫的文件和其他:https://pycaret.org/
首先,請運行以下命令:!pip3 install pycaret
對于google colab用戶:如果你在google colab中運行此筆記本,請在筆記本頂部運行以下代碼以顯示交互式圖像
from?pycaret.utils?import?enable_colab enable_colab()Pycaret模塊
Pycaret根據(jù)我們要執(zhí)行的任務(wù)進行劃分,并且有不同的模塊,這些模塊代表每種類型的學(xué)習(xí)(有監(jiān)督的或無監(jiān)督的)。在本教程中,我們將使用二分類算法研究監(jiān)督學(xué)習(xí)模塊。
分類模塊
PyCaret分類模塊(pycaret.classification)是一個有監(jiān)督的機器學(xué)習(xí)模塊,用于根據(jù)各種技術(shù)和算法將元素分類為二類。分類問題的一些常見用途包括預(yù)測客戶違約(是或否)、客戶放棄(客戶將離開或留下)、遇到的疾病(陽性或陰性)等等。
PyCaret分類模塊可用于二或多類分類問題。它有18個以上的算法和14個分析模型性能的曲線圖。無論是超參數(shù)調(diào)整、加密還是諸如堆疊之類的高級技術(shù),PyCaret的分類模塊都有。
在本教程中,我們將使用一個UCI數(shù)據(jù)集,稱為默認(rèn)信用卡客戶數(shù)據(jù)集。此資料集包含2005年4月至2005年9月臺灣信用卡客戶的拖欠付款、人口統(tǒng)計資料、信用資料、付款記錄及帳單結(jié)算單的資料。有24000個樣本和25個特征。
數(shù)據(jù)集可以在這里找到。或者在這里你可以找到一個直接的下載鏈接:https://drive.google.com/file/u/2/d/1bVUAk2Y4bdqKx-2NAPk0b4mIOv078zl6/view?usp=sharing
所以,將數(shù)據(jù)集下載到你的環(huán)境中,然后我們將像這樣加載它
[2]:
import?pandas?as?pd[3]:
df?=?pd.read_csv('datasets/default?of?credit?card?clients.csv')[4]
df.head()[4]的輸出
1-獲取數(shù)據(jù)
我們還有另一種加載方法。實際上,這將是我們在本教程中使用的默認(rèn)方式。它直接來自PyCaret數(shù)據(jù)集,是我們管道的第一個方法
from?pycaret.datasets?import?get_data dataset?=?get_data('credit')#?檢查數(shù)據(jù)的形狀 dataset.shape為了演示predict_model函數(shù)對未查看的數(shù)據(jù)的作用,保留了原始數(shù)據(jù)集中1200條記錄的樣本,以便在預(yù)測中使用。
這不應(yīng)與訓(xùn)練/測試分割相混淆,因為這個特殊的分割是為了模擬真實的場景。另一種思考方式是,在進行ML實驗時,這1200條記錄是不可用的。
[7]:
## sample從對象的一個軸返回一個隨機樣本。那將是22800個樣本,而不是24000個 data?=?dataset.sample(frac=0.95,?random_state=786)[8]:
data #?我們從原始數(shù)據(jù)集中刪除這些隨機數(shù)據(jù) data_unseen?=?dataset.drop(data.index)[10]:
#?未查看的數(shù)據(jù)集##?我們重置了兩個數(shù)據(jù)集的索引 data.reset_index(inplace=True,?drop=True) data_unseen.reset_index(inplace=True,?drop=True) print('Data?for?Modeling:?'?+?str(data.shape)) print('Unseen?Data?For?Predictions:?'?+?str(data_unseen.shape))Data?for?Modeling:?(22800,?24) Unseen?Data?For?Predictions:?(1200,?24)拆分?jǐn)?shù)據(jù)
我們劃分?jǐn)?shù)據(jù)集的方式很重要,因為有些數(shù)據(jù)在建模過程中不會使用,我們將在最后通過模擬真實數(shù)據(jù)來驗證我們的結(jié)果。我們將用于建模的數(shù)據(jù)進行細(xì)分,以便評估訓(xùn)練和測試這兩個場景。因此,我們做了以下工作
驗證數(shù)據(jù)集
是用于提供最終模型的無偏評估的數(shù)據(jù)樣本。
驗證數(shù)據(jù)集提供了用于評估模型的黃金標(biāo)準(zhǔn)。
它只在模型完全訓(xùn)練后使用(使用訓(xùn)練集和測試集)。
驗證集通常用于評估比賽的模型(例如,在許多Kaggle比賽時,測試集與訓(xùn)練測試集一起初始發(fā)布,驗證集僅在比賽即將結(jié)束時發(fā)布,驗證集模型的結(jié)果決定了勝利者)。
很多時候測試集被用作驗證集,但這不是一個好的實踐。
驗證集通常都很好地修復(fù)了。
它包含了仔細(xì)采樣的數(shù)據(jù),這些數(shù)據(jù)涵蓋了模型在現(xiàn)實世界中使用時將面臨的各種類。
訓(xùn)練數(shù)據(jù)集
訓(xùn)練數(shù)據(jù)集:用于訓(xùn)練模型的數(shù)據(jù)樣本。
我們用來訓(xùn)練模型的數(shù)據(jù)集
模型看這些數(shù)據(jù)并學(xué)習(xí)。
測試數(shù)據(jù)集
測試數(shù)據(jù)集:在調(diào)整模型超參數(shù)時,用于提供與訓(xùn)練數(shù)據(jù)集匹配的數(shù)據(jù)樣本。
隨著測試數(shù)據(jù)集中的信息被納入模型中,評估變得更加有偏見。
測試集用于評估給定的模型,但這是用于頻繁評估的。
作為ML工程師,我們使用這些數(shù)據(jù)來微調(diào)模型的超參數(shù)。
因此,模型偶爾會看到這些數(shù)據(jù),但從不從中“學(xué)習(xí)”。
我們使用測試集的結(jié)果,更新更高級別的超參數(shù)
所以測試集會影響模型,但只是間接的。
測試集也稱為開發(fā)集。這是有意義的,因為這個數(shù)據(jù)集在模型的“開發(fā)”階段有幫助。
術(shù)語混淆
有一種混淆測試和驗證集名稱的趨勢。
根據(jù)教程、來源、書籍、視頻或老師/導(dǎo)師的不同,術(shù)語會有所變化,重要的是要保持概念不變。
在我們的例子中,我們已經(jīng)在開始時分離了驗證集
2-設(shè)置PyCaret環(huán)境
現(xiàn)在讓我們設(shè)置Pycaret環(huán)境。函數(shù)的作用是:初始化pycaret中的環(huán)境,并創(chuàng)建轉(zhuǎn)換管道,為建模和部署準(zhǔn)備數(shù)據(jù)。
在pycaret中執(zhí)行任何其他函數(shù)之前必須調(diào)用setup()。它需要兩個必需的參數(shù):pandas dataframe和目標(biāo)列的名稱。這部分配置大部分是自動完成的,但有些參數(shù)可以手動設(shè)置。例如:
默認(rèn)的分割比是70:30(正如我們在上面的段落中看到的),但是可以用“train_size”來更改。
K折疊交叉驗證默認(rèn)設(shè)置為10
“session_id”是我們經(jīng)典的“random_state”
[12]:
##?設(shè)置環(huán)境 from?pycaret.classification?import?*注意:運行以下命令后,必須按enter鍵完成此過程。我們會解釋他們是怎么做到的。安裝過程可能需要一些時間才能完成。
[13]:
model_setup?=?setup(data=data,?target='default',?session_id=123)運行setup()時,PyCaret的推理算法將根據(jù)某些屬性自動推斷出所有特征的數(shù)據(jù)類型。但情況并非總是如此。
為了考慮到這一點,PyCaret在執(zhí)行setup()之后會顯示一個包含特征及其推斷數(shù)據(jù)類型的表。如果正確識別了所有數(shù)據(jù)類型,則可以按enter繼續(xù),或按exit結(jié)束實驗。我們按enter鍵,輸出的結(jié)果應(yīng)該和上面的一樣。
確保數(shù)據(jù)類型是正確的在PyCaret中是至關(guān)重要的,因為它自動執(zhí)行一些預(yù)處理任務(wù),這些任務(wù)對于任何ML實驗都是必不可少的。對于每種類型的數(shù)據(jù),執(zhí)行任務(wù)的方式不同,所以這意味著正確配置非常重要。
我們可以使用setup()中的numeric_features和category_features參數(shù)覆蓋從PyCaret推斷的數(shù)據(jù)類型。一旦設(shè)置成功執(zhí)行,將打印包含幾個重要信息的信息網(wǎng)格。大多數(shù)信息都與運行setup()時生成的預(yù)處理管道有關(guān)
這些特征中的大多數(shù)都超出了本教程的范圍,但是,在此階段需要記住的一些重要的包括
session_id:一個偽隨機數(shù),作為種子分布在所有函數(shù)中,以便以后的重現(xiàn)性。
目標(biāo)類型:二或多類。自動檢測并顯示目標(biāo)類型。
Label encoded:當(dāng)目標(biāo)變量的類型為string(即“Yes”或“No”)而不是1或0時,它會自動在1和0處對標(biāo)簽進行編碼,并將映射(0:No,1:Yes)顯示為引用
原始數(shù)據(jù):顯示數(shù)據(jù)集的原始形式。在這個實驗中是(22800,24)
缺少值:當(dāng)原始數(shù)據(jù)中缺少值時,將顯示為True
數(shù)值特征:推斷為數(shù)值特征的數(shù)量。
類別特征:推斷為類別特征的數(shù)量
轉(zhuǎn)換后的訓(xùn)練組:注意,原來的(22800,24)形式被轉(zhuǎn)換為(15959,91),由于分類編碼,特征的數(shù)量從24增加到91
轉(zhuǎn)換測試集:測試集中有6841個樣本。此拆分基于默認(rèn)值70/30,可使用配置中的“訓(xùn)練大小”參數(shù)進行更改。
注意一些必須進行建模的任務(wù)是如何自動處理的,例如缺失值的插補(在這種情況下,訓(xùn)練數(shù)據(jù)中沒有缺失的值,但我們?nèi)匀恍枰獮榭床灰姷臄?shù)據(jù)提供插補器)、分類編碼等。
大部分setup()參數(shù)是可選的,用于自定義預(yù)處理管道。
3-比較模型
為了理解PyCaret是如何比較模型和管道中的下一步的,有必要理解N-fold交叉驗證的概念。
N-Fold 交叉驗證
計算有多少數(shù)據(jù)應(yīng)該劃分到測試集中是一個微妙的問題。
如果你的訓(xùn)練集太小,你的算法可能沒有足夠的數(shù)據(jù)來有效地學(xué)習(xí)。另一方面,如果你的測試集太小,那么你的準(zhǔn)確度、精確度、召回率和F1分?jǐn)?shù)可能會有很大的變化。
你可能很幸運,也可能很不幸!一般來說,將70%的數(shù)據(jù)放在訓(xùn)練集中,30%的數(shù)據(jù)放在測試集中是一個很好的起點。有時你的數(shù)據(jù)集太小了,70/30會產(chǎn)生很大的差異。
一種解決方法是執(zhí)行N折交叉驗證。這里的中心思想是,我們將整個過程進行N次,然后平均精度。例如,在10折交叉驗證中,我們將測試集的前10%的數(shù)據(jù),并計算準(zhǔn)確度、精確度、召回率和F1分?jǐn)?shù)。
然后,我們將使交叉驗證建立第二個10%的數(shù)據(jù),我們將再次計算這些統(tǒng)計數(shù)據(jù)。我們可以做這個過程10次,每次測試集都會有一段不同的數(shù)據(jù)。然后我們平均所有的準(zhǔn)確度。
注意:驗證集(這里是黃色)是我們案例中的測試集
了解模型的準(zhǔn)確度是非常寶貴的,因為可以開始調(diào)整模型的參數(shù)以提高模型的性能。
例如,在K-最近鄰算法中,你可以看到當(dāng)你增加或減少K時,精確度會發(fā)生什么變化。一旦你對模型的性能感到滿意,就應(yīng)該輸入驗證集了(在我們的例子中是看不見的)。
它應(yīng)該是你真正感興趣的真實世界數(shù)據(jù)的替代品。它的工作原理與測試集非常相似,只是在構(gòu)建或優(yōu)化模型時從未接觸過這些數(shù)據(jù)。通過找到精度指標(biāo),你可以很好地了解算法在現(xiàn)實世界中的性能。
比較所有模型
在PyCaret setup()完成后,建議將所有模型進行比較以評估性能(除非你確切知道需要什么類型的模型,通常情況下并非如此),該函數(shù)訓(xùn)練模型庫中的所有模型,并使用分層交叉驗證對其進行評分,以評估度量。
輸出將打印一個分?jǐn)?shù)網(wǎng)格,該網(wǎng)格顯示精度、AUC、召回率、精度、F1、Kappa和MCC的平均值(默認(rèn)為10)以及訓(xùn)練時間。開始吧!
[14]:
best_model?=?compare_models()compare_models()函數(shù)的作用是:一次比較多個模型。這是使用PyCaret的最大優(yōu)點之一。在一行中,你可以看到許多模型之間的比較表。兩個簡單的單詞(甚至不是一行代碼)已經(jīng)使用N倍交叉驗證訓(xùn)練和評估了超過15個模型。
以上打印的表格突出顯示了最高性能指標(biāo),僅供比較之用。默認(rèn)表使用“精度”(從最高到最低)排序,可以通過傳遞參數(shù)來更改。例如,compare_models(sort = 'Recall')將根據(jù)召回而不是準(zhǔn)確度對網(wǎng)格進行排序。
如果要將Fold參數(shù)從默認(rèn)值10更改為其他值,可以使用Fold參數(shù)。例如,compare_models(fold = 5)將在5倍交叉驗證中比較所有模型。減少折疊次數(shù)可以縮短訓(xùn)練時間。
默認(rèn)情況下,compare_models根據(jù)默認(rèn)的排序順序返回性能最好的模型,但是它可以使用N_select參數(shù)返回前N個模型的列表。此外,它還返回一些指標(biāo),如精確度、AUC和F1。另一個很酷的事情是庫如何自動突出顯示最佳結(jié)果。一旦選擇了模型,就可以創(chuàng)建模型,然后對其進行優(yōu)化。我們試試用其他方法:
[15]:
print(best_model)RidgeClassifier(alpha=1.0,?class_weight=None,?copy_X=True,?fit_intercept=True,max_iter=None,?normalize=False,?random_state=123,?solver='auto',tol=0.001)4-創(chuàng)建模型
create_model是PyCaret中最細(xì)粒度的函數(shù),通常是PyCaret大多數(shù)功能的基礎(chǔ)。正如它的名字所示,這個函數(shù)使用交叉驗證(可以用參數(shù)fold設(shè)置)來訓(xùn)練和評估模型。輸出打印一個計分表,按Fold 顯示精度、AUC、召回率、F1、Kappa和MCC。
在本教程的其余部分中,我們將使用以下模型作為候選模型。這些選擇僅用于說明目的,并不一定意味著他們是最好的執(zhí)行者或這類數(shù)據(jù)的理想選擇
決策樹分類器('dt')
K近鄰分類器('knn')
隨機森林分類器('rf')
PyCaret模型庫中有18個分類器可用。要查看所有分類器的列表,請查看文檔或使用models()函數(shù)查看庫。
[16]:
models() dt?=?create_model('dt') #?訓(xùn)練的模型對象存儲在變量'dt'中。 print(dt)DecisionTreeClassifier(ccp_alpha=0.0,?class_weight=None,?criterion='gini',max_depth=None,?max_features=None,?max_leaf_nodes=None,min_impurity_decrease=0.0,?min_impurity_split=None,min_samples_leaf=1,?min_samples_split=2,min_weight_fraction_leaf=0.0,?presort='deprecated',random_state=123,?splitter='best')[19]:
knn?=?create_model('knn') print(knn)KNeighborsClassifier(algorithm='auto',?leaf_size=30,?metric='minkowski',metric_params=None,?n_jobs=-1,?n_neighbors=5,?p=2,weights='uniform')[21]:
rf?=?create_model('rf') print(rf)RandomForestClassifier(bootstrap=True,?ccp_alpha=0.0,?class_weight=None,criterion='gini',?max_depth=None,?max_features='auto',max_leaf_nodes=None,?max_samples=None,min_impurity_decrease=0.0,?min_impurity_split=None,min_samples_leaf=1,?min_samples_split=2,min_weight_fraction_leaf=0.0,?n_estimators=100,n_jobs=-1,?oob_score=False,?random_state=123,?verbose=0,warm_start=False)請注意,所有模型的平均分?jǐn)?shù)與compare_models()上打印的分?jǐn)?shù)匹配。這是因為compare_models()分?jǐn)?shù)網(wǎng)格中打印的指標(biāo)是所有折的平均分?jǐn)?shù)。
你還可以在每個模型的每個print()中看到用于構(gòu)建它們的超參數(shù)。這是非常重要的,因為它是改進它們的基礎(chǔ)。你可以看到RandomForestClassifier的參數(shù)
max_depth=None max_features='auto' min_samples_leaf=1 min_samples_split=2 min_weight_fraction_leaf=0.0 n_estimators=100 n_jobs=-15-調(diào)整模型
使用create_model()函數(shù)創(chuàng)建模型時,默認(rèn)的超參數(shù)用于訓(xùn)練模型。要調(diào)整超參數(shù),請使用tune_model()函數(shù)。此函數(shù)使用預(yù)定義搜索空間中的隨機網(wǎng)格搜索自動調(diào)整模型的超參數(shù)。
輸出打印一個分?jǐn)?shù)網(wǎng)格,顯示準(zhǔn)確度、AUC、召回率、精密度、F1、Kappa和MCC,以獲得最佳模型。要使用自定義搜索網(wǎng)格,可以在tune_model函數(shù)中傳遞custom_grid參數(shù)
[23]:
tuned_rf?=?tune_model(rf)如果我們將這個改進的RandomForestClassifier模型與之前的RandomForestClassifier模型的準(zhǔn)確度指標(biāo)進行比較,我們會發(fā)現(xiàn)一個差異,因為它的精確度從0.8199提高到了0.8203。
[24]:
#?優(yōu)化模型對象存儲在變量“tuned_dt”中。print(tuned_rf) RandomForestClassifier(bootstrap=False,?ccp_alpha=0.0,?class_weight={},criterion='entropy',?max_depth=5,?max_features=1.0,max_leaf_nodes=None,?max_samples=None,min_impurity_decrease=0.0002,?min_impurity_split=None,min_samples_leaf=5,?min_samples_split=10,min_weight_fraction_leaf=0.0,?n_estimators=150,n_jobs=-1,?oob_score=False,?random_state=123,?verbose=0,warm_start=False)現(xiàn)在我們來比較一下超參數(shù)。我們以前是:
max_depth=None max_features='auto' min_samples_leaf=1 min_samples_split=2 min_weight_fraction_leaf=0.0 n_estimators=100 n_jobs=-1而現(xiàn)在是:
max_depth=5 max_features=1.0 min_samples_leaf=5 min_samples_split=10 min_weight_fraction_leaf=0.0 n_estimators=150 n_jobs=-1你可以自己用knn和dt做同樣的比較,探索超參數(shù)之間的差異。
默認(rèn)情況下,tune_model優(yōu)化精度,但可以使用optimize參數(shù)更改此值。例如:tune_model(dt,optimize='AUC')將查找決策樹分類器的超參數(shù),該分類器將導(dǎo)致最高的AUC而不是準(zhǔn)確性。在本例中,我們僅為簡單起見使用了Accuracy的默認(rèn)度量。
一般來說,當(dāng)數(shù)據(jù)集不平衡(像我們正在使用的信用數(shù)據(jù)集)時,精度不是一個很好的度量標(biāo)準(zhǔn)。選擇正確的度量來評估的方法超出了本教程的范圍。
在為生產(chǎn)選擇最佳模型時,度量并不是你應(yīng)該考慮的唯一標(biāo)準(zhǔn)。其他要考慮的因素包括訓(xùn)練時間、k-folds的標(biāo)準(zhǔn)差等。現(xiàn)在,讓我們繼續(xù)考慮隨機森林分類器tuned_rf,作為本教程其余部分的最佳模型
6-繪制模型
在完成模型(步驟8)之前,plot#model()函數(shù)可以通過AUC、混淆矩陣、決策邊界等不同方面來分析性能。該函數(shù)獲取一個經(jīng)過訓(xùn)練的模型對象,并根據(jù)訓(xùn)練/測試集返回一個圖形。
有15種不同的繪圖,請參閱plot_model()文檔以獲取可用繪圖的列表。
[25]:
#?AUC?圖plot_model(tuned_rf,?plot?=?'auc') ##?PR?曲線plot_model(tuned_rf,?plot?=?'pr') ##?特征重要性plot_model(tuned_rf,?plot='feature') ##?混淆矩陣plot_model(tuned_rf,?plot?=?'confusion_matrix')7-評估模型
分析模型性能的另一種方法是使用evaluate_model()函數(shù),該函數(shù)顯示給定模型的所有可用圖形的用戶界面。在內(nèi)部它使用plot_model()函數(shù)。
[29]:
evaluate_model(tuned_rf)8-最終確定模型
模型的建立是實驗的最后一步。PyCaret中的正常機器學(xué)習(xí)工作流從setup()開始,然后使用compare_models()對所有模型進行比較,并預(yù)先選擇一些候選模型(基于感興趣的度量),以執(zhí)行各種建模技術(shù),如超參數(shù)擬合、裝配、堆疊等。
此工作流最終將引導(dǎo)你找到用于對新的和未查看的數(shù)據(jù)進行預(yù)測的最佳模型。
finalize_model()函數(shù)使模型擬合完整的數(shù)據(jù)集,包括測試樣本(在本例中為30%)。此函數(shù)的目的是在將模型部署到生產(chǎn)環(huán)境之前,對模型進行完整的數(shù)據(jù)集訓(xùn)練。我們可以在predict_model()之后或之前執(zhí)行此方法。我們要在這之后執(zhí)行。
最后一句警告。使用finalize_model()完成模型后,整個數(shù)據(jù)集(包括測試集)將用于訓(xùn)練。因此,如果在使用finalize_model()之后使用模型對測試集進行預(yù)測,則打印的信息網(wǎng)格將產(chǎn)生誤導(dǎo),因為它試圖對用于建模的相同數(shù)據(jù)進行預(yù)測。
為了證明這一點,我們將在predict_model()中使用final_rf來比較信息網(wǎng)格與前面的網(wǎng)格。
[30]:
final_rf?=?finalize_model(tuned_rf)[31]:
#?部署的最終隨機森林模型參數(shù) print(final_rf)RandomForestClassifier(bootstrap=False,?ccp_alpha=0.0,?class_weight={},criterion='entropy',?max_depth=5,?max_features=1.0,max_leaf_nodes=None,?max_samples=None,min_impurity_decrease=0.0002,?min_impurity_split=None,min_samples_leaf=5,?min_samples_split=10,min_weight_fraction_leaf=0.0,?n_estimators=150,n_jobs=-1,?oob_score=False,?random_state=123,?verbose=0,warm_start=False)9-用模型預(yù)測
在最終確定模型之前,建議通過預(yù)測測試和查看評估指標(biāo)來執(zhí)行最終檢查。如果你查看信息表,你將看到30%(6841個樣本)的數(shù)據(jù)被分離為測試集樣本。
我們在上面看到的所有評估指標(biāo)都是基于訓(xùn)練集(70%)的交叉驗證結(jié)果。現(xiàn)在,使用存儲在tuned_rf變量中的最終訓(xùn)練模型,我們根據(jù)測試樣本進行預(yù)測,并評估指標(biāo),看它們是否與CV結(jié)果有實質(zhì)性差異
[32]:
predict_model(final_rf)測試集的準(zhǔn)確度為0.8199,而tuned_rf的結(jié)果為0.8203。這并不是一個顯著的區(qū)別。如果測試集和訓(xùn)練集的結(jié)果之間存在較大差異,這通常表示過擬合,但也可能是由于其他幾個因素造成的,需要進一步調(diào)查。
在本例中,我們將繼續(xù)完成模型,并對不可見的數(shù)據(jù)進行預(yù)測(我們在開始時分離的5%的數(shù)據(jù),它們從未暴露在PyCaret中)。
提示:使用create_model()時,最好查看訓(xùn)練集結(jié)果的標(biāo)準(zhǔn)差。
predict_model()函數(shù)還用于預(yù)測未查看的數(shù)據(jù)集。唯一不同的是,這次我們將傳遞參數(shù)數(shù)據(jù)。data_unseen是在教程開始時創(chuàng)建的變量,包含5%(1200個示例)的原始數(shù)據(jù)集,這些數(shù)據(jù)集從未公開給PyCaret。
[33]:
unseen_predictions?=?predict_model(final_rf,?data=data_unseen) unseen_predictions.head()請轉(zhuǎn)到上一個結(jié)果的最后一列,你將看到一個名為Score的新特征
Label是預(yù)測,score是預(yù)測的概率。請注意,預(yù)測結(jié)果與原始數(shù)據(jù)集連接,而所有轉(zhuǎn)換都在后臺自動執(zhí)行。
我們已經(jīng)完成了實驗,最終確定了tuned_rf模型,該模型現(xiàn)在存儲在final_rf變量中。
我們還使用了final_rf中存儲的模型來預(yù)測未知數(shù)據(jù)。這就結(jié)束了我們的實驗,但還有一個問題:當(dāng)你有更多的新數(shù)據(jù)要預(yù)測時會發(fā)生什么?你必須把整個實驗再看一遍嗎?
答案是否定的,PyCaret內(nèi)置的save_model()函數(shù)允許你保存模型以及所有轉(zhuǎn)換管道以供以后使用,并存儲在本地環(huán)境中的Pickle中
(提示:保存模型時最好使用文件名中的日期,這有利于版本控制)
讓我們看看下一步
10-保存/加載模型
保存模型
[35]:
save_model(final_rf,?'datasets/Final?RF?Model?19Nov2020')Transformation?Pipeline?and?Model?Succesfully?Saved[35]:
(Pipeline(memory=None,steps=[('dtypes',DataTypes_Auto_infer(categorical_features=[],display_types=True,?features_todrop=[],id_columns=[],ml_usecase='classification',numerical_features=[],?target='default',time_features=[])),('imputer',Simple_Imputer(categorical_strategy='not_available',fill_value_categorical=None,fill_value_numerical=None,numeric_stra...RandomForestClassifier(bootstrap=False,?ccp_alpha=0.0,class_weight={},?criterion='entropy',max_depth=5,?max_features=1.0,max_leaf_nodes=None,?max_samples=None,min_impurity_decrease=0.0002,min_impurity_split=None,min_samples_leaf=5,min_samples_split=10,min_weight_fraction_leaf=0.0,n_estimators=150,?n_jobs=-1,oob_score=False,?random_state=123,verbose=0,?warm_start=False)]],verbose=False),'datasets/Final?RF?Model?19Nov2020.pkl')加載模型
要在同一環(huán)境或其他環(huán)境中加載在將來某個日期保存的模型,我們將使用PyCaret的load_model()函數(shù),然后輕松地將保存的模型應(yīng)用到新的未查看的數(shù)據(jù)中以進行預(yù)測
[37]:
saved_final_rf?=?load_model('datasets/Final?RF?Model?19Nov2020')Transformation?Pipeline?and?Model?Successfully?Loaded一旦模型加載到環(huán)境中,就可以使用相同的predict_model()函數(shù)來預(yù)測任何新數(shù)據(jù)。接下來,我們應(yīng)用加載模型來預(yù)測我們以前使用過的相同數(shù)據(jù)。
[38]:
new_prediction?=?predict_model(saved_final_rf,?data=data_unseen)[39]:
new_prediction.head()[39]:
from?pycaret.utils?import?check_metric check_metric(new_prediction.default,?new_prediction.Label,?'Accuracy')[41]:
0.8167利弊
與任何新庫一樣,仍有改進的余地。我們將列出在使用該庫時發(fā)現(xiàn)的一些利弊。
優(yōu)點:
它使項目的建模部分更加容易。
只需一行代碼就可以創(chuàng)建許多不同的分析。
在擬合模型時,可以不用傳遞參數(shù)列表。PyCaret會自動為你執(zhí)行此操作。
你有許多不同的選項來評估模型,同樣,只需要一行代碼
因為它是在著名的ML庫之上構(gòu)建的,所以可以很容易地將其與傳統(tǒng)方法進行比較
缺點:
這個庫是早期版本,所以它還不夠成熟,容易受到bug的影響
作為所有的automl庫,它是一個黑匣子,所以你不能真正看到里面發(fā)生了什么。因此,我不推薦初學(xué)者使用。
這可能會使學(xué)習(xí)過程有點膚淺。
結(jié)論
本教程涵蓋了整個ML過程,從數(shù)據(jù)攝取、預(yù)處理、模型訓(xùn)練、超參數(shù)擬合、預(yù)測和存儲模型以備以后使用。
我們只用了不到10個命令就完成了所有這些步驟,這些命令都是自然構(gòu)造的,并且非常直觀易記,例如create_model()、tune_model()、compare_models()。如果不使用PyCaret重新創(chuàng)建整個實驗,大多數(shù)庫需要100多行代碼。
該庫還允許你執(zhí)行更高級的操作,例如高級預(yù)處理、集成、廣義疊加和其他技術(shù),這些技術(shù)允許你完全定制ML管道,這是任何數(shù)據(jù)科學(xué)家必須具備的
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯 獲取本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開: https://t.zsxq.com/qFiUFMV 本站qq群704220115。加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【机器学习】用PyCaret创建整个机器学习管道的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时光手帐怎么修改作品 时光手帐修改作品封
- 下一篇: ie浏览器剪贴板操作警告弹窗关闭方法