自动化机器学习(二)自动构建机器学习流水线
文章目錄
- 技術(shù)介紹
- 核心技術(shù)棧
- 實現(xiàn)
- 數(shù)據(jù)
- 實現(xiàn)
- 類庫加載與數(shù)據(jù)讀取
- 參數(shù)
- 方法:
- 總結(jié)
技術(shù)介紹
自動化機器學習(一)超參數(shù)自動優(yōu)化
自動化機器學習就是能夠自動建立機器學習模型的方法,其主要包含三個方面:方面一,超參數(shù)優(yōu)化;方面二,自動特征工程與機器學習算法自動選擇;方面三,神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)搜索。本文側(cè)重于方面二,我們將使用TPOT完成自動特征工程與機器學習算法自動選擇。
在機器學習中,模型本身的參數(shù)是可以通過訓練數(shù)據(jù)來獲取的,這些參數(shù)屬于算法的普通參數(shù),通過數(shù)據(jù)訓練獲得算法合適的參數(shù),構(gòu)建強大的模型本身就是機器學習的核心目標。但是機器學習算法本身還存在在超參數(shù),超參數(shù)就是那些需要科學家手動設(shè)置的參數(shù),如SVM的核函數(shù),Lasso的alpha,決策樹的最大深度與分支條件,隨機森林的子采樣率和決策樹類型等等等等。如何對這些超參數(shù)進行自動優(yōu)化,而非手動調(diào)節(jié)正是自動化機器學習的第一步。對于超參數(shù)的優(yōu)化我們可以將其視作特殊的非凸函數(shù)來進行優(yōu)化,不顧我們也可以更進一步從更高的層次了來審視機器學習。
正常的機器學習流程應(yīng)該包括數(shù)據(jù)讀取-數(shù)據(jù)處理-特征構(gòu)建-特征選擇-模型選擇-超參數(shù)優(yōu)化-(集成學習)等等部分,而且大部分情況下其中的多個部分都需要循環(huán)往替,不斷更新,最終得到一個不錯的機器學習流水線(或者說管道),而本文側(cè)重的的就是這一點,本文的主要使用工具則是tpot。
TPOT是一種基于遺傳算法優(yōu)化機器學習管道(pipeline)的Python自動機器學習工具。簡單來說,就是TPOT可以智能地探索數(shù)千個可能的pipeline,為數(shù)據(jù)集找到最好的pipeline,從而實現(xiàn)機器學習中最乏味的部分。而總的來說,TPOT可以自動地完成特征工作(特征選擇,特征預(yù)處理,特征構(gòu)建等),同時也可以進行模型的選擇和參數(shù)的調(diào)優(yōu)。
核心技術(shù)棧
- tpot
- xgboost
- lughtgbm
- scikit-learn
實現(xiàn)
數(shù)據(jù)
這里我們的數(shù)據(jù)集使用的是
該數(shù)據(jù)的下載可以前往http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv
該數(shù)據(jù)為UCI的紅酒質(zhì)量數(shù)據(jù)集,標簽為分數(shù)(整數(shù)),因此既可可用于回歸,也可用于分類。
AutoML算法并不像在數(shù)據(jù)集中擬合一個模型那樣簡單。他們正在考慮在具有多個預(yù)處理步驟(缺失值插補,縮放,PCA,特征選擇等)的管道中使用多種機器學習算法(隨機森林,線性模型,SVM等),所有模型的超參數(shù)和預(yù)處理步驟,以及在管道中集成或堆疊算法的多種方法。
因此,TPOT需要花費一些時間才能在較大的數(shù)據(jù)集上運行,但重要的是要弄清原因。使用默認的TPOT設(shè)置(100個世代,人口總數(shù)為100),TPOT將在完成之前評估10,000個管道配置。為了將這個數(shù)字放在上下文中,請考慮針對機器學習算法的10,000個超參數(shù)組合進行網(wǎng)格搜索,以及該網(wǎng)格搜索將花費多長時間。這是10,000個模型配置,需要進行10倍交叉驗證才能進行評估,這意味著可以在一個網(wǎng)格搜索中對訓練數(shù)據(jù)進行擬合并評估大約100,000個模型。即使對于像決策樹這樣的簡單模型,這也是一個耗時的過程。
典型的TPOT運行將需要數(shù)小時至數(shù)天才能完成(除非這是一個很小的數(shù)據(jù)集),但是您始終可以在運行過程中中途中斷運行,并查看迄今為止的最佳結(jié)果。TPOT還提供了一個warm_start參數(shù),可讓您從中斷處重新開始TPOT運行。不過由于此處更重在演示,因此將不會運行過長的時間。
實現(xiàn)
類庫加載與數(shù)據(jù)讀取
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.")在我們執(zhí)行玩代碼之后會出現(xiàn)一個提示,大體意思為由于沒有安裝PyTorch因此將不會調(diào)用神經(jīng)網(wǎng)絡(luò)模塊進行自動化機器學習。
而在代碼的最后我們使用了skleran中的數(shù)據(jù)分割算法,將數(shù)據(jù)集分給為3:1兩份,前者用于訓練,后者用于測試。
參數(shù)
TPOT接口設(shè)計時目標為與scikit-learn盡可能相似。TPOT可以像任何常規(guī)Python模塊一樣導入。要使用TPOT,只需要下列簡單的代碼即可。
而由于tpot是基于遺傳算法編寫的自動化機器學習項目,因此我們在創(chuàng)建tpot模型時,需要傳入的參數(shù)全部都是遺傳算法所需的參數(shù)。下列參數(shù)的具體解釋如下:
- generations: int, optional (default=100),運行管道優(yōu)化過程的迭代次數(shù)。一定是正數(shù)。
- population_size: int, optional (default=100),在每一代遺傳中保留的個體數(shù)。一定是正數(shù)。
- cv: 交叉驗證的折數(shù)。一定是正數(shù)。
- random_state: 隨機數(shù)種子,用于控制隨機數(shù)
- verbosity: 打印的詳細程度,0,完全不打印,1,少量,2,更多信息以及進度條,3,所有信息以及進度條
除此之外還有幾個比較重要的參數(shù),如warm_start,是否調(diào)用之前fit的結(jié)果,繼續(xù)進行訓練。以及其他幾個常用參數(shù):
- offspring_size:默認一百,每次遺傳中產(chǎn)生的后代數(shù)量。一定是正數(shù)。
- mutation_rate:變異率,默認0.9,一般不需要改動。
- crossover_rate:交叉率,默認0.1,一般不需要改動。
- scoring:評價函數(shù),內(nèi)部使用
- subsample: 訓練過程中的采樣比,默認為1,即百分之百。
- n_jobs:使用線程數(shù),,默認為1。-1表示使用盡可能多的內(nèi)容,-2表示將使用出一個以外的所有CPU
- max_time_mins:多少分鐘優(yōu)化管道,默認None。設(shè)置為None,則不進行時間限制。
- max_eval_time_mins:多少分鐘評估管道,默認5,也就是五分鐘。
- early_stop:早停,比較常見的參數(shù),當多少個回合損失基本不變時,停止訓練。
- config_dict: Python dictionary, string, or None, optional (default=None),用于定制TPOT在優(yōu)化過程中搜索的操作符和參數(shù)的配置字典。不過由于基本上都是直接用自帶的,這個參數(shù)意義不大。如果需要使用可以參考該鏈接:https://epistasislab.github.io/tpot/using/#built-in-tpot-configurations
方法:
至于方法則更為簡單,其只有四個方法可以調(diào)用:
- fit(features, target, sample_weight=None, groups=None),在給定的訓練數(shù)據(jù)上運行TPOT優(yōu)化過程。
- predict(features),使用優(yōu)化的管道來預(yù)測測試集的目標值。
- score(testing_features, testing_target),使用用戶指定的評分函數(shù)在給定的測試數(shù)據(jù)上返回優(yōu)化的管道的得分。
- export(output_file_name),將優(yōu)化后的最佳機器學習管道導出為Python代碼。
從上面的執(zhí)行結(jié)果我們可以看到,tpot確實在訓練過程中展示出來對應(yīng)的結(jié)果,以及有一個進度條。但是也正如其文檔所說,當時間較短時,tpot得到的結(jié)果往往會很差,連續(xù)訓練幾個小時甚至幾天都是非常正常的情況。同時要注意的是,雖然訓練之后會默認打印最佳參數(shù),按時很顯然這并不是能夠接受的最好方式。因此我們還是使用export方法將優(yōu)化后的最佳結(jié)果直接輸出為Python代碼比較好。下面就是輸出的結(jié)果:
# 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,參數(shù)和效果與分類器的差不多,具體內(nèi)容就不再贅述。
總結(jié)
tpot作為一種完全的自動化機器學習工具,其能夠從特征構(gòu)建,特征處理,模型選擇,超參數(shù)優(yōu)化等多個方面進行數(shù)據(jù)的優(yōu)化,并最終給予我們一個最佳的機器學習管道,但是同樣其存在一定的問題,那就是效果比較差,必須訓練幾個小時甚至幾天的時間,其才能對可鞥的組合進行較好的探究,最終獲得一個較好的結(jié)果。對于專業(yè)人士而言,這時間確實有些過長了。但是極低的操作性又意味著其使用的容易,同時如果時間充裕,tpot又確實能夠做出比一般工程師更好地結(jié)果。所以其必然還是存在很大的使用空間的。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的自动化机器学习(二)自动构建机器学习流水线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用多项式特征生成与递归特征消除解决特征
- 下一篇: 自动化机器学习(三)神经网络架构搜索综述