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