機器學習工做流是一個迭代過程,須要作出許多決策,例如是否須要訓練數據、要捕獲哪些屬性、要使用哪些算法和在何處部署通過訓練的模型。全部這些決策都將影響學習系統的結果。html
在明確上述問題後,咱們還必須從下列四種不一樣類型的學習系統中選擇所需的學習系統:算法
其中有些學習系統徹底依賴訓練數據,而另外一些則根本不須要訓練數據,而是須要一個明肯定義的環境和行動空間。當算法依賴於訓練數據時,最終模型的質量和靈敏度在很大程度上取決於訓練集的特徵。正因如此,許多人進入了一個繁瑣的循環:試圖找到合理的功能平衡,從而得到一個均衡且準確的模型。
得益於諸如 Amazon SageMaker 和 AWS Data Exchange 等雲服務,如今實施機器學習(ML)比以往更容易。本文將介紹如何使用 AWS Data Exchange 和 Amazon SageMaker 構建模型,以預測紐約市餐廳的餐廳等級。咱們將使用 AWS Data Exchange 中的數據集(包含23372個餐廳檢查等級和分數)和 Amazon SageMaker 中的線性學習器算法訓練和部署模型。json
數據是機器學習的基礎,最終模型的質量取決於用於訓練的數據的質量。在咱們的工做流中,一半步驟與數據收集和準備有關。這一主題在大多數ML項目中均可以看到,一般是最具挑戰性的部分。另外還必須考慮數據的特徵,以防止模型過於敏感或者不夠敏感。此外,並不是全部數據都是內部數據。咱們可能必須使用免費或付費的第三方數據來擴充內部數據集並提升模型的質量,但多年來,查找、受權和使用此類第三方數據一直是一個難題。幸運的是,咱們如今可使用 AWS Data Exchange。安全
AWS Data Exchange 讓咱們能在雲中輕鬆查找、訂閱和使用第三方數據,從而簡化數據收集過程。咱們能夠在 AWS Marketplace 中瀏覽來自90多家合格數據提供商的1500多種數據產品。之前,須要訪問更多數據以推進分析、訓練 ML 模型並作出數據驅動型決策;但如今藉助 AWS Data Exchange,咱們能夠一站式完成全部這些操做。有關更多信息,請參見AWS Data Exchange – 查找、訂閱和使用數據產品。網絡
藉助 AWS Data Exchange,咱們能夠輕鬆開始實施 ML。例如可使用數百個可用數據集中的一個或多個的組合來快速啓動項目,還可使用外部第三方數據來擴充內部數據。全部數據集都可使用一個雲原生 API 來獲取,該 API 可將咱們的數據直接傳送到 Amazon S3,後面的工做流中將介紹這一點。藉此能夠節省寶貴的時間和資源,而將這些時間和資源可用於進行更有價值的活動。經過這種組合,咱們能夠從 AWS Data Exchange 獲取數據,並將其提供給 Amazon SageMaker 以訓練和部署模型。架構
Amazon SageMaker 是一項徹底託管的服務,使咱們可以快速輕鬆地構建、訓練和部署 ML 模型。咱們能夠從 AWS Data Exchange 獲取紐約市餐廳數據,並使用 Amazon SageMaker 來訓練和部署模型。爲此可使用運行 Jupyter 筆記本的徹底託管實例來瀏覽和預處理訓練數據。這些筆記本預先加載了經常使用深度學習平臺須要的 CUDA 和 cuDNN 驅動程序、Anaconda 軟件包以及 TensorFlow、Apache MXNet 和 PyTorch 的庫。dom
咱們還將使用線性學習器算法等監督學習算法來訓練模型。最後,該模型將部署到 Amazon SageMaker 終端節點,以開始服務請求並預測餐廳等級。經過將 AWS Data Exchange 的強大功能與 Amazon SageMaker 相結合,就得到了一套強大的工具來着手解決最具挑戰性的 ML 問題,如今能夠開始着手構建多分類器了。機器學習
本文的解決方案產生了一個多分類器,能夠根據行政區和食品類別預測紐約市的餐廳等級。下圖顯示了完整架構。編輯器
首先,從 AWS Data Exchange 獲取數據,而後將其放入 S3 存儲桶中。將一個 AWS Glue 爬網程序指向它,以建立數據的數據目錄。在數據目錄就緒的狀況下,使用 Amazon Athena 查詢、清理和格式化數據,以準備進行訓練。數據轉換後,將訓練集加載回 S3。最後,在 Amazon SageMaker 中建立 Jupyter 筆記本以訓練、部署和調用預測程序。工具
在 ML 項目中,獲取訓練數據一般是一個很是耗時且具備挑戰性的部分。在本例中,咱們須要確保能夠找到一個足夠大的數據集,該數據集包含紐約市餐廳的檢查信息,而且包含正確的屬性。幸運的是,藉助 AWS Data Exchange,咱們能夠開始在產品目錄中搜索數據。本例關注的是紐約市餐廳的質量,所以在搜索欄中輸入 New York Restaurant Data 並篩選出免費數據集。Intellect Design Arena, Inc.提供了一個免費產品,標題爲 NY City Restaurant Data with inspection grade & score (Trial)(包含檢查等級和分數的紐約市餐廳數據 [試用版])。
訂閱數據集後,須要找到一種將數據公開給其餘 AWS 服務的方法。要達到此目的,請選擇訂閱、數據集、修訂、導出到 S3,以將數據導出。當數據位於 S3 中時,能夠下載文件並查看數據,以瞭解所捕獲的特徵。如下屏幕截圖顯示了修訂頁面,咱們可使用「導出到 Amazon S3」按鈕導出數據。
隨後就能夠下載文件並查看內容,以瞭解有多少數據以及捕獲了哪些屬性。在本例中只須要關注三個屬性:行政區(標記爲 BORO)、美食描述和等級。系統會建立一個新文件(僅包含與此用例相關的數據),並將其加載回 S3。使用位於 S3 中的數據,其餘 AWS 服務能夠快速安全地訪問數據。如下屏幕截圖展現了加載文件夾和數據後 S3 存儲桶的樣子。
當前的數據並不知足針對 Amazon SageMaker 訓練數據的要求,所以須要創建提取、轉換、加載(ETL)管道,以將此數據集轉換爲正確的格式。稍後在管道中,將使用 Athena 查詢此數據並生成格式化的訓練集,但目前數據只是存儲桶中的 CSV 文件,咱們須要一種方法與數據進行交互。爲此可使用 AWS Glue 爬網程序掃描數據並生成數據目錄,從而使 Athena 可以查詢 S3 內的數據。有關詳細信息,請參見定義爬網程序。
運行 AWS Glue 爬網程序後,咱們得到了一個數據目錄,Athena 可使用該目錄查詢數據。數據的詳細信息將被捕獲,咱們可經過單擊新建立的數據目錄來查看這些信息。如下屏幕截圖顯示了數據目錄界面,其中包含與咱們的數據相關的全部信息。
至此咱們已將數據集放入 S3,並經過 AWS Glue 爬網程序得到了數據目錄,隨後可使用 Athena 開始查詢和格式化數據。咱們可使用集成的查詢編輯器來生成 SQL 查詢,以便瀏覽和轉換數據。在本例中,咱們建立了 SQL 查詢以生成如下訓練集。這是爲了簡化訓練流程,由於咱們正從基於文本的屬性轉移到基於數字的屬性。當使用線性學習器算法進行多分類訓練時,類標籤必須爲 0 到 N-1 之間的數值,其中 N 是可能的類數。在 Athena 中運行查詢後,能夠下載結果並將新數據集放入 S3 中。如今,咱們能夠開始在 Amazon SageMaker 中訓練模型。請參閱如下代碼:
SELECT boro_data.id AS "boro_label", category_data.id AS "cat_label", class_label FROM data LEFT JOIN boro_data ON data.boro = boro_data.boro LEFT JOIN category_data ON data.cuisine_description = category_data.cuisine_description
SQL 查詢建立了屬性和類標籤的數字表示形式,以下表所示。
至此咱們已得到了乾淨的數據,隨後可使用 Amazon SageMaker 構建、訓練和部署模型。首先,在 Amazon SageMaker 中建立 Jupyter 筆記本,以開始編寫和執行代碼。而後將數據從 S3 導入到 Jupyter 筆記本環境中,並繼續訓練模型。要訓練模型,請使用Amazon SageMaker中包含的線性學習器算法。線性學習器算法爲分類和迴歸問題提供瞭解決方案,但在本文中,咱們將重點關注分類。
如下 Python 代碼顯示了加載、格式化和訓練模型的步驟:
import numpy as np import pandas as pd import boto3 from sklearn.model_selection import train_test_split import sagemaker #declare bucket name and file name bucket = 'qs-demo-bgf' prefix = 'transformed-data-no-header/' fileName = 'transformed_data_no_header.csv' #load data s3 = boto3.resource('s3') KEY = prefix+fileName print(KEY) #load data into jupyter environment s3.Bucket(bucket).download_file(KEY,'transformed_data_no_header.csv') data = pd.read_csv('transformed_data_no_header.csv',dtype='float32').values data_features, data_labels = data[:, :2], data[:, 2] np.random.seed(0) train_features, test_features, train_labels, test_labels = train_test_split( data_features, data_labels, test_size=0.2) # further split the test set into validation and test sets val_features, test_features, val_labels, test_labels = train_test_split( test_features, test_labels, test_size=0.5) # instantiate the LinearLearner estimator object multiclass_estimator = sagemaker.LinearLearner(role=sagemaker.get_execution_role(), train_instance_count=1, train_instance_type='ml.m4.xlarge', predictor_type='multiclass_classifier', num_classes=3) # wrap data in RecordSet objects train_records = multiclass_estimator.record_set(train_features, train_labels, channel='train') val_records = multiclass_estimator.record_set(val_features, val_labels, channel='validation') test_records = multiclass_estimator.record_set(test_features, test_labels, channel='test') # start a training job multiclass_estimator.fit([train_records, val_records, test_records])
訓練做業完成後,能夠將模型部署到實例上。這爲咱們提供了一個用於監聽預測請求的終端節點。請參閱如下 Python 代碼:
# deploy a model hosting endpoint multiclass_predictor = multiclass_estimator.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')
至此咱們已部署了通過訓練的模型,能夠開始調用終端節點以獲取預測。終端節點爲每一個類的類型提供一個分數,並根據最高分數提供一個預測標籤。咱們如今得到了一個可集成到應用程序中的終端節點。
如下 Python 代碼是在 Amazon SageMaker 筆記本中調用終端節點的示例:
import json import boto3 client = boto3.client('runtime.sagemaker') #define a dictionary to map text to numerical values area = { "Queens":1.0, "Staten Island":2.0, "Brooklyn":3.0, "Bronx":4.0, "Manhattan":5.0 } cat = { "Hotdogs/Pretzels":1.0, "Donuts":2.0, "Bangladeshi":3.0, "Caribbean":4.0, "Chicken":5.0 } #assign features to pass to endpoint location = area["Manhattan"] category = cat["Hotdogs/Pretzels"] values = str(location)+','+str(category) #get response from endpoint response = client.invoke_endpoint(EndpointName='linear-learner-2019-11-04-01-57-20-572', ContentType='text/csv', Body=values) #parse the results result = json.loads(response['Body'].read().decode()) predict = result['predictions'][0] print(predict) grade = predict['predicted_label'] if(grade==0.0): letter = "A" elif(grade==1.0): letter = "B" else: letter = "C" #get readable prediction print("\Restaurant Grade: "+letter)
在調用終端節點後,系統將提供響應並將其格式化爲可讀的預測結果。請參閱如下代碼:
{'score': [0.9355735182762146, 0.0486408956348896, 0.01578556001186371], 'predicted_label': 0.0} Restaurant Grade: A
爲防止出現任何持續計費的狀況,咱們應清理資源。先從 AWS Data Exchange 開始,若是訂閱了本示例中使用的數據集,請將訂閱設置爲在一個月試用期結束時終止。刪除存儲本示例中所用數據的全部 S3 存儲桶。刪除因 AWS Glue 爬網程序而建立的 AWS Glue 數據目錄。此外,還要刪除 Amazon SageMaker 筆記本實例和您在部署模型時建立的終端節點。
本文提供了一個示例工做流,該工做流使用 AWS Data Exchange 和 Amazon SageMaker 構建、訓練和部署多分類器。咱們能夠藉助 AWS Data Exchange 使用第三方數據快速啓動 ML 項目,並使用 Amazon SageMake r的內置工具和算法爲 ML 任務建立解決方案。若是處於 ML 項目的早期階段,或者正設法改進現有數據集,請查看 AWS Data Exchange,藉此能夠節省數小時的數據整理時間。
Géron Aurélien。Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems(Scikit-Learn、Keras 和 TensorFlow 機器學習動手實踐:智能系統構建概念、工具和技術)。OReilly,2019 年。
Tan、Pan-Ning 等人。Introduction to Data Mining(數據挖掘簡介)。Pearson,2006 年。