自动化机器学习(二)自动构建机器学习流水线
文章目錄
- 技術介紹
- 核心技術棧
- 實現
- 數據
- 實現
- 類庫加載與數據讀取
- 參數
- 方法:
- 總結
技術介紹
自動化機器學習(一)超參數自動優化
自動化機器學習就是能夠自動建立機器學習模型的方法,其主要包含三個方面:方面一,超參數優化;方面二,自動特征工程與機器學習算法自動選擇;方面三,神經網絡結構搜索。本文側重于方面二,我們將使用TPOT完成自動特征工程與機器學習算法自動選擇。
在機器學習中,模型本身的參數是可以通過訓練數據來獲取的,這些參數屬于算法的普通參數,通過數據訓練獲得算法合適的參數,構建強大的模型本身就是機器學習的核心目標。但是機器學習算法本身還存在在超參數,超參數就是那些需要科學家手動設置的參數,如SVM的核函數,Lasso的alpha,決策樹的最大深度與分支條件,隨機森林的子采樣率和決策樹類型等等等等。如何對這些超參數進行自動優化,而非手動調節正是自動化機器學習的第一步。對于超參數的優化我們可以將其視作特殊的非凸函數來進行優化,不顧我們也可以更進一步從更高的層次了來審視機器學習。
正常的機器學習流程應該包括數據讀取-數據處理-特征構建-特征選擇-模型選擇-超參數優化-(集成學習)等等部分,而且大部分情況下其中的多個部分都需要循環往替,不斷更新,最終得到一個不錯的機器學習流水線(或者說管道),而本文側重的的就是這一點,本文的主要使用工具則是tpot。
TPOT是一種基于遺傳算法優化機器學習管道(pipeline)的Python自動機器學習工具。簡單來說,就是TPOT可以智能地探索數千個可能的pipeline,為數據集找到最好的pipeline,從而實現機器學習中最乏味的部分。而總的來說,TPOT可以自動地完成特征工作(特征選擇,特征預處理,特征構建等),同時也可以進行模型的選擇和參數的調優。
核心技術棧
- tpot
- xgboost
- lughtgbm
- scikit-learn
實現
數據
這里我們的數據集使用的是
該數據的下載可以前往http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv
該數據為UCI的紅酒質量數據集,標簽為分數(整數),因此既可可用于回歸,也可用于分類。
AutoML算法并不像在數據集中擬合一個模型那樣簡單。他們正在考慮在具有多個預處理步驟(缺失值插補,縮放,PCA,特征選擇等)的管道中使用多種機器學習算法(隨機森林,線性模型,SVM等),所有模型的超參數和預處理步驟,以及在管道中集成或堆疊算法的多種方法。
因此,TPOT需要花費一些時間才能在較大的數據集上運行,但重要的是要弄清原因。使用默認的TPOT設置(100個世代,人口總數為100),TPOT將在完成之前評估10,000個管道配置。為了將這個數字放在上下文中,請考慮針對機器學習算法的10,000個超參數組合進行網格搜索,以及該網格搜索將花費多長時間。這是10,000個模型配置,需要進行10倍交叉驗證才能進行評估,這意味著可以在一個網格搜索中對訓練數據進行擬合并評估大約100,000個模型。即使對于像決策樹這樣的簡單模型,這也是一個耗時的過程。
典型的TPOT運行將需要數小時至數天才能完成(除非這是一個很小的數據集),但是您始終可以在運行過程中中途中斷運行,并查看迄今為止的最佳結果。TPOT還提供了一個warm_start參數,可讓您從中斷處重新開始TPOT運行。不過由于此處更重在演示,因此將不會運行過長的時間。
實現
類庫加載與數據讀取
from tpot import TPOTClassifier from sklearn.model_selection import train_test_split import pandas as pd import numpy as np# NOTE: Make sure that the outcome column is labeled 'target' in the data file tpot_data = pd.read_csv('/home/fonttian/Data/dataset/wine/wine.csv', dtype=np.float64) labels = tpot_data['quality'] tpot_data = tpot_data.drop('quality', axis=1)X_train, X_test, y_train, y_test = \train_test_split(tpot_data.values, labels.values, train_size=0.75, test_size=0.25,random_state=42) /home/fonttian/anaconda3/envs/keras/lib/python3.8/site-packages/tpot/builtins/__init__.py:36: UserWarning: Warning: optional dependency `torch` is not available. - skipping import of NN models.warnings.warn("Warning: optional dependency `torch` is not available. - skipping import of NN models.")在我們執行玩代碼之后會出現一個提示,大體意思為由于沒有安裝PyTorch因此將不會調用神經網絡模塊進行自動化機器學習。
而在代碼的最后我們使用了skleran中的數據分割算法,將數據集分給為3:1兩份,前者用于訓練,后者用于測試。
參數
TPOT接口設計時目標為與scikit-learn盡可能相似。TPOT可以像任何常規Python模塊一樣導入。要使用TPOT,只需要下列簡單的代碼即可。
而由于tpot是基于遺傳算法編寫的自動化機器學習項目,因此我們在創建tpot模型時,需要傳入的參數全部都是遺傳算法所需的參數。下列參數的具體解釋如下:
- generations: int, optional (default=100),運行管道優化過程的迭代次數。一定是正數。
- population_size: int, optional (default=100),在每一代遺傳中保留的個體數。一定是正數。
- cv: 交叉驗證的折數。一定是正數。
- random_state: 隨機數種子,用于控制隨機數
- verbosity: 打印的詳細程度,0,完全不打印,1,少量,2,更多信息以及進度條,3,所有信息以及進度條
除此之外還有幾個比較重要的參數,如warm_start,是否調用之前fit的結果,繼續進行訓練。以及其他幾個常用參數:
- offspring_size:默認一百,每次遺傳中產生的后代數量。一定是正數。
- mutation_rate:變異率,默認0.9,一般不需要改動。
- crossover_rate:交叉率,默認0.1,一般不需要改動。
- scoring:評價函數,內部使用
- subsample: 訓練過程中的采樣比,默認為1,即百分之百。
- n_jobs:使用線程數,,默認為1。-1表示使用盡可能多的內容,-2表示將使用出一個以外的所有CPU
- max_time_mins:多少分鐘優化管道,默認None。設置為None,則不進行時間限制。
- max_eval_time_mins:多少分鐘評估管道,默認5,也就是五分鐘。
- early_stop:早停,比較常見的參數,當多少個回合損失基本不變時,停止訓練。
- config_dict: Python dictionary, string, or None, optional (default=None),用于定制TPOT在優化過程中搜索的操作符和參數的配置字典。不過由于基本上都是直接用自帶的,這個參數意義不大。如果需要使用可以參考該鏈接:https://epistasislab.github.io/tpot/using/#built-in-tpot-configurations
方法:
至于方法則更為簡單,其只有四個方法可以調用:
- fit(features, target, sample_weight=None, groups=None),在給定的訓練數據上運行TPOT優化過程。
- predict(features),使用優化的管道來預測測試集的目標值。
- score(testing_features, testing_target),使用用戶指定的評分函數在給定的測試數據上返回優化的管道的得分。
- export(output_file_name),將優化后的最佳機器學習管道導出為Python代碼。
從上面的執行結果我們可以看到,tpot確實在訓練過程中展示出來對應的結果,以及有一個進度條。但是也正如其文檔所說,當時間較短時,tpot得到的結果往往會很差,連續訓練幾個小時甚至幾天都是非常正常的情況。同時要注意的是,雖然訓練之后會默認打印最佳參數,按時很顯然這并不是能夠接受的最好方式。因此我們還是使用export方法將優化后的最佳結果直接輸出為Python代碼比較好。下面就是輸出的結果:
# export code pipeline_optimizer.export('tpot_exported_pipeline.py') import numpy as np import pandas as pd from sklearn.decomposition import PCA from sklearn.ensemble import ExtraTreesClassifier, RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.pipeline import make_pipeline, make_union from tpot.builtins import StackingEstimator from tpot.export_utils import set_param_recursive# NOTE: Make sure that the outcome column is labeled 'target' in the data file tpot_data = pd.read_csv('PATH/TO/DATA/FILE', sep='COLUMN_SEPARATOR', dtype=np.float64) features = tpot_data.drop('target', axis=1) training_features, testing_features, training_target, testing_target = \train_test_split(features, tpot_data['target'], random_state=42)# Average CV score on the training set was: 0.6822838214783822 exported_pipeline = make_pipeline(PCA(iterated_power=5, svd_solver="randomized"),StackingEstimator(estimator=ExtraTreesClassifier(bootstrap=False, criterion="entropy", max_features=0.7500000000000001, min_samples_leaf=4, min_samples_split=16, n_estimators=100)),StackingEstimator(estimator=RandomForestClassifier(bootstrap=True, criterion="gini", max_features=0.15000000000000002, min_samples_leaf=7, min_samples_split=15, n_estimators=100)),ExtraTreesClassifier(bootstrap=False, criterion="entropy", max_features=0.9500000000000001, min_samples_leaf=9, min_samples_split=15, n_estimators=100) ) # Fix random state for all the steps in exported pipeline set_param_recursive(exported_pipeline.steps, 'random_state', 42)exported_pipeline.fit(training_features, training_target) results = exported_pipeline.predict(testing_features)除此之外還有一個比較常用的算法為回歸器:TPOTRegressor,參數和效果與分類器的差不多,具體內容就不再贅述。
總結
tpot作為一種完全的自動化機器學習工具,其能夠從特征構建,特征處理,模型選擇,超參數優化等多個方面進行數據的優化,并最終給予我們一個最佳的機器學習管道,但是同樣其存在一定的問題,那就是效果比較差,必須訓練幾個小時甚至幾天的時間,其才能對可鞥的組合進行較好的探究,最終獲得一個較好的結果。對于專業人士而言,這時間確實有些過長了。但是極低的操作性又意味著其使用的容易,同時如果時間充裕,tpot又確實能夠做出比一般工程師更好地結果。所以其必然還是存在很大的使用空間的。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的自动化机器学习(二)自动构建机器学习流水线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用多项式特征生成与递归特征消除解决特征
- 下一篇: 自动化机器学习(三)神经网络架构搜索综述