如何使用Auto-Sklearn和Auto-PyTorch實(shí)現(xiàn)自動(dòng)化機(jī)器學(xué)習(xí)
譯文【51CTO.com快譯】引言
如今,機(jī)器學(xué)習(xí)(ML)正在廣泛地影響著商業(yè)、工程、以及研究等領(lǐng)域。通常,機(jī)器學(xué)習(xí)水平的進(jìn)步,與軟件和自動(dòng)化的深入迭代有著密切的關(guān)系。只要人類的某項(xiàng)活動(dòng),需要依賴計(jì)算機(jī)去進(jìn)行重復(fù)性和判斷性的處理,我們就可以通過(guò)機(jī)器學(xué)習(xí)來(lái)執(zhí)行與實(shí)現(xiàn)。當(dāng)然,面對(duì)各種不確切的待解決問(wèn)題,我們需要通過(guò)定義搜索空間、以及具體的學(xué)習(xí)算法,來(lái)訓(xùn)練計(jì)算機(jī)去自行判定與解決。
目前,機(jī)器學(xué)習(xí)已經(jīng)憑借著有效的深度學(xué)習(xí),進(jìn)入了2.0的時(shí)代。它們不但可以更好地預(yù)測(cè)蛋白模型的數(shù)據(jù)擬合,而且能夠在圍棋、Dota II、星際爭(zhēng)霸II等方面擊敗專業(yè)的人類玩家,以及創(chuàng)建各種十分連貫的文本和語(yǔ)音交互式響應(yīng)。您可以通過(guò)鏈接,進(jìn)一步了解機(jī)器學(xué)習(xí)對(duì)于不同行業(yè)的影響。當(dāng)然,這些也都離不開(kāi)各種被稱為AutoML的開(kāi)源工具、以及將ML進(jìn)行實(shí)際應(yīng)用的優(yōu)秀實(shí)踐。
什么是AutoML?
作為一大類技術(shù)和工具,AutoML可以被用于各種自動(dòng)化的搜索與學(xué)習(xí)場(chǎng)景中。例如,我們將貝葉斯優(yōu)化應(yīng)用于統(tǒng)計(jì)學(xué)習(xí)算法的超參數(shù)(hyperparameter),或是將深度學(xué)習(xí)模型運(yùn)用于神經(jīng)架構(gòu)的搜索。這些多樣化的生態(tài)系統(tǒng),目前已被編錄到了AutoML.ai中。其中,最著名的AutoML軟件包之一便是:Auto-SciKit-Learn(或稱Auto-Sklearn)。它榮獲了2014年至2016年的ChaLearn AutoML挑戰(zhàn)賽的獲勝者。
Auto-Sklearn是由德國(guó)的自動(dòng)化機(jī)器學(xué)習(xí)研究小組所開(kāi)發(fā)。作為一個(gè)Python包,Auto-Sklearn的構(gòu)建密切遵循了SciKit-Learn的使用模式,這也是它得名為“Auto-SciKit-Learn”的原因。
除了Auto-Sklearn,F(xiàn)reiburg-Hannover的AutoML小組還開(kāi)發(fā)了Auto-PyTorch庫(kù)。在下面的簡(jiǎn)單示例中,我們將使用這兩個(gè)代碼庫(kù),作為進(jìn)入AutoML的切入點(diǎn)。
AutoML的演示
首先,我們來(lái)設(shè)置所需要的軟件包和依賴項(xiàng)。在此,我們使用Python 3的virtualenv,來(lái)管理演示項(xiàng)目的虛擬環(huán)境。當(dāng)然,您也可以使用Anaconda(譯者注:一種開(kāi)源的Python發(fā)行版本)和pip,它們的工作方式都是類似的。
下面是在Ubuntu等基于Unix的系統(tǒng)上,設(shè)置運(yùn)行環(huán)境的各種命令。如果您使用的是Windows,則可以從Anaconda提示符中通過(guò)輸入命令,來(lái)設(shè)置環(huán)境。雖然Auto-Sklearn的文檔建議用戶,從它們的requirements.txt依賴文件處開(kāi)始安裝,但是就本例中的代碼而言,并不需要如此。
- # create and activate a new virtual environment virtualenv automl --python=python3 source automl/bin/activate
- # install auto-sklearn pip install auto-sklearn
值得注意的是,如果您對(duì)兩個(gè)AutoML庫(kù)使用相同的環(huán)境,那么可能會(huì)發(fā)生沖突。因此我們需要為Auto-PyTorch創(chuàng)建第二個(gè)環(huán)境。而且該環(huán)境中的Python應(yīng)不低于3.7版本。
- deactivate virtualenv autopt –-python=python3.7 source autopt/bin/activate # install auto-pytorch from the github repo git clone https://github.com/automl/Auto-PyTorch.git cd Auto-PyTorch pip install -e . pip install numpy==1.20.0 pip install ipython
我們?cè)谶\(yùn)行上述pip install -e,及其后面的兩個(gè)install語(yǔ)句時(shí),可能會(huì)碰到如下奇怪錯(cuò)誤。經(jīng)研究,我們可以通過(guò)將NumPy版本升級(jí)到1.20.0,予以修復(fù)。
- ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject
如果您想為該項(xiàng)目做出貢獻(xiàn),或想查看最新的運(yùn)行代碼,請(qǐng)查閱如下開(kāi)發(fā)分支。
- # (optional) git checkout development # make sure to switch back to the primary branch for the tutorial git checkout master
由于本示例的其余代碼均使用Python來(lái)編寫(xiě),因此請(qǐng)您啟用Python提示符、Jupyter筆記本或文本編輯器。
本示例將包含使用標(biāo)準(zhǔn)的SciKit-Learn、Auto-Sklearn和Auto-PyTorch分類器(classifier)的基本分類演示。我們將針對(duì)每個(gè)場(chǎng)景,使用SciKit-Learn中的單一內(nèi)置數(shù)據(jù)集。而每個(gè)演示都會(huì)通過(guò)共享代碼的方式,來(lái)導(dǎo)入通用的依賴項(xiàng),并加載和拆分對(duì)應(yīng)的數(shù)據(jù)集。
- import time import sklearn import sklearn.datasets
- #** load and split data ** data, target = sklearn.datasets.load_iris(return_X_y=True)
- # split n = int(data.shape[0] * 0.8)
- train_x = data[:n] train_y = target[:n] test_x = data[n:] test_y = target[n:]
上面有關(guān)設(shè)置數(shù)據(jù)集的代碼,將被用于本示例中的每個(gè)演示模塊上。
為了節(jié)省時(shí)間,我們使用了小型的“iris”數(shù)據(jù)集(其中包括:150個(gè)樣本、4個(gè)特征和3個(gè)標(biāo)簽類別)。您完全可以在閱讀完本示例后,去試用更為復(fù)雜的數(shù)據(jù)集。
sklearn.datasets的其他分類數(shù)據(jù)集,則包括:糖尿病(load_diabetes)數(shù)據(jù)集和數(shù)字?jǐn)?shù)據(jù)集(load_digits)。其中,糖尿病數(shù)據(jù)集帶有569個(gè)樣本,每個(gè)樣本具有30個(gè)特征和2個(gè)標(biāo)簽類別;而數(shù)字?jǐn)?shù)據(jù)集則帶有1797個(gè)樣本,每個(gè)樣本具有64個(gè)特征(對(duì)應(yīng)著8x8的圖像),以及10個(gè)標(biāo)簽類別。
在開(kāi)始使用sklearn的AutoML分類器之前,讓我們通過(guò)默認(rèn)的設(shè)置,從vanilla sklearn中訓(xùn)練各種標(biāo)準(zhǔn)化的分類器。雖然我們有許多可供選擇的方式,但是我們?cè)诖藭?huì)沿用k最近鄰(k-nearest neighbors)分類器、支持向量機(jī)(support vector machine)分類器、以及多層感知器(multilayer perceptron)。
- # import classifiers from sklearn.svm import SVC from sklearn.neural_network import MLPClassifier from sklearn.neighbors import KNeighborsClassifier
- # instantiate with default parameters knn = KNeighborsClassifier() mlp = MLPClassifier() svm = SVC()
SciKit-Learn通過(guò)使用友好的擬合/預(yù)測(cè)(fit/predict)API,使得訓(xùn)練模型的過(guò)程變得輕而易舉。同時(shí),Auto-Sklearn和Auto-PyTorch兩個(gè)軟件包也保留了相同的API,這使得三者中的任一訓(xùn)練模型,不但相似,而且易用。
- t0 = time.time() knn.fit(train_x, train_y) mlp.fit(train_x, train_y) svm.fit(train_x, train_y) t1 = time.time()
同樣,各種模型的評(píng)估也比較簡(jiǎn)單。SciKit-Learn分類模型提供一種預(yù)測(cè)方法,可被用于接收輸入數(shù)據(jù),預(yù)測(cè)標(biāo)簽,進(jìn)而通過(guò)將其傳遞給sklearn.metrics.accuracy_score,來(lái)計(jì)算準(zhǔn)確度。
下面的代碼可使用k最近鄰、支持向量機(jī),以及在最后一個(gè)代碼段中訓(xùn)練的多層感知器分類器,來(lái)計(jì)算保留測(cè)試集的各種預(yù)測(cè)和預(yù)測(cè)精度。
- knn_predict = knn.predict(test_x) train_knn_predict = knn.predict(train_x)
- svm_predict = svm.predict(test_x) train_svm_predict = svm.predict(train_x)
- mlp_predict = mlp.predict(test_x) train_mlp_predict = mlp.predict(train_x)
- knn_accuracy = sklearn.metrics.accuracy_score(test_y, knn_predict) train_knn_accuracy = sklearn.metrics.accuracy_score(train_y,train_knn_predict)
- svm_accuracy = sklearn.metrics.accuracy_score(test_y, svm_predict) train_svm_accuracy = sklearn.metrics.accuracy_score(train_y,train_svm_predict)
- mlp_accuracy = sklearn.metrics.accuracy_score(test_y, mlp_predict) train_mlp_accuracy = sklearn.metrics.accuracy_score(train_y,train_mlp_predict)
- print(f"svm, knn, mlp test accuracy: {svm_accuracy:.4f}," \ f"{knn_accuracy:.4}, {mlp_accuracy:.4}") print(f"svm, knn, mlp train accuracy: {train_svm_accuracy:.4f}," \ f"{train_knn_accuracy:.4}, {train_mlp_accuracy:.4}") print(f"time to fit: {t1-t0}")
iris數(shù)據(jù)集上的Sklearn分類器
這些模型對(duì)于iris訓(xùn)練數(shù)據(jù)集雖然十分有效,但是它們?cè)谟?xùn)練集和測(cè)試集之間仍存在這顯著的差距。
下面,讓我們使用來(lái)自autosklearn.classification的AutoSKlearnClassifier類,對(duì)多種類型的機(jī)器學(xué)習(xí)模型,執(zhí)行超參數(shù)的搜索,并保留其中最適合的集合。如下代碼段所示,在引入通用import,并設(shè)置訓(xùn)練和測(cè)試數(shù)據(jù)集的拆分之后,我們需要導(dǎo)入并實(shí)例化AutoML分類器。
- import autosklearn from autosklearn.classification import AutoSklearnClassifier as ASC
- classifier = ASC() classifier.time_left_for_this_task = 300
- t0 = time.time() classifier.fit(train_x, train_y) t1 = time.time()
- autosk_predict = classifier.predict(test_x) train_autosk_predict = classifier.predict(train_x)
- autosk_accuracy = sklearn.metrics.accuracy_score( \ test_y, autosk_predict \ ) train_autosk_accuracy = sklearn.metrics.accuracy_score( \ Train_y,train_autosk_predict \ )
- print(f"test accuracy {autosk_2_accuracy:.4f}") print(f"train accuracy {train_autosk_2_accuracy:.4f}") print(f"time to fit: {t1-t0}")
iris數(shù)據(jù)集上的Auto-Sklearn分類器集成
如果您不去設(shè)置time_left_for_this_task的默認(rèn)值(3600秒,即一小時(shí)),那么帶有AutoSklearnClassifier的fit方法,運(yùn)行起來(lái)非常耗時(shí)。顯然,這對(duì)于簡(jiǎn)單的iris數(shù)據(jù)集來(lái)說(shuō),是不可接受的。為此,該軟件包的配套文檔有提到,在初始化分類器對(duì)象時(shí),時(shí)間限制應(yīng)當(dāng)被設(shè)置為輸入?yún)?shù)。
當(dāng)然,您也可以在啟用了交叉驗(yàn)證的情況下,去運(yùn)行fit方法。為此,您需要使用refit方法、最佳模型、以及超參數(shù),在整個(gè)訓(xùn)練數(shù)據(jù)集上進(jìn)行再次訓(xùn)練。而在具體實(shí)踐中,我們發(fā)現(xiàn),與默認(rèn)設(shè)置相比,在使用交叉驗(yàn)證和refit時(shí),測(cè)試集的準(zhǔn)確率會(huì)從80%略升至86.67%(請(qǐng)參見(jiàn)下表)。
值得注意的是,在使用了predict方法去擬合AutoSklearnClassifier對(duì)象之后,我們的推理過(guò)程,會(huì)使用在AutoML超參數(shù)搜索期間,找到的最佳模型集合。
最后,讓我們來(lái)討論另一個(gè)適合深度學(xué)習(xí)的AutoML包:Auto-PyTorch。與Auto-Sklearn類似,Auto-PyTorch非常容易上手。在運(yùn)行如下代碼段之前,請(qǐng)切換到Auto-PyTorch環(huán)境,以確保有合適的依賴項(xiàng)可用。
- import autoPyTorch from autoPyTorch import AutoNetClassification as ANC
- model = ANC(max_runtime=300, min_budget=30, max_budget=90, cuda=False)
- t0 = time.time() model.fit(train_x, train_y, validation_split=0.1) t1 = time.time()
- auto_predict = model.predict(test_x) train_auto_predict = model.predict(train_x)
- auto_accuracy = sklearn.metrics.accuracy_score(test_y, auto_predict) train_auto_accuracy = sklearn.metrics.accuracy_score(train_y, train_auto_predict)
- print(f"auto-pytorch test accuracy {auto_accuracy:.4}") print(f"auto-pytorch train accuracy {train_auto_accuracy:.4}")
在導(dǎo)入常用的imports,并拆分了數(shù)據(jù)之后,您可以看到:
iris數(shù)據(jù)集上的Auto-PyTorch分類器
由上述結(jié)果可知,Auto-PyTorch在擬合iris數(shù)據(jù)集方面十分高效,產(chǎn)生訓(xùn)練和測(cè)試的準(zhǔn)確度可達(dá)90秒。這比我們之前訓(xùn)練的自動(dòng)化SciKit-Learn分類器,以及具有默認(rèn)參數(shù)的標(biāo)準(zhǔn)化sklearn分類器,都要好許多。
小結(jié)
總的說(shuō)來(lái),AutoML的價(jià)值主要源于超參數(shù)搜索的自動(dòng)化方面。AutoML額外的抽象層和自動(dòng)化超參數(shù)搜索,會(huì)提高經(jīng)典的數(shù)據(jù)科學(xué)、以及機(jī)器學(xué)習(xí)工作流的實(shí)用性、性能和效率。只要使用得當(dāng),AutoML工具不僅能夠提高應(yīng)用項(xiàng)目的性能,而且可以降低超參數(shù)的冗長(zhǎng),讓架構(gòu)搜索更具成本效益。
目前,諸如Auto-Sklearn、Auto-PyTorch、Auto-WEKA等AutoML軟件包,可以成為任何機(jī)器學(xué)習(xí)或數(shù)據(jù)科學(xué)工具的有力補(bǔ)充。其中,Auto-PyTorch已經(jīng)獲得了Apache 2.0的許可證,而Auto-Sklearn也可以使用BSD 3-Clause的許可證。當(dāng)然,為了讓這兩個(gè)軟件包能夠正常工作,我們需要將NumPy升級(jí)到1.20.0,以及其他各種小修小補(bǔ)。
原文標(biāo)題:AutoML: Using Auto-Sklearn and Auto-PyTorch,作者:Kevin Vu
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】