之前的工作中也有多少接觸過這個AutoML(Automated Machine Learning)的概念,簡單來說就是把模型開發的標準過程模塊化,都交給一些自動化的組件來完成,比如數據集的劃分、特徵衍生、算法選擇、模型訓練、調優、部署以及後續的監控,都「一條龍」地在AutoML實現。
從Google Cloud繪製的AutoML的工作原理圖可以看出,我們使用者只需要給其提供數據源,以及好壞樣本(或者不需要),然後後面的一切都交給AutoML組件去完成。
🚀 AutoML的關鍵節點我們可以認識到AutoML大大降低了機器學習模型的開發門檻,但是我們還是需要了解這裡面的原理的,這裡涉及了機器學習的幾個關鍵節點的內容,需要我們特別關注。
其中最為重要的是自動化特徵工程了,一般縮寫為「Auto FE」,主要是包括了預處理、特徵選擇、特徵提取、元學習等等的操作,把每一個環節的處理邏輯寫到腳本裡,結合一些策略讓邏輯更加科學,結果更加合理。
第二個就是自動化模型選擇,也叫Automated Model Selection,簡稱AMS,就是根據實際的數據來選擇合適的算法。因為大多數的算法都是有超參數的,這時候AutoML是需要進行自動化的超參數優化的,英文叫做Hyperparameter Optimization,簡稱HPO,在學習中了解到這塊的知識研究還是蠻豐富的,主要有下面的一些方法:
基於貝葉斯優化的超參數優化 Bayesian Optimization基於進化算法的超參數優化 Evolutionary Algorithms基於本地搜索的超參數優化 Local Search基於隨機搜索的超參數優化 Random Search基於粒子群優化算法的超參數優化 Particle Swarm Optimization基於元學習的超參數優化 Meta Learning基於遷移學習的超參數優化 Transfer Learning還有一個概念就是NAS,即Neural Architecture Search(神經網絡結構搜索),因為目前深度學習應用很廣泛了,很多時候是需要搭建一個深度神經網絡,這裡面涉及的參數是真的多,按照傳統的超參數優化的方法顯得十分吃力,所以也有了這個NAS的概念,而關於NAS的研究方法,主要有下面幾種:
基於進化算法的超參數優化 Evolutionary Algorithms基於元學習的超參數優化 Meta Learning基於遷移學習的超參數優化 Transfer Learning基於本地搜索的超參數優化 Local Search基於強化學習的超參數優化 Reinforcement Learning基於 Continuous Optimization優化📖 市面上的AutoML產品目前AutoML工具我們可以從兩個途徑來進行獲取學習:
開源框架:如Auto-Keras、Auto-sklearn等開源工具商業服務:如Google Cloud、Microsoft Azure等從Awesome-AutoML-Papers(https://github.com/hibayesian/awesome-automl-papers#projects)裡有一張AutoML工具的對比圖,大家可以瀏覽一波。
名稱支持類型程式語言AdaNetNASPythonAdvisorHPOPythonAMLAHPO, NASPythonATMHPOPythonAugerHPOPythonAuto-KerasNASPythonAutoML VisionNASPythonAutoML Video Intelligence這裡會簡單地講一下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如果出現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」獲取),auto-sklearn的功能主要有下面的截圖所示,包括分類模型、回歸模型的構建,模型評估方法的支持等,涵蓋了我們主要的基礎建模需求。
auto-sklearn顧名思義應該是和我們常用的scikit-learn有一定的關係,確實對的,auto-sklearn就是基於scikit-learn進行開發的自動化機器學習庫,所以如果我們熟悉scikit-learn的使用,那麼對於這個auto-sklearn就很好理解了的,不熟悉其實也沒有關係,也蠻簡單的,後續我拿一些小慄子來說明一下,主要圍繞兩個核心的分類接口和回歸接口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(回歸)我們繼續看官方文檔裡的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介紹與入門介紹完了機器學習框架的原理以及其中一個產品的簡單使用,順便也介紹下深度學習的自動化機器學習框架,深度學習在近幾年十分大熱,神經網絡在很多時候的表現也是讓人吃驚,確實也很有必要去了解一下。
towardsdatascience.com
可以從上圖看出目前最流行的深度學習框架有TensorFlow、Keras和PyTorch,今天我們不展開這些框架的學習,篇幅有限也不好展開(主要是我也不熟哈哈哈),我們今天就來講講Auto-Keras的簡單使用,畢竟今天的主要還是自動化機器學習。
Auto-Keras框架是由DATA Lab開發的,由Keras官方團隊維護。它主要提供了神經結構搜索(NAS)和超參數自動優化(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」獲取)
📖 ReferencesAwesome-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)