想問問各位從事數據科學工做的小夥伴:你以爲,機器學習最難的點是什麼?html
「不知道什麼時候能完成!!」恐怕不少人都會對這一點深有體會。python
假設要用機器學習解決一個問題,首先,咱們須要構建數據集,接着構想如何解決問題。然而最痛苦的地方在於,花費大量時間以後,咱們徹底不知道本身的方案是否可行!git
機器學習的流程之因此如此艱難,部分緣由在於,這個領域存在許多經驗豐富的從業者才知道的最佳實踐。對於數據科學領域的新手,咱們可能會花費大量時間踐行一種自認爲正確的方法,但實際上那些專家從業者可能一開始就會知道,咱們選擇的方法是行不通的……github
但若是那些專家們能夠將這些最佳實踐編纂成一個簡單易用的軟件包,供全部開發人員使用,結果會怎麼樣?設想一下:一個能夠自動準備數據集,嘗試不一樣機器學習方法,並將結果組合在一塊兒以提供高質量模型的庫,而且全部這些功能只須要幾行代碼就能實現。激動嗎?算法
上述設想實際上就是自動化機器學習(AutoML)背後的理念,也是 AutoGluon AutoML 庫的設計理念。該庫由 Amazon Web Services(AWS)在 re:Invent 2019 上開源。藉助 AutoGluon,咱們能夠訓練最早進的機器學習模型,以進行圖像分類、對象檢測、文本分類和表格式數據預測,而幾乎無需具有機器學習方面的經驗。而且咱們還能夠隨時隨地運行 AutoGluon,不管使用筆記本電腦或工做站,或者使用功能強大的 Amazon Elastic Compute Cloud(Amazon EC2)實例,均可以運行這個庫,並以利用多個內核更快地得到結果。數據庫
最近,AWS 的 AutoGluon 團隊發表了一篇論文,詳細介紹了 AutoGluon-Tabular 的內部工做原理,這是一種開源 AutoGluon 功能,容許您對來自電子表格和數據庫表格等來源的表格數據集的機器學習模型進行訓練。編程
AutoGluon-Tabular 論文位置以下:https://arxiv.org/abs/2003.06505ubuntu
下文的上半部分,將介紹 AutoGluon-Tabular,並總結該論文中介紹的關鍵創新以及使用 AutoGluon-Tabular 在幕後發生的神奇操做。下半部分將介紹一個端到端代碼示例,展現如何使用 AutoGluon-Tabular 憑藉幾行代碼在數據科學競賽中得到排名前1%的分數,且無需機器學習經驗。
若是想快速入門並開始學習本示例,請轉到「在下一次數據科學競賽中搶佔先機」部分。演示用的 Jupyter 筆記本可在 GitHub 上得到。api
雖然圖像和視頻領域的機器學習應用程序引發了極大的關注,但人們幾十年來一直在將統計技術應用於表格數據(例如電子表格或數據庫中的行和列),以構建預測模型或收集彙總統計數據。大量數據科學問題屬於這一類別,例如,基於庫存和需求數據的銷售預測、交易數據的欺詐檢測以及根據用戶偏好生成產品建議。瀏覽器
本文將重點介紹 AutoGluon 處理表格數據的功能的子集,咱們將其稱爲AutoGluon-Tabular。
AutoGluon-Tabular 讓咱們能夠經過用戶友好型 API 訪問專家數據科學家使用的全部最佳實踐,其設計採用如下主要原則:
若是你已是一名數據科學專家從業者,而且想知道 AutoGluon-Tabular 對本身是否有用,答案是確定的!即便對於專家來講,AutoGluon-Tabular 也能夠經過自動執行耗時的手動步驟來節省時間,例如處理丟失的數據、手動功能轉換、數據拆分、模型選擇、算法選擇、超參數選擇和調整、集成多個模型,以及在數據更改時重複此過程。
AutoGluon-Tabular 還包括用於多層堆疊集成的新技術,可顯著提升模型的準確性。因爲 AutoGluon 徹底開源,具備透明度和可擴展性,所以咱們能夠全面瞭解它在流程的每一個階段所作的工做,甚至引入本身的算法並將它們與 AutoGluon 一塊兒使用。
AutoGluon-Tabular 用戶只需知道如何使用三個 Python 函數:Dataset()
、fit()
和 predict()
。雖然這些 API 很簡潔,但實際上在幕後有不少操做,AutoGluon-Tabular 能夠藉此爲咱們提供高質量模型。下一節將詳細介紹這些函數,並討論它們的不一樣之處。
AutoGluon 能夠利用多核 CPU 加快訓練速度。建議從 C5 或 M5 系列啓動 Amazon EC2 實例。選擇較高的 vCPU 數量以得到更快的性能。有關如何啓動實例和訪問實例的簡要指南,請閱讀 Amazon EC2 入門文檔。按照 AutoGluon 網頁上的說明安裝 AutoGluon。在大多數狀況下,應該只能運行 pip install。
要運行 AutoGluon-Tabular,首先要告訴 AutoGluon 咱們感興趣的任務是爲表格數據構建預測器。將 TabularPrediction 替換爲 ImageClassification 以解決圖像分類問題,替換爲 ObjectDetection 以解決對象檢測問題,替換爲 TextClassification 以解決文本分類問題。API 的其他部分保持不變。藉此便可輕鬆地在問題間切換,而無需從新學習 API。
from autogluon import TabularPrediction as task
對於 pandas 用戶,能夠輕鬆使用 Dataset 函數,並得到相似 pandas 的體驗,這樣就能夠執行一些操做,如刪除變量或加入多個數據集。因爲 AutoGluon-Tabular 自動管理數據預處理,所以咱們不須要進行任何數據操做。
data = task.Dataset(DATASET_PATH)
fit()
函數執行全部繁重的工做,咱們將在下一節中介紹這一點。此函數有兩大任務:研究數據集,而後爲訓練作準備,它適合多個模型,並將它們組合在一塊兒以生成高精度模型。
predictor = task.fit(data_train, label=LABEL_COLUMN_NAME)
predict
函數經過新數據生成預測。預測可能致使預測類別和機率的分類問題,或連續值的迴歸問題。運行 fit() 函數時,將生成多個模型並保存到磁盤中。若是在之後從新訪問它們,只需使用 load 命令加載預測器並使用它運行預測便可。
prediction = predictor.predict(new_data)
將數據集傳遞給 task.fit()
函數時,它會執行兩項操做:數據預處理和模型擬合。如今,咱們來了解一下幕後的工做狀況。
AutoGluon-Tabular 首先檢查標籤列,並肯定是否存在分類問題(預測類別)或迴歸問題(預測連續值)。而後它將啓動數據預處理步驟,將數據轉換爲一種在 fit() 階段將被許多不一樣的機器學習算法佔用的表格。
在預處理步驟中,AutoGluon-Tabular 首先將每一個特徵分類爲數字、類別、文本或日期/時間。不能分類的列,如包含非數字信息且不重複(被視爲類別)的列,將被棄用,例如用戶 ID。
文本列轉換爲 n-gram(連續的n項或詞序列)特徵的數值向量;日期和時間特徵轉換爲合適的數值。爲了處理缺乏的離散變量,AutoGluon-Tabular 會建立一個額外的未知類別,而不是輸入(用平均值等代理替換)。在真實的數據集中,因爲各類緣由(例如數據損壞、傳感器故障和人爲錯誤),數值可能會缺失,但這並不意味着沒有任何有趣的東西。將其歸類爲未知容許 AutoGluon-Tabular 在用新數據生成預測時處理之前不可見的類別。在模型擬合階段,AutoGluon-Tabular 還執行特定於模型的額外數據預處理步驟。
調用 fit() 函數時,AutoGluon-Tabular 將基於預處理的數據訓練一系列的機器學習模型。而後使用集成和堆疊將多個模型組合起來。
AutoGluon-Tabular 以專門選擇的順序訓練各個模型。首先,訓練性能可靠的模型(如隨機森林),而後逐步訓練須要計算量更大但可靠性更低的模型,如k最近鄰。這種方法的好處是能夠對 fit() 函數施加時間限制,並將返回在時間限制下能夠訓練的最佳模型。利用 AutoGluon-Tabular,能夠靈活地決定是無約束地實現最佳精度,仍是在特定的成本或時間預算下實現最佳精度。
AutoGluon-Tabular 目前支持如下算法,若是沒有時間限制,能夠對全部這些算法進行訓練:
在數據科學界有一種常見誤解,即深度學習方法不能很好地處理表格數據。之因此產生這種想法是由於:在神經網絡中引入了卷積,以便經過權值共享實現平移不變性。此方法對於一維信號、二維或者三維圖像或視頻數據集很是有效,由於這些數據集中的每一個信號採樣或像素值自己的預測能力很低。在許多表格數據集應用程序中,每一個特徵都具備獨特的重要性,而且比圖像中的單個像素具備更高的預測能力。在這些狀況下,前饋或卷積神經網絡架構的性能每每低於基於決策樹的同類架構。
爲了解決這些問題,AutoGluon-Tabular 採用了以下圖所示的新型神經網絡架構。實證研究代表,精心設計的神經網絡能夠顯著提高準確度,特別是建立與其餘模型類型的集成時,咱們將在下一節討論這一點。
與經常使用的純前饋網絡架構不一樣,AutoGluon-Tabular 爲每一個分類特徵都引入了一個嵌入層,其中嵌入維數根據特徵中惟一類別的數量按比例選擇。嵌入層的優勢是,在被後續前饋層使用以前,爲每一個分類特徵引入了一個可學習組件。而後,將分類特徵的嵌入與數值特徵鏈接成一個大矢量,該矢量既饋入一個三層前饋網絡,又經過線性跳接(相似於剩餘網絡族)直接鏈接到輸出預測。
將多個模型組合起來,建立一個「集成」,從而相比每一個參與者都具備更高的預測準確度,這種想法並不新鮮。集成技術最先的實現能夠追溯到20世紀90年代早期,當時出現了提高法(和 AdaBoost 算法)和自助聚合法(Bootstrap Aggregation)。這些技術建立了決策樹的集成,這些決策樹是弱分類器(不比隨機猜想強多少)且不穩定(對數據集的變化很敏感)。可是,當許多決策樹組合在一塊兒時,就生成了具備高預測能力的模型,不受過擬合的影響。這些早期成果是許多流行機器學習包的基礎,如 LightGBM、CatBoost 和 scikit-learn 的 RandomForest,這些都在 AutoGluon 中所採用。
若是想知道是否能夠組合 RandomForest、CatBoost、k 最近鄰等的輸出來進一步提升模型準確度,答案是確定的。有經驗的機器學習從業者已經這樣作了不少年,可以熟練設計巧妙的方法來組合多個模型。請查看奧托集團產品分類挑戰賽 Kaggle 競賽的獲獎做品。第一名的解決方案包括33個模型,再使用這些模型的輸出訓練另外3個模型(堆疊),而後進行加權平均。
利用 AutoGluon-Tabular,咱們沒必要具有堆疊和集成技術,AutoGluon-Tabular 會自動執行。AutoGluon-Tabular 引入了一種新型的多層堆疊集成,如上圖所示。下面介紹了其工做原理:
爲確保每一個分類器都能看到整個數據集,AutoGluon-Tabular 執行 k -折交叉驗證。爲了進一步提升預測準確度和減小過擬合,AutoGluon-Tabular 將對 n 個不一樣的隨機輸入數據分區重複執行 n 次 k - 折交叉驗證。數字 n 的選擇方法是,在調用 fit() 函數時,估計在指定的時間限制內能夠完成多少次循環。
在生活和數據科學中,事情可能不會按計劃進行。當使用 AutoGluon-Tabular 時,咱們可能會不當心按下 Ctrl+C,或者遇到電源浪涌,致使計算機斷電,或者關閉了全部正在運行的 Amazon EC2 實例,而沒有意識到正在運行訓練做業。出現錯誤以及事情沒有按計劃進行時,咱們確定不但願被數據丟失和停滯不前所困擾。AutoGluon-Tabular 爲這類狀況提供了一些內置保護。
調用 fit() 函數時,AutoGluon-Tabular 首先估計所需的訓練時間,若是超出訓練某層的剩餘時間,則跳過該層,繼續訓練下一層。爲了確保沒有停滯不前,訓練每一個新模型後,會當即將其保存到磁盤。若是確實發生了故障,AutoGluon-Tabular 只要在發生故障以前(或在達到時間限制以前)至少對一個模型訓練了一折(共k折),仍然能夠進行預測。對於在訓練過程當中支持中間檢查點的算法,如基於樹的算法和神經網絡,AutoGluon-Tabular仍然可使用這些檢查點生成預測。AutoGluon-Tabular還能夠預測模型在訓練過程的哪一個階段會失敗,而後跳到下一階段。
如今你應該對 AutoGluon-Tabular 的工做方式有了必定的瞭解,可是數據科學是一門實踐性很強的學科,所以最好的學習方法是進行實踐。
在本節中,咱們將介紹一個使用 AutoGluon-Tabular 基於數據集訓練模型的端到端示例,該數據集曾在Kaggle 上的奧托集團產品分類挑戰賽上使用。執行下面的示例後,應該可以取得不錯的成績,在排行榜上可位列前1%。比賽已經結束,可是咱們仍然能夠提交模型,在公開排行榜和非公開排行榜上佔一席之地。
參賽數據集由表明產品的20萬行和表明產品特徵的93列組成。產品分爲訓練數據集中標籤列指定的10類。比賽的目標是根據產品的93個特徵預測產品類別。能夠在比賽頁面上閱讀有關比賽的更多信息。
若是想在一邊閱讀時一邊運行示例,能夠在 GitHub 上獲取演示用的 Jupyter 筆記本。
要下載數據集並將分數提交給 Kaggle,請進入比賽頁面,單擊「參加比賽」並贊成其條款和條件,而後再繼續。
下文的操做中,咱們在 AWS 上的一個 c5.24xlarge EC2 實例上運行了這些示例,整個訓練耗時2小時30分鐘。c5.24xlarge 是通過計算優化的實例,並提供96個 CPU 內核。建議選擇具備大量內核的實例類型,由於許多 AutoGluon-Tabular 算法都是多線程的,能夠利用全部內核。下面的屏幕截圖顯示了在訓練(神經網絡訓練)階段在 EC2 實例上使用 htop 命令時的 CPU 使用狀況。綠色水平條表示 CPU 內核忙碌。黑色條表示每一個內核的利用率不到100%。平均負載分數84表示截取屏幕快照時全部96個 CPU 的平均負載。
若是選擇內核數量較少的 CPU 實例,則訓練時間將更長。爲節省成本,請考慮在 EC2 Spot 實例上運行,這樣就能夠享受實例價格的折扣,可是能夠搶佔這些實例。因爲 AutoGluon-Tabular 設計爲具備容錯能力,所以當容量再次可用時,咱們始終能夠恢復訓練。
按照 Kaggle API GitHub 頁面上的說明下載 Kaggle CLI。藉助 CLI,咱們能夠輕鬆下載數據集並以編程方式提交預測結果,而無需離開 Jupyter 筆記本。
按照 AutoGluon 網頁上的說明安裝 AutoGluon。在大多數狀況下,咱們應該可使用 pip 進行安裝。
如下步驟來自 GitHub 上託管的 otto-kaggle-example.ipynb Jupyter 筆記本。讓咱們詳細看看每一個步驟。
此步驟假設已安裝 Kaggle CLI,並已贊成經過訪問比賽頁面來參加比賽。
dataset = 'dataset' !kaggle competitions download -p {dataset} -q otto-group-product-classification-challenge !unzip -d {dataset} {dataset}/otto-group-product-classification-challenge.zip !rm {dataset}/otto-group-product-classification-challenge.zip
輸出:
Archive: dataset/otto-group-product-classification-challenge.zip inflating: dataset/sampleSubmission.csv inflating: dataset/test.csv inflating: dataset/train.csv
在此步驟中,咱們導入一個 TabularPrediction 任務。若是熟悉 pandas,那麼就會很是熟悉 task.Dataset() 函數,該函數能夠讀取各類表格數據文件,並返回相似 pandas 的對象。因爲 AutoGluon-Tabular 並不但願咱們進行任何預處理,所以除了刪除不須要的變量或加入多個數據集以外,咱們不須要進行大量數據操做。
from autogluon import TabularPrediction as task train_data = task.Dataset(file_path=f'{dataset}/train.csv').drop('id', axis=1) train_data.head()
輸出:
Loaded data from: dataset/train.csv | Columns = 95 / 95 | Rows = 61878 -> 61878 feat_1 feat_2 feat_3 feat_4 feat_5 feat_6 feat_7 feat_8 feat_9 feat_10 ... feat_85 feat_86 feat_87 feat_88 feat_89 feat_90 feat_91 feat_92 feat_93 target 0 1 0 0 0 0 0 0 0 0 0 ...1 0 0 0 0 0 0 0 0 Class_1 1 0 0 0 0 0 0 0 1 0 0 ...0 0 0 0 0 0 0 0 0 Class_1 2 0 0 0 0 0 0 0 1 0 0 ...0 0 0 0 0 0 0 0 0 Class_1 3 1 0 0 1 6 1 5 0 0 1 ...0 1 2 0 0 0 0 0 0 Class_1 4 0 0 0 0 0 0 0 0 0 0 ...1 0 0 0 0 1 0 0 0 Class_1 5 rows × 94 columns
label_column = 'target' # specifies which column do we want to predict savedir = 'otto_models/' # where to save trained models predictor = task.fit(train_data=train_data, label=label_column, output_directory=savedir, eval_metric='log_loss', auto_stack=True, verbosity=2, visualizer='tensorboard')
fit() 函數的必需參數是 train_data 和 label,其他參數是可選的。在此示例中還指定了如下選項:
輸出:
Beginning AutoGluon training ... AutoGluon will save models to otto_models/ Train Data Rows: 61878 Train Data Columns: 94 Preprocessing data ... Here are the first 10 unique label values in your data: ['Class_1' 'Class_2' 'Class_3' 'Class_4' 'Class_5' 'Class_6' 'Class_7' 'Class_8' 'Class_9'] AutoGluon infers your prediction problem is: multiclass (because dtype of label-column == object) If this is wrong, please specify `problem_type` argument in fit() instead (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])Feature Generator processed 61878 data points with 93 features Original Features: int features: 93 Generated Features: int features: 0 All Features: int features: 93 Data preprocessing and feature engineering runtime = 0.36s ... AutoGluon will gauge predictive performance using evaluation metric: log_loss This metric expects predicted probabilities rather than predicted class labels, so you'll need to use predict_proba() instead of predict() To change this, specify the eval_metric argument of fit() AutoGluon will early stop models using evaluation metric: log_loss /home/ubuntu/anaconda3/envs/autogluon/lib/python3.7/imp.py:342: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working return _load(spec) Fitting model: RandomForestClassifierGini_STACKER_l0 ... -0.5691 = Validation log_loss score 27.63s = Training runtime 0.03s = Validation runtime … …
咱們可使用 TensorBoard 監控神經網絡訓練性能。安裝 TensorBoard 並運行:
tensorboard —logdir otto_models/models/
隨後用瀏覽器訪問 http://0.0.0.0:6006/。
results = predictor.fit_summary() # display detailed summary of fit() process
輸出:
*** Summary of fit() *** Number of models trained: 22 Types of models trained: {'WeightedEnsembleModel', 'StackerEnsembleModel'} Validation performance of individual models: {'RandomForestClassifierGini_STACKER_l0': -0.5691089791208548,...} Best model (based on validation performance): weighted_ensemble_k0_l2 Hyperparameter-tuning used: False Bagging used: True (with 10 folds) Stack-ensembling used: True (with 1 levels) User-specified hyperparameters: {'NN': {'num_epochs': 500, 'visualizer': 'tensorboard'}, 'GBM': {'num_boost_round': 10000}, ...} Plot summary of models saved to file: SummaryOfModels.html *** End of fit() summary ***
要比較集成中的全部模型,請調用 leaderboard():
lboard = predictor.leaderboard() lboard.sort_values(by='score_val', ascending=False)
輸出:
dataset = 'dataset' test_data_full = task.Dataset(file_path=f'{dataset}/test.csv') test_data = test_data_full.drop('id', axis=1) pred_probablities = predictor.predict_proba(test_data, as_pandas=True)
submission_name = 'autogluon-submission.csv' pred_probablities.to_csv(submission_name,index=False) !kaggle competitions submit otto-group-product-classification-challenge -f {submission_name} -m "autogluon {submission_name}"
前往比賽頁面,隨後應該會看到分數。本例中收到的分數是0.40708,在3,511個提交中排名第32位,處於全部提交前1%以外。
有關如何在其餘 Kaggle 比賽中使用 AutoGluon 的說明,請查看 AutoGluon 文檔「如何在 Kaggle 比賽中使用 AutoGluon」中的教程。
本文介紹了 AutoGluon 和 AutoGluon-Tabular,並解釋瞭如何使用它來加速數據科學項目。若是想了解有關 AutoGluon-Tabular 的更多信息,以及如何在流行的 AutoML 和 Kaggle 基準測試中運行,如何與其餘 AutoML 解決方案進行比較的詳細信息,請閱讀 AutoGluon-Tabular 白皮書「AutoGluon-Tabular:適用於結構化數據穩健而精確的 AutoML」。
AutoGluon 目前正積極接受 AutoGluon 項目的代碼貢獻。若是有興趣爲 AutoGluon 作出貢獻,請訪問GitHub 上的貢獻頁面以獲取更多信息。