本文將系統(tǒng)全面的介紹自動機器學習的其中一個常用框架 : TPOT,一起研習如何在 Python 中將 TPOT 用于 AutoML 和 Scikit-Learn 機器學習算法。 分類和回歸小案例,以及一些用戶手冊的介紹??靵砗托『镒右黄鹧辛暟桑?/p>
如果你在機器學習建模期間花費數小時甚至數天時間來,一直嘗試挑選最佳管道和參數的過程,那么我建議你仔細閱讀本文。
自動機器學習 (AutoML) 是指需要極少人工參與的情況下自動發(fā)現性能良好的模型用于預測建模任務的技術。
本文核心內容:
- TPOT 是一個用于 AutoML 的開源庫,具有 scikit-learn 數據準備和機器學習模型。
- 如何使用 TPOT 自動發(fā)現分類任務的最佳模型。
- 如何使用 TPOT 自動發(fā)現回歸任務的最佳模型。
TPOT簡介
Tree-based Pipeline Optimization Tool [1] , 基于樹的管道優(yōu)化工具,簡稱 TPOT,是一個用于在 Python 中執(zhí)行 AutoML 的開源庫。
TPOT 使用基于樹的結構來表示預測建模問題的模型管道,包括數據準備和建模算法以及模型超參數。它利用流行的 Scikit-Learn 機器學習庫進行數據轉換和機器學習算法,并使用遺傳編程隨機全局搜索過程來有效地發(fā)現給定數據集的性能最佳的模型管道。
… an evolutionary algorithm called the Tree-based Pipeline Optimization Tool (TPOT) that automatically designs and optimizes machine learning pipelines.
… 一種稱為基于樹的管道優(yōu)化工具 (TPOT) 的進化算法,可自動設計和優(yōu)化機器學習管道。
然后執(zhí)行優(yōu)化過程以找到對給定數據集執(zhí)行最佳的樹結構。具體來說,一種遺傳編程算法,旨在對表示為樹的程序執(zhí)行隨機全局優(yōu)化。
TPOT uses a version of genetic programming to automatically design and optimize a series of data transformations and machine learning models that attempt to maximize the classification accuracy for a given supervised learning data set.
TPOT 使用遺傳編程的一個版本來自動設計和優(yōu)化一系列數據轉換和機器學習模型,這些模型試圖最大限度地提高給定監(jiān)督學習數據集的分類精度。
下圖取自 TPOT 論文,展示了管道搜索所涉及的元素,包括數據清洗、特征選擇、特征處理、特征構建、模型選擇和超參數優(yōu)化。
TPOT 將通過智能探索數千條可能的管道來為你的數據找到最佳管道,從而自動化機器學習中最繁瑣的部分。
機器學習管道示例
接下來我們一起看看如何安裝和使用 TPOT 來找到一個有效的模型管道。
安裝和使用 TPOT
第一步安裝TPOT庫
pip install tpot
安裝后,導入庫并打印版本號以確認它已成功安裝:
# check tpot versionimport tpotprint(‘tpot: %s’ % tpot.__version__)
使用 TPOT 庫很簡單
需要創(chuàng)建 TPOTRegressor 或 TPOTClassifier 類 [2] 的實例,并做好配置后進行搜索,然后導出在數據集上找到的最佳性能的模型管道。
配置類涉及兩個主要元素。
首先是如何評估模型,例如交叉驗證方案和性能指標選擇。建議使用選擇的配置和要使用的性能指標明確指定交叉驗證類。
例如要使用 neg_mean_absolute_error 作為回歸度量,則選用 RepeatedKFold [3] 用于回歸交叉驗證。
# 定義了評價步驟cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)# 定義搜索model = TPOTRegressor(… scoring=’neg_mean_absolute_error’, cv=cv)
或者使用 accuracy 作為分類模型的評價指標,則選用 RepeatedStratifiedKFold [4] 用于分類交叉驗證。
# 定義了評價步驟cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)# 定義搜索model = TPOTClassifier(… scoring=’accuracy’, cv=cv)
作為一種進化算法,涉及到較為復雜的配置的設置,例如種群規(guī)模、要運行的代數以及潛在的交叉和突變率。前者重要地控制著搜索的范圍;如果你對進化搜索算法不熟悉,可以將后者保留設置為默認值。
例如,100 代和 5 或 10 代的適度種群規(guī)模是一個很好的起點。
# define 搜索model = TPOTClassifier(generations=5, population_size=50, …)
在搜索結束時,會找到性能最佳的管道。
此輸出最佳模型的管道可以導出為py文件,后期可以將其復制并粘貼到你自己的項目中。
# 輸出最佳模型model.export(‘tpot_model.py’)
TPOT 分類
這里使用 TPOT 來發(fā)現聲納數據集的最佳模型。
聲納數據集 [5] 是一個標準的機器學習數據集,由 208 行數據和 60 個數字輸入變量和一個具有兩個類值的目標變量組成,例如二進制分類。
使用具有三個重復分層 10 折交叉驗證的測試工具,樸素模型可以達到約 53% 的準確度。性能最佳的模型可以在相同的測試工具上實現大約 88% 的準確度。這達到了該數據集的預期性能界限。
該數據集涉及預測聲納返回是否指示巖石或礦井。
# summarize the sonar datasetfrom pandas import read_csv# load datasetdataframe = read_csv(data, header=None)# split into input and output elementsdata = dataframe.valuesX, y = data[:, :-1], data[:, -1]print(X.shape, y.shape)
導入數據集并將其拆分為輸入和輸出數據集??梢钥吹接?60 個輸入變量的 208 行數據。
首先,我們可以定義評估模型的方法,使用 RepeatedStratifiedKFold交叉驗證 。
# 定義模型評估器cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
將使用 50 個人口大小進行五折搜索,并設置 n_jobs = -1 來使用系統(tǒng)上的所有核心。
# 定義搜索model = TPOTClassifier(generations=5, population_size=50, cv=cv, scoring=’accuracy’, verbosity=2, random_state=1, n_jobs=-1)
最后,開始搜索并確保在運行結束時保存性能最佳的模型。
# 執(zhí)行搜索model.fit(X, y)# 輸出最佳模型model.export(‘tpot_sonar_best_model.py’)
這里可能需要運行幾分鐘,這里比較人性化的設置就是可以在命令行上看到一個進度條。
注意:你的結果可能會因算法或評估程序的隨機性或數值精度的差異而有所不同。在現實案例中,可以多運行幾次并比較平均結果。
將在此過程中將會輸出報告性能最佳模型的準確性。
Generation 1 – Current best internal CV score: 0.8650793650793651Generation 2 – Current best internal CV score: 0.8650793650793651Generation 3 – Current best internal CV score: 0.8650793650793651Generation 4 – Current best internal CV score: 0.8650793650793651Generation 5 – Current best internal CV score: 0.8667460317460318Best pipeline: GradientBoostingClassifier(GaussianNB(input_matrix),learning_rate=0.1, max_depth=7, max_features=0.7000000000000001,min_samples_leaf=15, min_samples_split=10, n_estimators=100, subsample=0.9000000000000001)
這里可以看到表現最好的管道達到了大約 86.6% 的平均準確率。這里接近該數據集上表現最好的模型了。
最后將性能最佳的管道保存到名為 “ tpot_sonar_best_model.py ” 的文件中。
加載數據集和擬合管道的通用代碼
# 在聲納數據集上擬合最終模型并做出預測的例子from pandas import read_csvfrom sklearn.preprocessing import LabelEncoderfrom sklearn.model_selection import RepeatedStratifiedKFoldfrom sklearn.ensemble import GradientBoostingClassifierfrom sklearn.naive_bayes import GaussianNBfrom sklearn.pipeline import make_pipelinefrom tpot.builtins import StackingEstimatorfrom tpot.export_utils import set_param_recursive# 導入數據集dataframe = read_csv(data, header=None)# 拆分為輸入變量和輸出變量data = dataframe.valuesX, y = data[:, :-1], data[:, -1]# 以盡量小的內存使用數據集X = X.astype(‘float32’)y = LabelEncoder().fit_transform(y.astype(‘str’))# 訓練集上的交叉驗證平均分數為: 0.8667exported_pipeline = make_pipeline( StackingEstimator(estimator=GaussianNB()), GradientBoostingClassifier(learning_rate=0.1, max_depth=7, max_features=0.7000000000000001, min_samples_leaf=15, min_samples_split=10, n_estimators=100, subsample=0.9000000000000001))# 修正了導出管道中所有步驟的隨機狀態(tài)set_param_recursive(exported_pipeline.steps, ‘random_state’, 1)# 訓練模型exported_pipeline.fit(X, y)# 對新數據行進行預測row = [0.0200,0.0371,0.0428,0.0207,0.0954,0.0986]yhat = exported_pipeline.predict([row])print(‘Predicted: %.3f’ % yhat[0])
TPOT 回歸
本節(jié)使用 TPOT 來發(fā)現汽車保險數據集的最佳模型。
汽車保險數據集 [6] 是一個標準的機器學習數據集,由 63 行數據組成,一個數字輸入變量和一個數字目標變量。
使用具有3 次重復的分層 10 折交叉驗證的測試工具,樸素模型可以實現約 66 的平均絕對誤差 (MAE)。性能最佳的模型可以在相同的測試工具上實現MAE約 28。這達到了該數據集的預期性能界限。
過程類似于分類。
加載數據集和擬合管道的通用代碼
# 擬合最終模型并在保險數據集上做出預測的例子from pandas import read_csvfrom sklearn.model_selection import train_test_splitfrom sklearn.svm import LinearSVR# 導入數據集dataframe = read_csv(data, header=None)# 拆分為輸入變量和輸出變量data = dataframe.values# 以盡量小的內存使用數據集data = data.astype(‘float32’)X, y = data[:, :-1], data[:, -1]# 訓練集上的交叉驗證平均分數為: -29.1476exported_pipeline = LinearSVR(C=1.0, dual=False, epsilon=0.0001, loss=”squared_epsilon_insensitive”, tol=0.001)# 修正了導出估計器中的隨機狀態(tài)if hasattr(exported_pipeline, ‘random_state’): setattr(exported_pipeline, ‘random_state’, 1)# 模型訓練exported_pipeline.fit(X, y)# 對新數據行進行預測row = [108]yhat = exported_pipeline.predict([row])print(‘Predicted: %.3f’ % yhat[0])
實戰(zhàn)案例
Pima Indians Diabetes 數據集
這里有一個 案例研究 [7] ,使用 Pima Indians Diabetes 數據集預測 5 年內糖尿病的患病率。根據這項研究,作者指出在這個問題上達到的最大準確率為 77.47% 。
在同一場景中進行自動化機器學習,看看它是如何使用 TPOT AutoML 工作的。
# import the AutoMLpackage after installing tpot.import tpot# 導入其他必要的包。from pandas import read_csvfrom sklearn.preprocessing import LabelEncoderfrom sklearn.model_selection import StratifiedKFoldfrom tpot import TPOTClassifierimport os# 導入數據file_path = ‘./pima-indians-diabetes.data.csv’df = pd.read_csv(file_path,header=None) #可以用你自己的數據集.csv文件名替換df.dtypesdf.info()# 將數據幀的值拆分為輸入和輸出特征data = df.values X, y = data[:, :-1], data[:, -1] print(X.shape, y.shape) #(768, 8 ) (768,) X = X.astype(‘float32’) y = LabelEncoder().fit_transform(y.astype(‘str’)) #模型評估定義,這里使用10倍StratifiedKFold cv = StratifiedKFold(n_splits=10) # 定義 TPOTClassifier model = TPOTClassifier(generations=5, population_size=50, cv=cv, score=’accuracy’, verbosity=2, random_state=1, n_jobs=-1) # 執(zhí)行最佳擬合搜索model.fit(X , y) # 導出最佳模型model.export(‘tpot_data.py’)
cv=10 時的最佳管線選擇
我還用 cv=5 重復了上述實驗。
# 模型評估定義,這里使用 5fold StratifiedKFold cv = StratifiedKFold(n_splits=5) # 定義 TPOTClassifier model = TPOTClassifier(generations=5, population_size=50, cv=cv, score=’accuracy’, verbosity=2, random_state=1, n_jobs=-1) # 搜索最佳擬合model.fit(X, y) # 導出最佳模型model.export(‘tpot_data.py’)
cv=5 時的最佳管線選擇
結果
使用 10 折交叉驗證時選擇的最佳管道是:
LinearSVC(input_matrix, C=5.0, dual=False, loss=squared_hinge, penalty=l1, tol=0.01)# Accuracy: 77.47%
使用 5 折交叉驗證時選擇的最佳管道是:
XGBClassifier(ExtraTreesClassifier(input_matrix, bootstrap=True, criterion=entropy, max_features=0.55, min_samples_leaf=1, min_samples_split=2, n_estimators=100), learning_rate=0.001, max_depth=10, min_child_weight=13, n_estimators=100, n_jobs=1, subsample=0.9000000000000001, verbosity=0)# Accuracy: 78.39%
TPOT和其他配置
為上述問題嘗試了 TPOT ,它僅使用默認配置。其實 AutoML TPOT 還有有許多內置配置。下面列出了這些變體:
- TPOT light:如果你希望在管道中使用簡單的運算符。此外,此配置確保這些運算符也可以快速執(zhí)行。
- TPOT MDR:如果你的問題屬于生物信息學研究領域,并且此配置非常適合全基因組關聯研究。
- TPOT sparse:如果你需要適合稀疏矩陣的配置。
- TPOT NN:如果你想利用默認 TPOT 的神經網絡估計器。此外,這些估計器是用 PyTorch 編寫的。
- TPOT cuML:如果你的數據集大小為中型或大型,并且利用 GPU 加速的估計器在有限的配置上搜索最佳管道。