建立、訓練和部署機器學習模型

使用 Amazon SageMaker

在本教學中,您將學習如何使用 Amazon SageMaker 建立、訓練和部署機器學習 (ML) 模型。本練習中,我們將使用熱門 XGBoost ML 演算法。Amazon SageMaker 是全受管的模組化機器學習服務,可讓開發人員和資料科學家大規模建立、訓練及部署 ML 模型。

從概念化到生產的 ML 模型通常既複雜又且耗時。您必須管理大量資料以訓練模型,選擇最佳的演算法進行訓練,在訓練模型時管理運算容量,然後將模型部署至生產環境中。Amazon SageMaker 可簡化 ML 模型的建立和部署,進而降低了這種複雜性。從各式各樣的選擇中選擇正確的演算法和框架後,其可管理所有基礎設施,以便訓練 PB 級規模的模型並將其部署至生產中。

在本教學中,假定您的角色是在銀行工作的機器學習開發人員。此時要求您開發一種機器學習模型,用於預測客戶是否會註冊定期存單 (CD)。該模型將使用行銷資料集進行訓練,其中該資料集包含有關客戶人口統計、對行銷事件的回應以及外部因素的資訊。

為了方便起見,已對資料進行了標記,且資料集中有一欄可識別客戶是否已註冊銀行提供的產品。加州大學歐文分校規劃的 ML 資料儲存器已公開提供此資料集的版本。由於已對資料進行了標記,因此本教學實作的是受監督機器學習模型。(如若未標記資料集,則為未受監督學習。)

在本教學中,您將:

  1. 建立筆記本執行個體
  2. 準備資料
  3. 訓練模型從資料中學習
  4. 部署模型
  5. 提升 ML 模型的效能
 
您在本教學建立和使用的資源符合 AWS 免費方案資格。請記得完成步驟 7 並終止您的資源。如果您的帳戶使用這些資源的時間超過兩個月,則向您帳戶收取的費用將少於 0.50 USD。
 

本教學需要 AWS 帳戶

您在本教學建立的資源符合免費方案資格。 

進一步了解免費方案 >>


步驟 1.進入 Amazon SageMaker 主控台

導覽至 Amazon SageMaker 主控台。


按一下這裡,即可在新視窗中開啟 AWS 管理主控台,讓此逐步指南保護開啟狀態。開始在搜尋列中輸入 SageMaker,然後選取 Amazon SageMaker 開啟服務主控台。

build-train-deploy-machine-learning-model-sagemaker-1
build-train-deploy-machine-learning-model-sagemaker-1

(按一下以放大)


步驟 2.建立 Amazon SageMaker 筆記本執行個體

在此步驟中,您將建立 Amazon SageMaker 筆記本執行個體。 


2a.從 Amazon SageMaker 儀表板,選取筆記本執行個體。 

build-train-deploy-machine-learning-model-sagemaker-2a
build-train-deploy-machine-learning-model-sagemaker-2a

(按一下以放大)


2b.在建立筆記本執行個體頁面上,在筆記本執行個體名稱欄位中輸入名稱。本教學使用 MySageMakerInstance 做為執行個體名稱,不過如有需要,您可以選擇其他名稱。

針對本教學,您可以保留 ml.t2.medium 的預設筆記本執行個體類型

若要啟用筆記本執行個體以存取及安全上傳資料至 Amazon S3,必須指定 IAM 角色。在 IAM 角色欄位中,選擇建立新角色,以讓 Amazon SageMaker 建立的角色具有必要的許可並將其分配給您的執行個體。或者,您還可以為此在您的帳戶中選擇一個現有的 IAM 角色。

build-train-deploy-machine-learning-model-sagemaker-2b
build-train-deploy-machine-learning-model-sagemaker-2b

(按一下以放大)


2c.在建立 IAM 角色方塊中,選取任何 S3 儲存貯體。 此可讓 Amazon SageMaker 執行個體存取您帳戶中的所有 S3 儲存貯體。在本教學的後面部分,您將建立一個新的 S3 儲存貯體。不過,如果您有想要改用的儲存貯體,請選取特定 S3 儲存貯體並指定儲存貯體的名稱。

選擇建立角色

build-train-deploy-machine-learning-model-sagemaker-2c
build-train-deploy-machine-learning-model-sagemaker-2c

(按一下以放大)


2d.注意,Amazon SageMaker 為您建立了一個名為 AmazonSageMaker-ExecutionRole-*** 的角色。

針對本教學,我們將使用其他欄位的預設值。選擇建立筆記本執行個體

build-train-deploy-machine-learning-model-sagemaker-2d
build-train-deploy-machine-learning-model-sagemaker-2d

(按一下以放大)


2e.在筆記本執行個體頁面上,您應該會看到您的新 MySageMakerInstance 筆記本執行個體處於待處理狀態。

您的筆記本執行個體應在不到兩分鐘內從待處理轉換到服務中狀態。

build-train-deploy-machine-learning-model-sagemaker-2e
build-train-deploy-machine-learning-model-sagemaker-2e

(按一下以放大)


步驟 3.準備資料

在此步驟中,您將使用 Amazon SageMaker 筆記本預處理訓練機器學習模型所需的資料。


3a.在筆記本執行個體頁面上,等待 MySageMakerInstance待處理轉換到服務中狀態。

狀態變為服務中後,選取 MySageMakerInstance 並使用動作下拉式功能表將其開啟,或選擇服務中狀態旁的開啟 Jupyter

build-train-deploy-machine-learning-model-sagemaker-3a
build-train-deploy-machine-learning-model-sagemaker-3a

(按一下以放大)

build-train-deploy-machine-learning-model-sagemaker-3a1
build-train-deploy-machine-learning-model-sagemaker-3a1

(按一下以放大)


3b.開啟 Jupyter 後檔案標籤,選擇新增,然後選擇 conda_python3。 

build-train-deploy-machine-learning-model-sagemaker-3b
build-train-deploy-machine-learning-model-sagemaker-3b

(按一下以放大)


3c.若要準備資料、訓練 ML 模型並進行部署,您將需要匯入一些程式庫並定義您的 Jupyter 筆記本環境中的一些環境變數。複製以下程式碼至您的執行個體的程式碼儲存格,然後選取執行

執行程式碼時,方括號之間會顯示 *,如右側的第一個螢幕擷取畫面所示。幾秒鐘後,將完成程式碼執行,* 將被取代為數字 1,且您將看到一則成功訊息,如右側的第二個螢幕擷取畫面所示。 

# import libraries
import boto3, re, sys, math, json, os, sagemaker, urllib.request
from sagemaker import get_execution_role
import numpy as np                                
import pandas as pd                               
import matplotlib.pyplot as plt                   
from IPython.display import Image                 
from IPython.display import display               
from time import gmtime, strftime                 
from sagemaker.predictor import csv_serializer   

# Define IAM role
role = get_execution_role()
prefix = 'sagemaker/DEMO-xgboost-dm'
containers = {'us-west-2': '433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest',
              'us-east-1': '811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest',
              'us-east-2': '825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest',
              'eu-west-1': '685385470294.dkr.ecr.eu-west-1.amazonaws.com/xgboost:latest'} # each region has its XGBoost container
my_region = boto3.session.Session().region_name # set the region of the instance
print("Success - the MySageMakerInstance is in the " + my_region + " region. You will use the " + containers[my_region] + " container for your SageMaker endpoint.")
build-train-deploy-machine-learning-model-sagemaker-3c-1
build-train-deploy-machine-learning-model-sagemaker-3c-1

(按一下以放大)

build-train-deploy-machine-learning-model-sagemaker-3c-2

(按一下以放大)

build-train-deploy-machine-learning-model-sagemaker-3c-2

3d.在此步驟中,您將建立一個 S3 儲存貯體,而該儲存貯體可存放您於本教學中的資料。

複製以下程式碼至您筆記本中的下個程式碼儲存格,然後變更 S3 儲存貯體的名稱以使其為唯一。S3 儲存貯體名稱必須為全域唯一的並且具有一些其他限額和限制

選取執行。如果沒有收到成功訊息,則請變更儲存貯體名稱消息,然後重試。

 

bucket_name = 'your-s3-bucket-name' # <--- CHANGE THIS VARIABLE TO A UNIQUE NAME FOR YOUR BUCKET
s3 = boto3.resource('s3')
try:
    if  my_region == 'us-east-1':
      s3.create_bucket(Bucket=bucket_name)
    else: 
      s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region })
    print('S3 bucket created successfully')
except Exception as e:
    print('S3 error: ',e)
build-train-deploy-machine-learning-model-sagemaker-3d
build-train-deploy-machine-learning-model-sagemaker-3d

(按一下以放大)


3e.接下來,您需要將資料下載至您的 Amazon SageMaker 執行個體並將其載入至 dataframe 中。複製並執行以下程式碼:

try:
  urllib.request.urlretrieve ("https://d1.awsstatic.com/tmt/build-train-deploy-machine-learning-model-sagemaker/bank_clean.27f01fbbdf43271788427f3682996ae29ceca05d.csv", "bank_clean.csv")
  print('Success: downloaded bank_clean.csv.')
except Exception as e:
  print('Data load error: ',e)

try:
  model_data = pd.read_csv('./bank_clean.csv',index_col=0)
  print('Success: Data loaded into dataframe.')
except Exception as e:
    print('Data load error: ',e)
build-train-deploy-machine-learning-model-sagemaker-3e
build-train-deploy-machine-learning-model-sagemaker-3e

(按一下以放大)


3f.現在,我們將隨機顯示資料並將其分割為訓練資料和測試資料。

訓練資料 (70% 的客戶) 將在模型訓練迴圈中使用。我們將使用梯度優化法來反覆精簡模型參數。梯度優化法是一種利用模型損失函數的梯度來尋找模型參數值的方法,而該參數值可將模型錯誤降至最低。

測試資料 (剩餘 30% 的客戶) 將用於評估模型的效能,以及衡量訓練模型一般化未顯示資料的能力。

複製以下程式碼至新程式碼儲存格,然後選取執行以隨機顯示和分割資料:

train_data, test_data = np.split(model_data.sample(frac=1, random_state=1729), [int(0.7 * len(model_data))])
print(train_data.shape, test_data.shape)
build-train-deploy-machine-learning-model-sagemaker-3f
build-train-deploy-machine-learning-model-sagemaker-3f

(按一下以放大)


步驟 4.從資料中訓練模型

在此步驟中,您將使用訓練資料集來訓練您的機器學習模型。 


4a.若要使用 Amazon SageMaker 預先建置 XGBoost 模型,您將需要重新格式化訓練資料的標題和第一欄,並從 S3 儲存貯體載入資料。

複製以下程式碼至新程式碼儲存格,然後選取執行以重新格式化和載入資料:

pd.concat([train_data['y_yes'], train_data.drop(['y_no', 'y_yes'], axis=1)], axis=1).to_csv('train.csv', index=False, header=False)
boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('train.csv')
s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket_name, prefix), content_type='csv')

4b.接下來,您需要設定 Amazon SageMaker 工作階段,建立 XGBoost 模型 (估算器) 的執行個體例,並定義模型的超參數。複製以下程式碼至新程式碼儲存格,然後選取執行

sess = sagemaker.Session()
xgb = sagemaker.estimator.Estimator(containers[my_region],role, train_instance_count=1, train_instance_type='ml.m4.xlarge',output_path='s3://{}/{}/output'.format(bucket_name, prefix),sagemaker_session=sess)
xgb.set_hyperparameters(max_depth=5,eta=0.2,gamma=4,min_child_weight=6,subsample=0.8,silent=0,objective='binary:logistic',num_round=100)

4c.載入資料並設定 XGBoost 估算器後,複製以下程式碼至下一個程式碼儲存格及選取執行,進而使用 ml.m4.xlarge 執行個體上的梯度優化來訓練模型。

幾分鐘後,您應該能開始查看產生的訓練日誌。

xgb.fit({'train': s3_input_train})
build-train-deploy-machine-learning-model-sagemaker-4c
build-train-deploy-machine-learning-model-sagemaker-4c

(按一下以放大)


步驟 5.部署模型

在此步驟中,您將訓練後的模型部署到端點,重新格式化後加入 CSV 資料,然後執行模型以建立預測。


5a.要在伺服器上部署模型並建立您可存取的端點,複製以下程式碼至下一個程式碼儲存格,然後選取執行

xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')
build-train-deploy-machine-learning-model-sagemaker-5a
build-train-deploy-machine-learning-model-sagemaker-5a

(按一下以放大)


5b.要預測測試資料上的客戶是否已註冊銀行產品,複製以下程式碼至下一個程式碼儲存格,然後選取執行

test_data_array = test_data.drop(['y_no', 'y_yes'], axis=1).values #load the data into an array
xgb_predictor.content_type = 'text/csv' # set the data type for an inference
xgb_predictor.serializer = csv_serializer # set the serializer type
predictions = xgb_predictor.predict(test_data_array).decode('utf-8') # predict!
predictions_array = np.fromstring(predictions[1:], sep=',') # and turn the prediction into an array
print(predictions_array.shape)
build-train-deploy-machine-learning-model-sagemaker-5b
build-train-deploy-machine-learning-model-sagemaker-5b

(按一下以放大)


步驟 6.評估模型效能

在此步驟中,您將評估機器學習模型的效能和準確性。


6a.複製並貼上以下程式碼,然後選取執行,以對比名為 confusion matrix 資料表中的實際值和預測值。

根據預測,我們可以得出結論,您在測試資料中準確地預測了 90% 的客戶將註冊定期存單,其中對於註冊的客戶,準確性為 65% (278/429),而對於未註冊的客戶,準確率為 90% (10,785/11,928)。

cm = pd.crosstab(index=test_data['y_yes'], columns=np.round(predictions_array), rownames=['Observed'], colnames=['Predicted'])
tn = cm.iloc[0,0]; fn = cm.iloc[1,0]; tp = cm.iloc[1,1]; fp = cm.iloc[0,1]; p = (tp+tn)/(tp+tn+fp+fn)*100
print("\n{0:<20}{1:<4.1f}%\n".format("Overall Classification Rate: ", p))
print("{0:<15}{1:<15}{2:>8}".format("Predicted", "No Purchase", "Purchase"))
print("Observed")
print("{0:<15}{1:<2.0f}% ({2:<}){3:>6.0f}% ({4:<})".format("No Purchase", tn/(tn+fn)*100,tn, fp/(tp+fp)*100, fp))
print("{0:<16}{1:<1.0f}% ({2:<}){3:>7.0f}% ({4:<}) \n".format("Purchase", fn/(tn+fn)*100,fn, tp/(tp+fp)*100, tp))
build-train-deploy-machine-learning-model-sagemaker-6a
build-train-deploy-machine-learning-model-sagemaker-6a

(按一下以放大)


步驟 7.終止您的資源

在此步驟中,您將終止您的 Amazon SageMaker 相關資源。

重要:終止非使用中的資源可降低成本,這是最佳實務。未終止資源將會產生費用。


7a.要刪除 Amazon SageMaker 端點和您 S3 儲存貯體中的物件,複製、貼上並執行以下程式碼:  

sagemaker.Session().delete_endpoint(xgb_predictor.endpoint)
bucket_to_delete = boto3.resource('s3').Bucket(bucket_name)
bucket_to_delete.objects.all().delete()
build-train-deploy-machine-learning-model-sagemaker-7a
build-train-deploy-machine-learning-model-sagemaker-7a

(按一下以放大)


恭喜您!

您已了解如何使用 Amazon SageMaker 來準備、訓練、部署和評估機器學習模型。Amazon SageMaker 可用來輕鬆建立 ML 模型,並提供快速連接至訓練資料所需的一切元件,還能針對您的應用程式選取最適合的演算法與架構,同時亦可管理所有底層的基礎設施,讓您能訓練 PB 級規模的模型。


 

進一步了解

Amazon SageMaker 隨附預先建置的機器學習演算法,可適用於各種使用案例。進一步了解有關使用 Amazon SageMaker 隨附的內建演算法的資訊。 

深入探究

您可以在 Amazon SageMaker 中搭配使用 Machine Learning 與自動模型調校。這樣一來,您便可自動調校您模型中的超參數,從而實現最佳結果。查閱文件了解自動模型調校,並閱讀本部落格文章深入了解此功能。 

查看運作情形

Amazon SageMaker 提供了許多範本筆記本,這些筆記本可用於處理機器學習的許多常用案例。請前往 GitHub 查看!