시작하기 / 실습 / ...

로컬로 기계 학습 모델 구축 및 훈련

자습서

개요

이 자습서에서는 Amazon SageMaker Studio 노트북 내에서 로컬로 기계 학습(ML) 모델을 구축하고 훈련하는 방법을 알아봅니다.

Amazon SageMaker Studio는 ML을 위한 통합 개발 환경(IDE)으로, 엔드 투 엔드 ML 수명 주기 태스크를 수행할 수 있는 완전관리형 Jupyter Notebook 인터페이스를 제공합니다. SageMaker Studio를 사용하면 데이터 세트를 생성 및 탐색하고, 훈련 데이터를 준비하며, 모델을 구축 및 훈련한 후 추론에 사용할 훈련된 모델을 배포하는 모든 태스크를 한 장소에서 수행할 수 있습니다.

전체 데이터 세트로 훈련하기 전에 데이터 세트의 샘플을 탐색하고 여러 모델 및 파라미터 구성에 걸쳐 반복하는 것은 기계 학습 개발에서 일반적인 방식입니다. 이 탐색 단계에서 Amazon SageMaker는 본격적인 훈련 작업을 실행하기 전에 훈련 로직을 테스트하고, 다양한 모델링 접근 방식을 시도하고, 모델 성능을 측정할 수 있는 로컬 모드를 제공합니다.

이 자습서에서는 가상의 자동차 보험 청구 데이터 세트를 사용합니다. 훈련 및 테스트 데이터 세트를 입력으로 사용합니다. 각 데이터 세트에는 청구 및 고객 세부 정보와 추출된 특성과 함께 청구의 사기 여부를 나타내는 fraud 열이 포함됩니다. 학습자는 오픈 소스 XGBoost 프레임워크를 사용하여 이 가상의 데이터 세트를 기반으로 청구의 사기 가능성을 예측하는 바이너리 분류 모델을 프로토타이핑하게 됩니다.

학습 목표

이 가이드에서는 다음을 수행합니다.

  • Amazon S3에서 Amazon SageMaker로 훈련 데이터 수집
  • XGBoost 모델을 로컬로 구축 및 훈련
  • 훈련된 모델과 아티팩트를 Amazon S3에 저장

사전 요구 사항

이 가이드를 시작하기 전에 필요한 사항은 다음과 같습니다.

  • AWS 계정: 아직 계정이 없는 경우 AWS 환경 설정 시작하기 가이드를 참조하여 만들 수 있습니다.

 AWS 경험

초보자

 소요 시간

15분

 완료 비용

이 자습서의 예상 비용은 SageMaker 요금을 참조하세요.

 필요 사항

AWS 계정에 로그인해야 합니다.

 사용 서비스

Amazon SageMaker Studio

 최종 업데이트 날짜

2022년 7월 7일

구현

1단계: Amazon SageMaker Studio 도메인 설정

Amazon SageMaker를 사용할 때는 콘솔에서 시각적으로 모델을 배포하거나 SageMaker Studio 또는 SageMaker 노트북에서 프로그래밍 방식으로 배포할 수 있습니다. 이 자습서에서는 SageMaker Studio 노트북을 사용하여 프로그래밍 방식으로 모델을 배포하며 SageMaker Studio 도메인이 필요합니다.

AWS 계정은 리전당 1개의 SageMaker Studio 도메인만 설정할 수 있습니다. 미국 동부(버지니아 북부) 리전에 이미 SageMaker Studio 도메인이 있는 경우 SageMaker Studio 설정 가이드에 따라 필요한 AWS IAM 정책을 SageMaker Studio 계정에 연결한 다음 1단계를 건너뛰고 2단계로 바로 넘어가세요. 

기존 SageMaker Studio 도메인이 없는 경우 1단계를 계속 진행하여 AWS CloudFormation 템플릿을 실행합니다. 그러면 SageMaker Studio 도메인이 생성되고 이 자습서의 나머지 부분에 필요한 권한이 추가됩니다.

AWS CloudFormation 스택 링크를 선택합니다. 이 링크를 누르면 AWS CloudFormation 콘솔이 열리고 SageMaker Studio 도메인과 studio-user라는 이름의 사용자가 생성됩니다. 또한 필요한 권한이 SageMaker Studio 계정에 추가됩니다. CloudFormation 콘솔에서 미국 동부(버지니아 북부)(US East (N. Virginia))가 오른쪽 위에 표시된 리전인지 확인합니다. 스택 이름(Stack name)CFN-SM-IM-Lambda-catalog여야 하며 변경할 수 없습니다. 이 스택은 모든 리소스를 생성하는 데 약 10분이 걸립니다.

이 스택은 퍼블릭 VPC가 계정에 이미 설정되어 있는 것으로 가정합니다. 퍼블릭 VPC가 없는 경우 단일 퍼블릭 서브넷이 있는 VPC를 참조하여 퍼블릭 VPC 생성 방법에 대해 알아보세요. 

AWS CloudFormation이 IAM 리소스를 생성할 수 있음을 동의합니다(I acknowledge that AWS CloudFormation might create IAM resources)를 선택하고 스택 생성(Create stack)을 선택합니다.

CloudFormation 창에서 스택(Stacks)을 선택합니다. 스택이 생성되는 데 약 10분이 걸립니다. 스택이 생성되면 스택 상태가 CREATE_IN_PROGRESS에서 CREATE_COMPLETE로 바뀝니다. 

2단계: SageMaker Studio 노트북 설정

이 단계에서는 새 SageMaker Studio 노트북을 시작하고 필요한 오픈 소스 라이브러리를 설치한 다음 Amazon Simple Storage Service(S3)와 같은 다른 서비스와의 상호 작용에 필요한 SageMaker 변수를 설정합니다.

SageMaker Studio를 콘솔 검색 창에 입력하고 SageMaker Studio를 선택합니다.

SageMaker 콘솔의 오른쪽 위에 있는 리전(Region) 드롭다운 목록에서 미국 동부(버지니아 북부)(US East (N. Virginia))를 선택합니다. 앱 시작(Launch app)에서 Studio를 선택하고 studio-user 프로필을 사용하여 SageMaker Studio를 엽니다.

SageMaker Studio 인터페이스를 엽니다. 탐색 모음에서 파일(File)새로 만들기(New)노트북(Notebook)을 선택합니다. 

노트북 환경 설정(Set up notebook environment) 대화 상자의 이미지(Image)에서 데이터 과학(Data Science)을 선택합니다. Python 3 커널이 자동으로 선택됩니다. 선택(Select)을 선택합니다. 

노트북의 오른쪽 위에 있는 커널(kernel)에 이제 Python 3(데이터 과학)(Python 3 (Data Science))이 표시됩니다.

다음 코드 조각을 복사하여 노트북의 셀에 붙여 넣고, Shift+Enter를 눌러 현재 셀을 실행하여 여러 AWS 서비스와 상호 작용하는 API인 aiobotocore 라이브러리를 업데이트하고 XGBoost 라이브러리를 설치합니다. 커널을 다시 시작하라는 경고 또는 모든 종속성 충돌 오류를 무시합니다.

%pip install --upgrade -q aiobotocore
%pip install -q  xgboost==1.3.1

또한 S3 클라이언트 객체와 기본 S3 버킷 내의 위치(지표 및 모델 아티팩트와 같은 콘텐츠가 업로드되는 위치)를 인스턴스화해야 합니다. 그렇게 하려면 다음 코드 블록 복사하여 붙여 넣고 셀을 실행합니다. 쓰기 버킷 이름은 SageMaker 세션 객체에서 파생되는 것을 알 수 있습니다. 기본 버킷의 이름은 sagemaker-<your-Region>-<your-account-id>입니다. 이 버킷에 모든 훈련 아티팩트가 업로드됩니다. 훈련에 사용하는 데이터 세트는 읽기 버킷으로 지정된 퍼블릭 S3 버킷(sagemaker-sample-files)에 있습니다. 버킷에서의 위치는 읽기 접두사를 통해 지정됩니다.

import pandas as pd
import boto3
import sagemaker
import json
import joblib
import xgboost as xgb
from sklearn.metrics import roc_auc_score

# Set SageMaker and S3 client variables
sess = sagemaker.Session()

region = sess.boto_region_name
s3_client = boto3.client("s3", region_name=region)

sagemaker_role = sagemaker.get_execution_role()

# Set read and write S3 buckets and locations
write_bucket = sess.default_bucket()
write_prefix = "fraud-detect-demo"

read_bucket = "sagemaker-sample-files"
read_prefix = "datasets/tabular/synthetic_automobile_claims" 

train_data_key = f"{read_prefix}/train.csv"
test_data_key = f"{read_prefix}/test.csv"
model_key = f"{write_prefix}/model"
output_key = f"{write_prefix}/output"

train_data_uri = f"s3://{read_bucket}/{train_data_key}"
test_data_uri = f"s3://{read_bucket}/{test_data_key}"

3단계: XGBoost 모델 훈련

이 단계에서는 가상 자동차 보험 청구 데이터 세트에 대한 XGBoost 바이너리 분류 모델을 설정하고 훈련하며, 모델의 성능을 평가합니다. fraud라는 열을 대상 열로 사용합니다. 여기서 목표는 사기성 보험금 청구를 합법적인 보험금 청구와 구분하고 기준 모델 성능을 측정할 수 있는 XGBoost 바이너리 분류기를 훈련하는 것입니다.


오픈 소스 XGBoost 프레임워크는 모델 성능을 제어하는 데 사용할 수 있는 다양한 하이퍼파라미터를 제공합니다. 이 자습서에서는 편의상 중요한 하이퍼파라미터 몇 개만 설정하고 수신기 조작 특성 - 곡선 영역(ROC-AUC) 아래의 영역을 평가 지표로 선택합니다. 다음 코드 블록을 복사해 셀에 붙여 넣고 실행하여 XGBoost 모델을 교차 검증하고 훈련합니다. 

hyperparams = {
                "max_depth": 3,
                "eta": 0.2,
                "objective": "binary:logistic",
                "subsample" : 0.8,
                "colsample_bytree" : 0.8,
                "min_child_weight" : 3
              }

num_boost_round = 100
nfold = 3
early_stopping_rounds = 10



# Set up data input
label_col = "fraud"
data = pd.read_csv(train_data_uri)

# Read training data and target
train_features = data.drop(label_col, axis=1)
train_label = pd.DataFrame(data[label_col])
dtrain = xgb.DMatrix(train_features, label=train_label)

# Cross-validate on training data
cv_results = xgb.cv(
    params=hyperparams,
    dtrain=dtrain,
    num_boost_round=num_boost_round,
    nfold=nfold,
    early_stopping_rounds=early_stopping_rounds,
    metrics=["auc"],
    seed=10,
)


metrics_data = {
    "binary_classification_metrics": {
        "validation:auc": {
            "value": cv_results.iloc[-1]["test-auc-mean"],
            "standard_deviation": cv_results.iloc[-1]["test-auc-std"]
        },
        "train:auc": {
            "value": cv_results.iloc[-1]["train-auc-mean"],
            "standard_deviation": cv_results.iloc[-1]["train-auc-std"]
        },
    }
}


print(f"Cross-validated train-auc:{cv_results.iloc[-1]['train-auc-mean']:.2f}")
print(f"Cross-validated validation-auc:{cv_results.iloc[-1]['test-auc-mean']:.2f}")

셀을 실행하고 나면 교차 검증된 훈련 및 검증 AUC 점수가 표시됩니다. 모델 구축 프로세스의 확률적 특성으로 인해 점수에 약간의 차이가 있을 수 있습니다. 하지만 훈련과 테스트 성능의 차이는 선택한 하이퍼파라미터 조합이 주어졌을 때 모델이 훈련 데이터 세트를 과적합할 가능성이 높다는 것을 나타냅니다. 데이터 사이언티스트는 이러한 인사이트를 사용하여 본격적인 훈련 전에 모델을 세부적으로 조정할 수 있습니다.

교차 검증된 성능을 측정했으면, 여러 개의 fold에 걸쳐 훈련 데이터 세트를 분할하는 대신, 조기 중지를 위해 테스트 세트를 사용하면서 전체 훈련 데이터 세트에 대해 모델을 재훈련할 수 있습니다. 조기 중지는 모델 복잡성을 제어하고 과적합을 줄이는데 도움이 됩니다. 다음 코드 블록을 복사하고 붙여 넣어 훈련 및 테스트 데이터 세트에 대해 재훈련하고 평가합니다. 로컬 모드에서 재훈련은 데이터 세트를 Amazon S3에서 로컬 SageMaker Studio 인스턴스 환경으로 가져오는 것을 의미합니다. 따라서 SageMaker Studio 인스턴스에 데이터를 로컬로 저장하기에 충분한 공간이 있어야 합니다.

data = pd.read_csv(test_data_uri)
test_features = data.drop(label_col, axis=1)
test_label = pd.DataFrame(data[label_col])
dtest = xgb.DMatrix(test_features, label=test_label)

model = (xgb.train(params=hyperparams, dtrain=dtrain, evals = [(dtrain,'train'), (dtest,'eval')], num_boost_round=num_boost_round, 
                  early_stopping_rounds=early_stopping_rounds, verbose_eval = 0)
        )

# Test model performance on train and test sets
test_pred = model.predict(dtest)
train_pred = model.predict(dtrain)

test_auc = roc_auc_score(test_label, test_pred)
train_auc = roc_auc_score(train_label, train_pred)

print(f"Train-auc:{train_auc:.2f}, Test-auc:{test_auc:.2f}")

이로써 자동차 보험 청구 데이터 세트에 대한 바이너리 분류 모델의 훈련 및 평가가 끝났습니다. 다음 코드 블록을 복사하여 붙여 넣으면 평가 지표를 JSON 파일로, 훈련된 모델을 pickle 파일로 각각 저장할 수 있습니다. 이 코드는 SageMaker Studio의 로컬 디렉터리뿐만 아니라 기본 S3 버킷에도 저장합니다.

# Save model and performance metrics locally

with open("./metrics.json", "w") as f:
    json.dump(metrics_data, f)

with open("./xgboost-model", "wb") as f:
    joblib.dump(model, f)    
    
# Upload model and performance metrics to S3

metrics_location = output_key + "/metrics.json"
model_location = model_key + "/xgboost-model"

s3_client.upload_file(Filename="./metrics.json", Bucket=write_bucket, Key=metrics_location)
s3_client.upload_file(Filename="./xgboost-model", Bucket=write_bucket, Key=model_location)

4단계: 리소스 정리

사용하지 않는 리소스를 삭제하여 의도하지 않은 비용이 부과되지 않도록 하는 것이 모범 사례입니다.

S3 버킷을 삭제하려면 다음을 수행합니다. 

  • Amazon S3 콘솔을 엽니다. 탐색 모음에서 버킷(Buckets), sagemaker-<your-Region>-<your-account-id>,를 선택한 다음 fraud-detect-demo 옆의 확인란을 선택합니다. 그런 다음 삭제(Delete)를 선택합니다. 
  • 객체 삭제(Delete objects) 대화 상자에서 삭제할 객체를 올바르게 선택했는지 확인하고 이 객체를 영구적으로 삭제(Permanently delete objects) 확인 입력란에 영구 삭제(permanently delete)를 입력합니다. 
  • 완료되면 버킷이 비워지고 동일한 절차를 다시 사용하여sagemaker-<your-Region>-<your-account-id> 버킷을 삭제할 수 있습니다.

이 자습서에서 노트북 이미지를 실행하는 데 사용된 데이터 과학(Data Science) 커널은 커널을 중지하거나 다음 단계를 수행하여 앱을 삭제할 때까지 변경 사항을 누적합니다. 자세한 내용은 Amazon SageMaker 개발자 안내서에서 리소스 종료를 참조하세요.

SageMaker Studio 앱을 삭제하려면 다음을 수행합니다. SageMaker Studio 콘솔에서 studio-user를 선택한 다음 앱 삭제(Delete app)를 선택하여 앱(Apps)에 나열된 모든 앱을 삭제합니다. 상태(Status)삭제됨(Deleted)으로 변경될 때까지 기다립니다.

1단계에서 기존 SageMaker Studio 도메인을 사용한 경우 4단계로 건너뛰고 결론 섹션으로 바로 진행합니다. 

1단계에서 CloudFormation 템플릿을 실행하여 새 SageMaker Studio 도메인을 생성한 경우 다음 단계로 계속하여 CloudFormation 템플릿으로 생성된 도메인, 사용자 및 리소스를 삭제합니다.  

CloudFormation 콘솔을 열려면 AWS Console 검색 창에 CloudFormation을 입력하고 검색 결과에서 CloudFormation을 선택합니다.

CloudFormation 창에서 스택(Stacks)을 선택합니다. 상태 드롭다운 목록에서 활성(Active)을 선택합니다. 스택 이름(Stack name) 아래에서 CFN-SM-IM-Lambda-Catalog를 선택하여 스택 세부 정보 페이지를 엽니다.

CFN-SM-IM-Lambda-catalog 스택 세부 정보 페이지에서 삭제(Delete)를 선택하여 스택과 함께 1단계에서 생성된 리소스를 삭제합니다.

결론

축하합니다! 로컬로 기계 학습 모델 구축 및 훈련 자습서를 완료하셨습니다. 

이 자습서에서는 Amazon SageMaker Studio에서 XGBoost 오픈 소스 라이브러리를 사용하여 바이너리 분류 모델을 로컬로 구축하고 모델 아티팩트와 출력을 Amazon S3에 저장했습니다. 이 자습서에서 설명했듯이, SageMaker Studio의 빠른 프로토타이핑을 활용하면 전체 데이터 세트를 사용하여 프로덕션 모델 훈련 전에 모델 성능과 잠재적인 과적합 문제를 평가할 수 있습니다.

아래의 다음 단계 섹션에 따라 Amazon SageMaker를 통한 데이터 사이언티스트 여정을 계속할 수 있습니다.

이 페이지의 내용이 도움이 되었습니까?

다음 단계