哪些餐廳評價最高?實例上手,瞭解機器學習工做流的構建

專屬圖1.png

機器學習工做流是一個迭代過程,須要作出許多決策,例如是否須要訓練數據、要捕獲哪些屬性、要使用哪些算法和在何處部署通過訓練的模型。全部這些決策都將影響學習系統的結果。html

在明確上述問題後,咱們還必須從下列四種不一樣類型的學習系統中選擇所需的學習系統:算法

  • 監督學習:在監督學習中,訓練集包含標籤,所以在給定一組屬性的狀況下,算法能知道哪一個是正確的標籤。例如,屬性能夠是魚的顏色和重量,而標籤是魚的類型。最終,模型將學習如何分配正確的或最有可能的標籤。典型的監督學習任務是分類,即將文本或圖像等輸入分配給多個預約義類別之一。示例包括根據郵件標題和內容檢測垃圾郵件,根據 MRI 掃描結果將細胞歸類爲惡性或良性細胞,以及根據形狀對星系進行分類(Tan 等人,2006年)。這類算法一般包括k近鄰、線性迴歸、邏輯迴歸、支持向量機和神經網絡。
  • 無監督學習:無監督式學習使用算法來發現無標籤數據中的關係。算法必須可以探索數據並根據已知特性查找關係。非監督式學習經常使用的一些算法包括聚類(K-means、DBSCAN 和層次聚類分析,它們對類似數據點進行分組)、異常檢測(找出異常值)和關聯規則學習(發現特徵之間的關聯)(Aurélien 2019)。在實踐中,能夠經過基於犯罪率將城市聚類來了解哪些城市是類似的,或者根據顧客年齡對雜貨店商品進行聚類來發現模式。
  • 半監督學習:半監督學習使用的訓練數據由有標籤數據和無標籤數據組成。算法一般是無監督學習算法和監督學習算法的組合。若是有一個數據集,其中包含無標籤數據,則第一步是爲數據添加標籤。數據集添加標籤後,可使用傳統的監督學習方法訓練算法,將特徵映射到已知標籤。照片託管服務一般使用此工做流,首先須要標記未知面孔,一旦人臉被識別,另外一種算法能夠掃描全部照片以識別如今已知的面孔。
  • 強化學習:強化學習(RL)不一樣於上述學習系統,由於它沒必要從訓練數據中學習。相反,該模型從其在明肯定義的環境中得到的經驗學習。該學習系統稱爲代理,代理能夠觀察環境,根據策略選擇和執行操做,並得到獎勵。隨着時間的推移,代理最終學會根據之前的經驗得到最大獎勵。有關RL的更多信息,請參閱 Amazon SageMaker RL 中的相關文檔。

其中有些學習系統徹底依賴訓練數據,而另外一些則根本不須要訓練數據,而是須要一個明肯定義的環境和行動空間。當算法依賴於訓練數據時,最終模型的質量和靈敏度在很大程度上取決於訓練集的特徵。正因如此,許多人進入了一個繁瑣的循環:試圖找到合理的功能平衡,從而得到一個均衡且準確的模型。
得益於諸如 Amazon SageMakerAWS Data Exchange 等雲服務,如今實施機器學習(ML)比以往更容易。本文將介紹如何使用 AWS Data Exchange 和 Amazon SageMaker 構建模型,以預測紐約市餐廳的餐廳等級。咱們將使用 AWS Data Exchange 中的數據集(包含23372個餐廳檢查等級和分數)和 Amazon SageMaker 中的線性學習器算法訓練和部署模型。json

構建餐廳等級預測模型的步驟

  1. 在開始 ML 項目時,必需要考慮整個流程,而不只僅是最終產品。在此項目中,咱們將執行如下步驟:
  2. 明確要解決的問題。在本例中,咱們但願根據清潔度作出在紐約市哪一個餐廳用餐的更明智選擇。
  3. 找到用於訓練模型的數據集。咱們須要一個數據集,其中包含紐約市的餐廳檢查等級和分數。
  4. 查看數據。咱們但願確保所需的數據存在,而且有足夠的數據來訓練模型。
  5. 準備並清理數據集,以便在 Amazon SageMaker 中進行訓練。咱們但願僅包含所需的數據,例如「行政區」和「食品類別」,並確保使用正確的格式。
  6. 選擇多分類模型。在本例中,咱們將使用線性學習器算法進行訓練。
  7. 將模型部署到 Amazon SageMaker,隨後便可調用終端節點以獲取預測。

數據是機器學習的基礎,最終模型的質量取決於用於訓練的數據的質量。在咱們的工做流中,一半步驟與數據收集和準備有關。這一主題在大多數ML項目中均可以看到,一般是最具挑戰性的部分。另外還必須考慮數據的特徵,以防止模型過於敏感或者不夠敏感。此外,並不是全部數據都是內部數據。咱們可能必須使用免費或付費的第三方數據來擴充內部數據集並提升模型的質量,但多年來,查找、受權和使用此類第三方數據一直是一個難題。幸運的是,咱們如今可使用 AWS Data Exchange。安全

使用 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

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 問題,如今能夠開始着手構建多分類器了。機器學習

解決方案概覽

本文的解決方案產生了一個多分類器,能夠根據行政區和食品類別預測紐約市的餐廳等級。下圖顯示了完整架構。編輯器

sagemaker-dataexchange-1.gif

首先,從 AWS Data Exchange 獲取數據,而後將其放入 S3 存儲桶中。將一個 AWS Glue 爬網程序指向它,以建立數據的數據目錄。在數據目錄就緒的狀況下,使用 Amazon Athena 查詢、清理和格式化數據,以準備進行訓練。數據轉換後,將訓練集加載回 S3。最後,在 Amazon SageMaker 中建立 Jupyter 筆記本以訓練、部署和調用預測程序。工具

將數據存儲在 S3 中

在 ML 項目中,獲取訓練數據一般是一個很是耗時且具備挑戰性的部分。在本例中,咱們須要確保能夠找到一個足夠大的數據集,該數據集包含紐約市餐廳的檢查信息,而且包含正確的屬性。幸運的是,藉助 AWS Data Exchange,咱們能夠開始在產品目錄中搜索數據。本例關注的是紐約市餐廳的質量,所以在搜索欄中輸入 New York Restaurant Data 並篩選出免費數據集。Intellect Design Arena, Inc.提供了一個免費產品,標題爲 NY City Restaurant Data with inspection grade & score (Trial)(包含檢查等級和分數的紐約市餐廳數據 [試用版])。

sagemaker-dataexchange-2.gif

訂閱數據集後,須要找到一種將數據公開給其餘 AWS 服務的方法。要達到此目的,請選擇訂閱、數據集、修訂、導出到 S3,以將數據導出。當數據位於 S3 中時,能夠下載文件並查看數據,以瞭解所捕獲的特徵。如下屏幕截圖顯示了修訂頁面,咱們可使用「導出到 Amazon S3」按鈕導出數據。

sagemaker-dataexchange-3.gif

隨後就能夠下載文件並查看內容,以瞭解有多少數據以及捕獲了哪些屬性。在本例中只須要關注三個屬性:行政區(標記爲 BORO)、美食描述和等級。系統會建立一個新文件(僅包含與此用例相關的數據),並將其加載回 S3。使用位於 S3 中的數據,其餘 AWS 服務能夠快速安全地訪問數據。如下屏幕截圖展現了加載文件夾和數據後 S3 存儲桶的樣子。

sagemaker-dataexchange-4.gif

使用 AWS Glue 爬網程序建立數據目錄

當前的數據並不知足針對 Amazon SageMaker 訓練數據的要求,所以須要創建提取、轉換、加載(ETL)管道,以將此數據集轉換爲正確的格式。稍後在管道中,將使用 Athena 查詢此數據並生成格式化的訓練集,但目前數據只是存儲桶中的 CSV 文件,咱們須要一種方法與數據進行交互。爲此可使用 AWS Glue 爬網程序掃描數據並生成數據目錄,從而使 Athena 可以查詢 S3 內的數據。有關詳細信息,請參見定義爬網程序

運行 AWS Glue 爬網程序後,咱們得到了一個數據目錄,Athena 可使用該目錄查詢數據。數據的詳細信息將被捕獲,咱們可經過單擊新建立的數據目錄來查看這些信息。如下屏幕截圖顯示了數據目錄界面,其中包含與咱們的數據相關的全部信息。

sagemaker-dataexchange-5.gif

在 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 查詢建立了屬性和類標籤的數字表示形式,以下表所示。

8.png

在 Amazon SageMaker 中訓練和部署模型

至此咱們已得到了乾淨的數據,隨後可使用 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')

調用 Amazon SageMaker 終端節點

至此咱們已部署了通過訓練的模型,能夠開始調用終端節點以獲取預測。終端節點爲每一個類的類型提供一個分數,並根據最高分數提供一個預測標籤。咱們如今得到了一個可集成到應用程序中的終端節點。

如下 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 年。

底圖2.png

相關文章
相關標籤/搜索