AutoML 會成為機器學習世界的主流嗎?
- 2019 年 10 月 4 日
- 筆記
本文轉載自:讀芯術(AI_Discovery)
自動化機器學習(AutoML)如今已經成為一個相當有趣且重要的話題。本文將對AutoML做一個簡要的解釋,論證它的合理性和可用性,介紹幾個關於AutoML的現代工具,並討論AutoML的未來和方向。


什麼是自動化機器學習?
自動化機器學習並不是自動化數據科學。雖然兩者存在重疊,但是機器學習只是數據科學工具包中眾多工具之一,它的使用實際上並沒有考慮到所有數據科學任務。例如,如果預測是數據科學任務的一部分,那麼機器學習將是一個有用的組件;但是,機器學習可能根本不適用於描述性分析任務。
即使對於預測性任務,數據科學也比實際的預測性建模包含更多的內容。數據科學家Sandro Saita在討論AutoML和自動化數據科學之間的潛在混淆時,曾說過:
這種誤解來自於整個數據科學過程(例如CRISP-DM)與數據準備(特徵提取等)子任務以及建模(演算法選擇、超參數調整等)之間的混淆,我稱之為機器學習…以及我稱之為機器學習的建模(演算法選擇、超參數調整等)之間的混淆。 當你閱讀有關自動化數據科學和數據科學競賽工具的新聞時,沒有行業經驗的人可能會感到困惑,認為數據科學只是建模,可以完全自動化。
此外,數據科學家和自動化機器學習的領先擁護者Randy Olson指出,有效的機器學習設計要求我們:
· 不斷地調整模型的超參數
· 不斷地嘗試多種模型
· 不斷地為數據探索特徵表示法
考慮到以上所有因素,如果我們把AutoML看作是演算法選擇、超參數調整、迭代建模和模型評估的任務,我們就可以定義AutoML是什麼,但不會有完全一致的意見,不過,這足以讓我們順利地開始進行下一步工作了。

為什麼需要它?
雖然我們已經完成了定義概念的工作,但AutoML有什麼作用呢?讓我們來看看為什麼機器學習很困難。

人工智慧研究員和斯坦福大學在讀博士S.ZaydEnam在一篇題為「為什麼機器學習很難」的部落格文章中寫道:
機器學習仍然比較難。毫無疑問,通過研究推進機器學習演算法的科學是困難的。它需要創造性、實驗性和韌性。即便為新的應用程式良好運行實現了現有的演算法和模型,機器學習仍然是一個難題。
注意,雖然Enam主要指的是機器學習研究,但也涉及到用例中現有演算法的實現。
Enam繼續闡述機器學習的困難,並重點介紹演算法的性質: 這個困難的一個方面涉及到建立一種直覺,能夠正確選擇優先使用哪種工具來解決問題。這需要了解可用的演算法和模型,以及每個演算法和模型的權衡和約束。 …… 困難在於機器學習是一個基本上很難調試的問題。在兩種情況下會進行機器調試:1)演算法不起作用,2)演算法工作得不好。……很少有一演算法一次就起作用的,因此大多數時間都花在構建演算法上。
然後,Enam從演算法研究的角度對這個框架問題進行了詳細的闡述。如果一個演算法不起作用,或者做得不夠好,並且選擇和重新編譯的過程是迭代的,這就可以使用自動化,因此可以使用自動化機器學習。
之前曾有人試圖捕捉AutoML的本質,如下所示:
如果,正如Sebastian Raschka所描述的那樣,電腦編程是關於自動化的,而機器學習是關於自動化的,那麼自動化機器學習就是「自動化自動化自動化的自動化」。這裡:編程通過管理死記硬背的任務來減輕我們的負擔;機器學習允許電腦學習如何最好地執行任務。自動化機器學習允許電腦學習如何優化學習如何執行這些死記硬背的操作結果。 這是一個非常強大的想法;雖然我們以前需要擔心參數和超參數的調整,但是自動化機器學習系統可以通過多種不同的可能方法來學習優化這些參數和超參數的最佳方法。
AutoML的基本原理源於這樣一個想法:如果必須使用各種演算法和許多不同的超參數配置來構建機器學習模型,那麼這個模型構建可以自動化,模型性能和精度的比較也可以自動化。
很簡單,對吧?

比較不同的自動化機器學習工具
既然我們了解了什麼是AutoML,以及它的作用,我們如何實現呢?下面是一些當代Python AutoML工具的概述和比較,這些工具採用不同的方法,試圖實現與機器學習過程自動化相同的目標。
Auto-sklearn
Auto sklearn是「一個自動化機器學習工具包和一個scikit-learn評估工具的替代品」,它也恰好是kdruggets最近的自動化數據科學和機器學習部落格競賽的贏家。

auto-sklearn使機器學慣用戶從演算法選擇和超參數調整中解放出來。它利用了貝葉斯優化、元學習和集成構造的最新優勢。
正如上述,auto-sklearn通過貝葉斯優化來執行超參數優化,然後重複以下步驟:
· 建立概率模型,以捕捉超參數設置與其性能之間的關係。
· 使用該模型選擇有用的超參數設置,然後通過權衡勘探(在模型不確定的部分空間中搜索)和開發(聚焦於預計性能良好的部分空間)來嘗試下一步。
· 使用這些超參數設置運行機器學習演算法。
對該過程的進一步解釋如下:
這一過程可以概括為聯合選擇演算法、預處理方法及其超參數:分類器/回歸器和預處理方法的選擇是頂級的、分類的超參數,並且根據它們的設置,所選方法的超參數變靈活。然後,可以使用處理這種高維條件空間的貝葉斯優化方法搜索組合空間;使用基於隨機森林的SMAC,這已被證明對這種情況最有效。
就實用性而言,由於Auto-sklearn是scikit-learn估算器的替代品,因此需要使用scikit learn的功能性安裝。Auto-sklearn還支援通過共享文件系統上的數據共享來並行執行,並且可以利用Scikit-Learn的模型持久性。根據作者的觀點,有效地使用Auto-sklearn替換估計量需要以下4行程式碼,以便獲得機器學習pipeline:
import autosklearn.classification
cls = autosklearn.classification.AutoSklearnClassifier()
cls.fit(X_train, y_train)
y_hat = cls.predict(X_test)
使用mnist數據集的auto sklearn的更穩定示例如下:
import autosklearn.classificationimport sklearn.cross_validationimport sklearn.datasetsimport sklearn.metrics
digits = sklearn.datasets.load_digits()
X = digits.data
y = digits.target
X_train, X_test, y_train, y_test = sklearn.cross_validation.train_test_split(X, y, random_state=1)
automl = autosklearn.classification.AutoSklearnClassifier()
automl.fit(X_train, y_train)
y_hat = automl.predict(X_test)
print("Accuracy score", sklearn.metrics.accuracy_score(y_test, y_hat))
另外值得注意的是,Auto Sklearn贏得了Chalearn AutoML挑戰賽的Auto和Tweakaton賽道。Auto-sklearn可在其官方Github存儲庫(https://github.com/automl/auto-sklearn)中獲得。
TPOT
TPOT被「推銷」為「你的數據科學助手」(請注意,它不是「你的數據科學替代品」)。它是一個python工具,「使用基因編程自動創建和優化機器學習pipeline」。TPOT和auto-sklearn一樣,與scikit-learn一起工作,將自己描述為scikit-learn包裝器。
正如本文前面所提到的,2個突出顯示的項目使用不同的方法來實現類似的目標。雖然這兩個項目都是開源的,用python編寫,旨在通過AutoML簡化機器學習過程,但與使用貝葉斯優化的auto-sklearn相比,TPOT的方法是基於遺傳編程的。
然而,雖然方法不同,但結果是相同的:自動超參數選擇,用各種演算法建模,以及探索許多特徵表示,都會實現迭代模型構建和模型評估。

TPOT的一個好處是,它以scikit學習pipeline的形式,為性能最佳的模型生成可運行的獨立python程式碼。然後,可以修改或檢查該程式碼,以獲得更多的洞察力,從而有效地充當起點,而不是僅僅作為最終產品。
TPOT在MNIST數據上運行的示例如下:
from tpot import TPOTClassifierfrom sklearn.datasets import load_digitsfrom sklearn.model_selection import train_test_split
digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, train_size=0.75, test_size=0.25)
tpot = TPOTClassifier(generations=5, population_size=20, verbosity=2)
tpot.fit(X_train, y_train)
print(tpot.score(X_test, y_test))
tpot.export('tpot-mnist-pipeline.py')
本次運行的結果是一條達到98%測試精度的pipeline,同時將所述pipeline的python程式碼導出到tpot-mnist-pipeline.py文件,如下所示:
import numpy as np
from sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.pipeline import make_pipeline
# NOTE: Make sure that the class is labeled 'class' in the data file
tpot_data = np.recfromcsv('PATH/TO/DATA/FILE', delimiter='COLUMN_SEPARATOR')
features = tpot_data.view((np.float64, len(tpot_data.dtype.names)))
features = np.delete(features, tpot_data.dtype.names.index('class'), axis=1)
training_features, testing_features, training_classes, testing_classes = train_test_split(features, tpot_data['class'], random_state=42)
exported_pipeline = make_pipeline(
KNeighborsClassifier(n_neighbors=3, weights="uniform"))
exported_pipeline.fit(training_features, training_classes)
results = exported_pipeline.predict(testing_features)
TPOT可以通過其官方Github報告獲得。
當然,以上不是唯一可用的AutoML工具。還有Hyperopt(Hyperopt- sklearn)、Auto-WEKA和Spearmint。可以預計的是,在接下來的幾年裡,會有許多其他的項目產生,包括研究和專於工業的項目。

自動化機器學習的未來
AutoML從此去向何方?
自動化機器學習就其本身而言將會漸漸地變得十分重要。對局外人來說,自動化機器學習可能不像深度神經網路那麼性感,它將開始在ML、AI和數據科學領域產生深遠的影響。
Randy Olson在最近的一次採訪中詳細地提到了以下幾點:
在不久的將來,自動機器學習(automl)會替代機器學習模型構建過程:一旦數據集採用(相對)乾淨的格式,AutoMlL系統將能夠設計和優化機器學習pipeline,速度超過99%的人。……然而,我可以自信地預測AutoML系統將成為機器學習世界的主流……
但是AutoML能否取代資料庫科學家?Randy繼續說到:
我不認為AutoML的目的是取代數據科學家,就像智慧程式碼自動完成工具而不會取代電腦程式設計師一樣。相反,對我來說,automl的目的是讓數據科學家從重複和耗時的任務(例如,機器學習ppipeline設計和超參數優化)中解脫出來,這樣他們就可以更好地將時間花在更難自動化的任務上。
他的觀點得到了Auto-sklearn開發者的認同:
自動化機器學習的所有方法都是為了支援數據科學家而不是代替他們。這樣的方法可以使數據科學家擺脫那些機器更好地解決棘手而複雜的任務(如超參數優化)。但是分析和得出結論仍然需要由人類專家來完成——特別是那些了解應用領域的數據科學家仍然非常重要。
所以這聽起來很令人鼓舞:數據科學家不會被取代,且AutoML可以幫助完成工作。這並不是說AutoML已經完善了。當被問及是否可以做出任何改進時,Auto-sklearn小組說:
雖然有幾種方法可以調整機器學習pipeline的超參數,但到目前為止,關於新的pipeline構建塊方面的工作很少。自動sklearn以固定順序使用一組預定義的預處理器和分類器。用有效的方法來設計新的pipeline是有益的。當然,我們可以繼續這一思路,並嘗試像最近幾篇論文中所做的那樣自動發現新演算法,例如通過梯度下降來學習梯度下降。
AutoML的未來究竟是什麼?很難確定。然而,毫無疑問,它正在走向某個地方,而且速度可能很快。雖然自動化機器學習的概念可能不是所有數據科學家目前都熟悉,但現在似乎是深入了解的好時機。畢竟,如果你能更早就開始了解AutoML的好處,並在技術浪潮中乘風破浪,你不僅要在不確定的未來努力確保你的工作,你還要學習如何利用同樣的技術來幫助你現在更好地完成工作。