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