machine learning sagemaker
Cloud

Tutorial Machine Learning dengan AWS SageMaker

AWS SageMaker adalah layanan komputasi machine learning yang disediakan AWS kepada developer untuk build, train dan deploy model machine learning.

Beberapa langkah dalam membuat machine learning pipeline dengan AWS SageMaker adalah

  1. Membuat instance notebook
  2. Menyiapkan data
  3. Training model
  4. Deploy model
  5. Evaluasi kinerja model

Sebenarnya secara umum tahapan dalam machine learning pipeline mirip seperti jika saat kita implementasi secara lokal. Hanya saja dengan AWS SageMaker kita dengan mudah menyiapkan environment untuk machine learning termasuk spesifikasi hardware untuk training data. Pada kasus ini kita akan menggunakan algoritma XGBoost

Oke baiklah… Let’s code

#1 Membuat instance notebook

Pertama adalah menyiapkan instance notebook. Instance notebook adalah environment untuk melakukan coding machine learning pipeline

Jika sudah pernah menggunakan Jupyter Notebook, maka akan lebih familiar

Masuk di AWS console dan pilih AWS SageMaker

Dari dashboard Sagemaker pilih Notebook instances dan pilih Create Notebook Instance

Masukkan nama instance dan tipenya kemudian tekan tombol Create notebook instance

Kemudian buat IAM agar instance dapat mengakses AWS S3. Pada Permissions and encryption pilih create new role

Kemudian pilih any S3 Bucket

Amazon SageMaker akan membuatkan role baru yaitu AmazonSageMaker-ExecutionRole-***

Status awal instance adalah pending, kita tunggu beberapa saat sampai statusnya menjadi InService

#2 Menyiapkan data

Setelah status instance menjadi InService, kita pilih tombol Actions – Open Jupyter

Buat file Python baru dengan memilih New – conda_python3

Kita import terlebih dahulu beberapa libray pendukung dan mendefinisikan IAM Role yang telah kita buat sebelumnya

# 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.")

Kemudian kita bikin bucket misal namanya “sagemakerku

bucket_name = 'sagemakerku' # <--- 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)

Kemudian kita load datanya di pandas 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)

Kita split datanya dengan proposi data training 70% dan data testing 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)

#3 Training model

Setelah data berhasil displit selanjutnya kita akan train data tadi. Sebelum menggunakan  Amazon SageMaker pre-built XGBoost model kita harus preformat header dan kolom pertama terlebih dahulu

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')

Kemudian kita create Instance XGBoost dan definisikan hyperparameternya

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)

Lakukan training

xgb.fit({'train': s3_input_train})

#4 Deploy model

Setelah model telah selesai ditraining, selanjutnya kita akan deploy ke endpoint

xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')

Lakukan prediksi dengan testing data

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)

#5 Evaluasi kinerja model

Selanjutnya kita akan lakukan evaluasi akurasi model yang telah kita training dengan membandingkan label asli dengan prediksinya dalam bentuk confusion matrix

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))

Oke begitulah cara melakukan preprocessing, training, deploy dan evaluasi model dengan AWS SageMaker. Jangan lupa untuk mematikan resource yang digunakan agar tidak dikenakan biaya tambahan

Note : Sumber referensi berasal dari dokumentasi SageMaker

Leave a Reply

Your email address will not be published. Required fields are marked *