自動化機器學習入門指南,來了
點擊上方“數據管道”,選擇“置頂星標”公眾號
干貨福利,第一時間送達

之前的工作中也有多少接觸過這個AutoML(Automated Machine Learning)的概念,簡單來說就是把模型開發(fā)的標準過程模塊化,都交給一些自動化的組件來完成,比如數據集的劃分、特征衍生、算法選擇、模型訓練、調優(yōu)、部署以及后續(xù)的監(jiān)控,都“一條龍”地在AutoML實現(xiàn)。
從Google Cloud繪制的AutoML的工作原理圖可以看出,我們使用者只需要給其提供數據源,以及好壞樣本(或者不需要),然后后面的一切都交給AutoML組件去完成。

? AutoML的關鍵節(jié)點
我們可以認識到AutoML大大降低了機器學習模型的開發(fā)門檻,但是我們還是需要了解這里面的原理的,這里涉及了機器學習的幾個關鍵節(jié)點的內容,需要我們特別關注。
其中最為重要的是自動化特征工程了,一般縮寫為“Auto FE”,主要是包括了預處理、特征選擇、特征提取、元學習等等的操作,把每一個環(huán)節(jié)的處理邏輯寫到腳本里,結合一些策略讓邏輯更加科學,結果更加合理。
第二個就是自動化模型選擇,也叫Automated Model Selection,簡稱AMS,就是根據實際的數據來選擇合適的算法。因為大多數的算法都是有超參數的,這時候AutoML是需要進行自動化的超參數優(yōu)化的,英文叫做Hyperparameter Optimization,簡稱HPO,在學習中了解到這塊的知識研究還是蠻豐富的,主要有下面的一些方法:
基于貝葉斯優(yōu)化的超參數優(yōu)化 Bayesian Optimization 基于進化算法的超參數優(yōu)化 Evolutionary Algorithms 基于本地搜索的超參數優(yōu)化 Local Search 基于隨機搜索的超參數優(yōu)化 Random Search 基于粒子群優(yōu)化算法的超參數優(yōu)化 Particle Swarm Optimization 基于元學習的超參數優(yōu)化 Meta Learning 基于遷移學習的超參數優(yōu)化 Transfer Learning
還有一個概念就是NAS,即Neural Architecture Search(神經網絡結構搜索),因為目前深度學習應用很廣泛了,很多時候是需要搭建一個深度神經網絡,這里面涉及的參數是真的多,按照傳統(tǒng)的超參數優(yōu)化的方法顯得十分吃力,所以也有了這個NAS的概念,而關于NAS的研究方法,主要有下面幾種:
基于進化算法的超參數優(yōu)化 Evolutionary Algorithms 基于元學習的超參數優(yōu)化 Meta Learning 基于遷移學習的超參數優(yōu)化 Transfer Learning 基于本地搜索的超參數優(yōu)化 Local Search 基于強化學習的超參數優(yōu)化 Reinforcement Learning 基于Network Morphism 基于 Continuous Optimization優(yōu)化
? 市面上的AutoML產品
目前AutoML工具我們可以從兩個途徑來進行獲取學習:
開源框架:如Auto-Keras、Auto-sklearn等開源工具 商業(yè)服務:如Google Cloud、Microsoft Azure等
從Awesome-AutoML-Papers(https://github.com/hibayesian/awesome-automl-papers#projects)里有一張AutoML工具的對比圖,大家可以瀏覽一波。
| 名稱 | 支持類型 | 編程語言 |
|---|---|---|
| AdaNet | NAS | Python |
| Advisor | HPO | Python |
| AMLA | HPO, NAS | Python |
| ATM | HPO | Python |
| Auger | HPO | Python |
| Auto-Keras | NAS | Python |
| AutoML Vision | NAS | Python |
| AutoML Video Intelligence | Python | |
| AutoML Natural Language | NAS | Python |
| AutoML Translation | NAS | Python |
| AutoML Tables | AutoFE, HPO | Python |
| auto-sklearn | HPO | Python |
| auto_ml | HPO | Python |
| BayesianOptimization | HPO | Python |
| BayesOpt | HPO | C++ |
| comet | HPO | Python |
| DataRobot | HPO | Python |
| DEvol | NAS | Python |
| Driverless AI | AutoFE | Python |
| FAR-HO | HPO | Python |
| H2O AutoML | HPO | Python, R, Java, Scala |
| HpBandSter | HPO | Python |
| HyperBand | HPO | Python |
| Hyperopt | HPO | Python |
| Hyperopt-sklearn | HPO | Python |
| Hyperparameter Hunter | HPO | Python |
| Katib | HPO | Python |
| MateLabs | HPO | Python |
| Milano | HPO | Python |
| MLJAR | HPO | Python |
| nasbot | NAS | Python |
| neptune | HPO | Python |
| NNI | HPO, NAS | Python |
| Optunity | HPO | Python |
| R2.ai | HPO | ------ |
| RBFOpt | HPO | Python |
| RoBO | HPO | Python |
| Scikit-Optimize | HPO | Python |
| SigOpt | HPO | Python |
| SMAC3 | HPO | Python |
| TPOT | AutoFE, HPO | Python |
| TransmogrifAI | HPO | Scala |
| Tune | HPO | Python |
| Xcessiv | HPO | Python |
| SmartML | HPO | R |
? AutoML學習框架——auto-sklearn介紹與入門
這里會簡單地講一下auto-sklearn的框架,讓大家對這個學習框架有一定的了解,接下來就會拿官方的栗子來說明一下怎么使用,然后羅列一下這個auto-sklearn可以做什么內容,讓大家對這個框架的功能有一定的了解。
二話不說,先在本地安裝一下這個包,直接pip install auto-sklearn走起,如果安裝失敗可能是因為缺少依賴項,可以試試:
curl?https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt?|?xargs?-n?1?-L?1?pip?install
如果出現(xiàn)Failed to connect to raw.githubusercontent.com port 443: Connection refused的報錯,初步估計是DNS污染,可以查看相關攻略:https://github.com/hawtim/blog/issues/10
如果安裝失敗,可以按照官網網站的指導再試試:https://automl.github.io/auto-sklearn/master/installation.html

相關學習傳送門:
auto-sklearn官方文檔(https://automl.github.io/auto-sklearn/master/api.html) auto-sklearn官方示例(https://automl.github.io/auto-sklearn/master/examples/index.html)
我們從上面官方文檔可以知道(可能需要番羽Q,所以我就把相關的example的code下載下來了,大家可以后臺回復“automl”獲?。?/span>,auto-sklearn的功能主要有下面的截圖所示,包括分類模型、回歸模型的構建,模型評估方法的支持等,涵蓋了我們主要的基礎建模需求。

auto-sklearn顧名思義應該是和我們常用的scikit-learn有一定的關系,確實對的,auto-sklearn就是基于scikit-learn進行開發(fā)的自動化機器學習庫,所以如果我們熟悉scikit-learn的使用,那么對于這個auto-sklearn就很好理解了的,不熟悉其實也沒有關系,也蠻簡單的,后續(xù)我拿一些小栗子來說明一下,主要圍繞兩個核心的分類接口和回歸接口API:AutoSklearnClassifier 和 AutoSklearnRegressor 。
? AutoSklearnClassifier(分類)
我們直接在官方文檔里看下這個API的參數,如下圖所示:

參數的數量還是蠻多的,我們簡單介紹兩個Parameters:
time_left_for_this_task:int類型,默認3600秒 時間限制是針對模型參數搜索的,我們可以通過加大這個值來增加模型訓練的時間,有更大的機會找到更好的模型。 per_run_time_limit:int類型, 默認值為參數time_left_for_this_task值的1/10 這個時間限制是針對每次模型調用的,如果模型調用時間超出這個值,則會被直接終止擬合,可以適當加大這個值。
簡單調用一下:
#?導入相關包
import?numpy?as?np
from?sklearn.datasets?import?load_digits
from?sklearn.model_selection?import?train_test_split
import?warnings
from?autosklearn.classification?import?AutoSklearnClassifier
warnings.filterwarnings('ignore')??#?忽略代碼警告
#?導入手寫數字的數據集
digits?=?load_digits()??#?加載數據集
#?劃分數據集為訓練集和測試集
X_train,?X_test,?y_train,?y_test?=?train_test_split(
????digits.data,?digits.target,?test_size=0.3,?random_state=42)??#?切分數據集
#?調用Auto-sklearn
#?限制算法搜索最大時間,更快得到結果
auto_model?=?AutoSklearnClassifier(
????time_left_for_this_task=120,?per_run_time_limit=10)
#?訓練模型
auto_model.fit(X_train,?y_train)??
#?用測試集評估模型效果
auto_model.score(X_test,?y_test)
? AutoSklearnRegressor(回歸)
我們繼續(xù)看官方文檔里的API參數,如下圖所示:

參數也是照樣很多,
time_left_for_this_task:int類型,和上面的分類API是一樣的參數 per_run_time_limit:int類型,和上面的分類API是一樣的參數 ensemble_size:int類型,默認是50 從算法中選擇構建為集成模型的數量
總結來說這兩個API的參數幾乎是一樣的,正所謂一份學習double享受,jeng!同樣的我們簡單地調用一下,這次我們用房價預測的數據集,這是一個很經典的回歸算法的數據集。
#?導入相關包
from?sklearn.datasets?import?load_boston
from?autosklearn.regression?import?AutoSklearnRegressor
#?導入數據集
boston?=?load_boston()??#?加載數據集
#?限制算法搜索最大時間,更快得到結果
auto_model?=?AutoSklearnRegressor(
????time_left_for_this_task=120,?per_run_time_limit=10)
auto_model.fit(boston.data,?boston.target)
#?查看模型效果,用R方來看
auto_model.score(boston.data,?boston.target)
? Auto-sklearn支持的Metrics方法
我們評估一個機器學習模型的好壞需要量化的指標,而我們常用的幾個像準確率、AUC、ROC、f1等等,在這里是否也支持呢?我們可以看看:
print("Available?CLASSIFICATION?metrics?autosklearn.metrics.*:")
print("\t*"?+?"\n\t*".join(autosklearn.metrics.CLASSIFICATION_METRICS))
print("Available?REGRESSION?autosklearn.metrics.*:")
print("\t*"?+?"\n\t*".join(autosklearn.metrics.REGRESSION_METRICS))
Available?CLASSIFICATION?metrics?autosklearn.metrics.*:
????????*accuracy
????????*balanced_accuracy
????????*roc_auc
????????*average_precision
????????*log_loss
????????*precision
????????*precision_macro
????????*precision_micro
????????*precision_samples
????????*precision_weighted
????????*recall
????????*recall_macro
????????*recall_micro
????????*recall_samples
????????*recall_weighted
????????*f1
????????*f1_macro
????????*f1_micro
????????*f1_samples
????????*f1_weighted
Available?REGRESSION?autosklearn.metrics.*:
????????*r2
????????*mean_squared_error
????????*mean_absolute_error
????????*median_absolute_error
我們可以看出其實大多數的評估指標都涵蓋了,具體怎么用,建議可以去看看官方文檔看看例子~
? AutoDL學習框架——auto-keras介紹與入門
介紹完了機器學習框架的原理以及其中一個產品的簡單使用,順便也介紹下深度學習的自動化機器學習框架,深度學習在近幾年十分大熱,神經網絡在很多時候的表現(xiàn)也是讓人吃驚,確實也很有必要去了解一下。

towardsdatascience.com
可以從上圖看出目前最流行的深度學習框架有TensorFlow、Keras和PyTorch,今天我們不展開這些框架的學習,篇幅有限也不好展開(主要是我也不熟哈哈哈),我們今天就來講講Auto-Keras的簡單使用,畢竟今天的主要還是自動化機器學習。

Auto-Keras框架是由DATA Lab開發(fā)的,由Keras官方團隊維護。它主要提供了神經結構搜索(NAS)和超參數自動優(yōu)化(HPO),其后端依賴于scikit-learn、TensorFlow和PyTorch,我們還是把一些常用的地址貼一下:
官方網站:https://autokeras.com/ GitHub地址:https://github.com/keras-team/autokeras
安裝的話也是比較簡單,可以使用pip的方式進行安裝,不過目前AutoKeras只支持Python >= 3.5 and TensorFlow >= 2.3.0:
pip3?install?git+https://github.com/keras-team/keras-tuner.git@1.0.2rc1
pip3?install?autokeras
我們從官網文檔里可以看出主要是支持圖片分類、圖片生成、文本分類、文本生成等,算是涵蓋了計算機視覺和自然語言處理的常用應用場景了。

import?sys
sys.path.append("autokeras")??#?鏈接到?Auto-Keras?庫
? ImageClassifier(圖片分類)
同樣的,我們可以看看官方文檔:

調用栗子:
我們導入自帶的MNIST手寫字符分類數據集,樣本數據形狀為28x28的灰度圖像,已經轉為了numpy數組。
#?導入相關包
import?tensorflow?as?tf
from?autokeras.image.image_supervised?import?ImageClassifier
#?加載數據集
(X_train,?y_train),?(X_test,?y_test)?=?tf.keras.datasets.mnist.load_data()
#?實例化模型,verbose=True?輸出訓練過程參數
clf?=?ImageClassifier(verbose=True)??
#?訓練模型,最大時間設為?30?分鐘
clf.fit(X_train,?y_train,?time_limit=30?*?60)??
#?評估模型
clf.evaluate(X_test,?y_test)??

那如果是針對那些數據集本身是圖片的呢,又可以如何操作?也可以參考下面的例子:
#?下載圖片數據
!wget?-nc?"https://labfile.oss.aliyuncs.com/courses/1357/load_raw_image_data.zip"
!unzip?-o?"load_raw_image_data.zip"??#?解壓數據
#?導入相關包
import?pandas?as?pd
from?autokeras.image.image_supervised?import?load_image_dataset
#?讀取數據
X_train,?y_train?=?load_image_dataset(
???????="load_raw_image/train/label.csv",?images_path="load_raw_image/train")
X_test,?y_test?=?load_image_dataset(
????csv_file_path="load_raw_image/test/label.csv",?images_path="load_raw_image/test")
#?實例化模型,verbose=True?輸出訓練過程參數
clf?=?ImageClassifier(verbose=True)??
#?訓練模型,最大時間設為?30?分鐘
clf.fit(X_train,?y_train,?time_limit=30?*?60)??
#?評估模型
clf.evaluate(X_test,?y_test)??
? TextClassifier(文本分類)
同樣的,我們可以看看官方文檔:

NLP有十分豐富的應用,比如文本分類、情感分析、機器翻譯、智能問答等,在Auto-Keras中也有類似的APIs可以用,我們拿其中一個文本分類預測來看看。
#?下載數據集(關于電影影評的積極與消極情緒的識別)
!wget?-nc?"https://labfile.oss.aliyuncs.com/courses/1357/imdb-reviews.zip"
!unzip?-o?"imdb-reviews.zip"
#?導入相關包
import?pandas?as?pd
from?sklearn.model_selection?import?train_test_split
from?autokeras.text.text_supervised?import?TextClassifier
#?導入數據
reviews?=?pd.read_csv("imdb-reviews.csv")
#?劃分數據集
X_train,?X_test,?y_train,?y_test?=?train_test_split(
????reviews['text'],?reviews['sentiment'],?test_size=0.1)
X_train.shape,?X_test.shape,?y_train.shape,?y_test.shape
#?獨熱編碼,因為auto-kearn要求輸入的為獨熱編碼后的數組
y_train_?=?pd.get_dummies(y_train).values??
y_test_?=?pd.get_dummies(y_test).values
#?實例化模型,verbose=True?輸出訓練過程參數
clf?=?TextClassifier(verbose=True)??
clf.fit(X_train,?y_train,?time_limit=30?*?60)?
#?評估模型
clf.evaluate(X_test,?y_test)?
(我把相關的example的code下載下來了,大家可以后臺回復“automl”獲?。?/p>
?
? References
自動化機器學習綜述——實驗樓 Awesome-AutoML-Papers(https://github.com/hibayesian/awesome-automl-papers) auto-sklearn官方文檔(https://automl.github.io/auto-sklearn/master/api.html) auto-sklearn官方示例(https://automl.github.io/auto-sklearn/master/examples/index.html) 解決DNS污染的問題(https://github.com/hawtim/blog/issues/10)
