시작하기 / 실습 / ...

기계 학습 모델 훈련

자습서

개요

이 자습서에서는 Amazon SageMaker Studio 및 Amazon SageMaker Clarify를 사용하여 기계 학습(ML) 모델을 훈련, 튜닝 및 평가하는 방법을 학습합니다.

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

이 자습서에서는 가상의 자동차 보험 청구 데이터 세트를 사용합니다. 훈련, 검증 및 테스트 데이터 세트를 입력으로 사용합니다. 각 데이터 세트에는 청구 및 고객 세부 정보와 추출된 특성과 함께 청구의 사기 여부를 나타내는 fraud 열이 포함됩니다. 학습자는 오픈 소스 XGBoost 프레임워크를 사용하여 이 가상의 데이터 세트를 기반으로 청구의 사기 가능성을 예측하는 바이너리 분류 모델을 구축하게 됩니다. 또한 바이어스 및 특성 중요도 보고서를 실행하여 훈련된 모델을 평가하고, 테스트용 모델을 배포한 다음 샘플 추론을 실행하여 모델 성능을 평가하고 예측을 설명합니다.

학습 목표

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

  • 스크립트 모드를 사용하여 모델 구축, 훈련 및 튜닝
  • ML 모델의 바이어스를 탐지하고 모델 예측을 이해
  • 훈련된 모델을 실시간 추론 엔드포인트에 배포하여 테스트
  • 샘플 예측을 생성하고 특성 영향을 파악하여 모델 평가

사전 요구 사항

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

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

 AWS 경험

초보자

 소요 시간

2시간

 완료 비용

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

 필요 사항

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

 사용 서비스

Amazon SageMaker Studio, Amazon SageMaker Clarify

 최종 업데이트 날짜

2022년 5월 3일

구현

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))이 표시됩니다.

오픈 소스 XGBoost 및 Pandas 라이브러리의 특정 버전을 설치하려면 다음 코드 조각을 복사하여 노트북의 셀에 붙여 넣고 Shift+Enter 키를 눌러 현재 셀을 실행합니다. 커널을 다시 시작하라는 경고 또는 모든 종속성 충돌 오류를 무시합니다.

%pip install -q  xgboost==1.3.1 pandas==1.0.5

또한 S3 클라이언트 객체와 기본 S3 버킷 내의 위치(지표 및 모델 아티팩트와 같은 콘텐츠가 업로드되는 위치)를 인스턴스화해야 합니다. 그렇게 하려면 다음 코드 예제를 복사하여 노트북 셀에 붙여 넣고 실행합니다. 

import pandas as pd
import boto3
import sagemaker
import json
import joblib
from sagemaker.xgboost.estimator import XGBoost
from sagemaker.tuner import (
    IntegerParameter,
    ContinuousParameter,
    HyperparameterTuner
)
from sagemaker.inputs import TrainingInput
from sagemaker.image_uris import retrieve
from sagemaker.serializers import CSVSerializer
from sagemaker.deserializers import CSVDeserializer

# Setting SageMaker variables
sess = sagemaker.Session()
write_bucket = sess.default_bucket()
write_prefix = "fraud-detect-demo"

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

sagemaker_role = sagemaker.get_execution_role()
sagemaker_client = boto3.client("sagemaker")
read_bucket = "sagemaker-sample-files"
read_prefix = "datasets/tabular/synthetic_automobile_claims" 


# Setting S3 location for read and write operations
train_data_key = f"{read_prefix}/train.csv"
test_data_key = f"{read_prefix}/test.csv"
validation_data_key = f"{read_prefix}/validation.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}"
validation_data_uri = f"s3://{read_bucket}/{validation_data_key}"
model_uri = f"s3://{write_bucket}/{model_key}"
output_uri = f"s3://{write_bucket}/{output_key}"
estimator_output_uri = f"s3://{write_bucket}/{write_prefix}/training_jobs"
bias_report_output_uri = f"s3://{write_bucket}/{write_prefix}/clarify-output/bias"
explainability_report_output_uri = f"s3://{write_bucket}/{write_prefix}/clarify-output/explainability"

쓰기 버킷 이름은 SageMaker 세션 객체에서 파생되는 것을 알 수 있습니다. 기본 버킷의 이름은 sagemaker-<your-Region>-<your-account-id>입니다. 이 버킷에 모든 훈련 아티팩트가 업로드됩니다. 훈련에 사용하는 데이터 세트는 읽기 버킷으로 지정된 퍼블릭 S3 버킷(sagemaker-sample-files)에 있습니다. 가져오는 SageMaker XGBoost 프레임워크는 이전 단계에서 설치한 오픈 소스 프레임워크가 아닙니다. 이 프레임워크는 모델 훈련을 스케일 업하는 데 사용되는 도커 컨테이너 이미지가 포함된 기본 제공 프레임워크입니다.

다음 코드 블록을 복사하고 붙여 넣어 모델 이름과 훈련 및 추론 인스턴스 구성과 개수를 설정합니다. 이 설정에서 적절한 인스턴스 유형과 개수를 사용하여 훈련 및 추론 프로세스를 관리할 수 있습니다.

tuning_job_name_prefix = "xgbtune" 
training_job_name_prefix = "xgbtrain"

xgb_model_name = "fraud-detect-xgb-model"
endpoint_name_prefix = "xgb-fraud-model-dev"
train_instance_count = 1
train_instance_type = "ml.m4.xlarge"
predictor_instance_count = 1
predictor_instance_type = "ml.m4.xlarge"
clarify_instance_count = 1
clarify_instance_type = "ml.m4.xlarge"

3단계: 스크립트 모드에서 하이퍼파라미터 튜닝 작업 시작

SageMaker Studio를 사용하면 자체 로직을 Python 스크립트 안에 가져와서 훈련에 사용할 수 있습니다. 훈련 작업을 스크립트로 캡슐화하면 사용자 지정 훈련 루틴과 모델 구성을 통합하면서 AWS를 통해 유지 관리되는 일반적인 ML 프레임워크 컨테이너를 계속 사용할 수 있습니다. 이 자습서에서는 AWS 제공 XGBoost 컨테이너로 지원되는 오픈 소스 XGBoost 프레임워크를 사용하는 훈련 스크립트를 준비하고 하이퍼파라미터 튜닝 작업을 대규모로 시작합니다. 모델을 훈련하려면 사기(fraud) 열을 대상 열로 사용합니다.

스크립트 모드의 첫 번째 수준에서는 사용자 지정된 독립 Python 스크립트에서 훈련 프로세스를 정의하고 이 스크립트를 진입점으로 사용하여 SageMaker 추정기를 정의할 수 있습니다. 다음 코드 블록을 복사하고 붙여 넣어 모델 훈련 로직을 캡슐화하는 Python 스크립트를 작성합니다.

%%writefile xgboost_train.py

import argparse
import os
import joblib
import json
import pandas as pd
import xgboost as xgb
from sklearn.metrics import roc_auc_score

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    # Hyperparameters and algorithm parameters are described here
    parser.add_argument("--num_round", type=int, default=100)
    parser.add_argument("--max_depth", type=int, default=3)
    parser.add_argument("--eta", type=float, default=0.2)
    parser.add_argument("--subsample", type=float, default=0.9)
    parser.add_argument("--colsample_bytree", type=float, default=0.8)
    parser.add_argument("--objective", type=str, default="binary:logistic")
    parser.add_argument("--eval_metric", type=str, default="auc")
    parser.add_argument("--nfold", type=int, default=3)
    parser.add_argument("--early_stopping_rounds", type=int, default=3)
    

    # SageMaker specific arguments. Defaults are set in the environment variables
    # Location of input training data
    parser.add_argument("--train_data_dir", type=str, default=os.environ.get("SM_CHANNEL_TRAIN"))
    # Location of input validation data
    parser.add_argument("--validation_data_dir", type=str, default=os.environ.get("SM_CHANNEL_VALIDATION"))
    # Location where trained model will be stored. Default set by SageMaker, /opt/ml/model
    parser.add_argument("--model_dir", type=str, default=os.environ.get("SM_MODEL_DIR"))
    # Location where model artifacts will be stored. Default set by SageMaker, /opt/ml/output/data
    parser.add_argument("--output_data_dir", type=str, default=os.environ.get("SM_OUTPUT_DATA_DIR"))
    
    args = parser.parse_args()

    data_train = pd.read_csv(f"{args.train_data_dir}/train.csv")
    train = data_train.drop("fraud", axis=1)
    label_train = pd.DataFrame(data_train["fraud"])
    dtrain = xgb.DMatrix(train, label=label_train)
    
    
    data_validation = pd.read_csv(f"{args.validation_data_dir}/validation.csv")
    validation = data_validation.drop("fraud", axis=1)
    label_validation = pd.DataFrame(data_validation["fraud"])
    dvalidation = xgb.DMatrix(validation, label=label_validation)

    params = {"max_depth": args.max_depth,
              "eta": args.eta,
              "objective": args.objective,
              "subsample" : args.subsample,
              "colsample_bytree":args.colsample_bytree
             }
    
    num_boost_round = args.num_round
    nfold = args.nfold
    early_stopping_rounds = args.early_stopping_rounds
    
    cv_results = xgb.cv(
        params=params,
        dtrain=dtrain,
        num_boost_round=num_boost_round,
        nfold=nfold,
        early_stopping_rounds=early_stopping_rounds,
        metrics=["auc"],
        seed=42,
    )
    
    model = xgb.train(params=params, dtrain=dtrain, num_boost_round=len(cv_results))
    
    train_pred = model.predict(dtrain)
    validation_pred = model.predict(dvalidation)
    
    train_auc = roc_auc_score(label_train, train_pred)
    validation_auc = roc_auc_score(label_validation, validation_pred)
    
    print(f"[0]#011train-auc:{train_auc:.2f}")
    print(f"[0]#011validation-auc:{validation_auc:.2f}")

    metrics_data = {"hyperparameters" : params,
                    "binary_classification_metrics": {"validation:auc": {"value": validation_auc},
                                                      "train:auc": {"value": train_auc}
                                                     }
                   }
              
    # Save the evaluation metrics to the location specified by output_data_dir
    metrics_location = args.output_data_dir + "/metrics.json"
    
    # Save the model to the location specified by model_dir
    model_location = args.model_dir + "/xgboost-model"

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

    with open(model_location, "wb") as f:
        joblib.dump(model, f)

이 스크립트는 앞서 설치한 오픈 소스 XGBoost 라이브러리를 가져옵니다.

SageMaker는 진입점 스크립트를 실행하고 모델 구성 세부 정보와 입력 및 출력 경로와 같은 모든 입력 파라미터를 명령줄 인수로 제공합니다. 이 스크립트는 제공된 인수를 ‘argparse’ Python 라이브러리를 사용하여 처리합니다.

훈련 스크립트는 도커 컨테이너 안에서 실행되며 SageMaker는 Amazon S3의 훈련 및 검증 데이터 세트를 컨테이너 안의 로컬 경로에 자동으로 다운로드합니다. 환경 변수를 통해 이 위치에 액세스할 수 있습니다. SageMaker 환경 변수의 전체 목록은 환경 변수를 참조하세요.

훈련 스크립트가 준비되면 SageMaker 추정기를 인스턴스화할 수 있습니다. 사용자 지정 스크립트를 실행할 수 있는 XGBoost 컨테이너를 관리하는 AWS 관리형 XGBoost 추정기를 사용합니다. XGBoost 추정기를 인스턴스화하려면 다음 코드를 복사하여 붙여 넣습니다.

# SageMaker estimator

# Set static hyperparameters that will not be tuned
static_hyperparams = {  
                        "eval_metric" : "auc",
                        "objective": "binary:logistic",
                        "num_round": "5"
                      }

xgb_estimator = XGBoost(
                        entry_point="xgboost_train.py",
                        output_path=estimator_output_uri,
                        code_location=estimator_output_uri,
                        hyperparameters=static_hyperparams,
                        role=sagemaker_role,
                        instance_count=train_instance_count,
                        instance_type=train_instance_type,
                        framework_version="1.3-1",
                        base_job_name=training_job_name_prefix
                    )

추정기를 지정할 때 정적 구성 파라미터를 지정할 수 있습니다. 이 자습서에서는 수신기 조작 특성-곡선 영역(ROC-AUC)을 평가 지표로 사용합니다. 실행에 소요되는 시간을 제어하기 위해 라운드 수는 5로 설정되었습니다.

사용자 지정 스크립트와 훈련 인스턴스 구성은 추정기 객체에 인수로 전달됩니다. XGBoost 버전은 이전에 설치한 것과 일치하도록 선택됩니다.

 

이 자습서에서는 4개의 XGBoost 하이퍼파라미터를 튜닝합니다.

  • eta: 과적합을 방지하기 위해 업데이트에 사용되는 학습률 축소입니다. 각 부스팅 단계 후에 새 특성의 가중치를 바로 얻을 수 있습니다. eta 파라미터는 실제로 특성의 가중치를 축소하여 부스팅 프로세스의 보수성을 높입니다.
  • subsample: 훈련 인스턴스의 하위 샘플 비율입니다. 0.5로 설정하면 XGBoost가 트리를 확장하기 전에 훈련 데이터의 절반을 무작위 샘플링합니다. 각 부스팅 반복에서 서로 다른 하위 집합을 사용하면 과적합을 방지하는 데 도움이 됩니다.
  • colsample_bytree: 부스팅 프로세스의 각 트리를 생성하는 데 사용되는 특성의 비율입니다. 하위 집합의 특성을 사용하여 각 트리를 생성하면 모델링 프로세스의 무작위성이 증가하여 일반화가 개선됩니다.
  • max_depth: 트리의 최대 깊이입니다. 이 값을 늘리면 모델이 더 복잡해지고 과적합될 가능성이 높아집니다.

다음 코드 블록을 복사하고 붙여 넣어 검색을 시작할 이전 하이퍼파라미터의 범위를 설정합니다.

# Setting ranges of hyperparameters to be tuned
hyperparameter_ranges = {
    "eta": ContinuousParameter(0, 1),
    "subsample": ContinuousParameter(0.7, 0.95),
    "colsample_bytree": ContinuousParameter(0.7, 0.95),
    "max_depth": IntegerParameter(1, 5)
}

다음 코드 블록을 복사하고 붙여 넣어 하이퍼파라미터 튜너를 설정합니다. SageMaker는 베이지안 최적화 루틴을 검색 프로세스의 기본값으로 실행합니다. 이 자습서에서는 무작위 검색 접근 방식을 사용하여 런타임을 줄입니다. 파라미터는 검증 데이터 세트에 대한 모델의 AUC 성능을 기준으로 튜닝됩니다.

objective_metric_name = "validation:auc"

# Setting up tuner object
tuner_config_dict = {
                     "estimator" : xgb_estimator,
                     "max_jobs" : 5,
                     "max_parallel_jobs" : 2,
                     "objective_metric_name" : objective_metric_name,
                     "hyperparameter_ranges" : hyperparameter_ranges,
                     "base_tuning_job_name" : tuning_job_name_prefix,
                     "strategy" : "Random"
                    }
tuner = HyperparameterTuner(**tuner_config_dict)

튜너 객체에서 fit() 메서드를 호출하여 하이퍼파라미터 튜닝 작업을 시작할 수 있습니다. 튜너 적합을 위해 서로 다른 입력 채널을 지정할 수 있습니다. 이 자습서에서는 훈련 및 검증 채널을 제공합니다. 다음 코드 블록을 복사하고 붙여 넣어 하이퍼파라미터 튜닝 작업을 시작합니다. 이 작업은 완료하는 데 약 13분이 걸립니다.

# Setting the input channels for tuning job
s3_input_train = TrainingInput(s3_data="s3://{}/{}".format(read_bucket, train_data_key), content_type="csv", s3_data_type="S3Prefix")
s3_input_validation = (TrainingInput(s3_data="s3://{}/{}".format(read_bucket, validation_data_key), 
                                    content_type="csv", s3_data_type="S3Prefix")
                      )

tuner.fit(inputs={"train": s3_input_train, "validation": s3_input_validation}, include_cls_metadata=False)
tuner.wait()

시작된 튜닝 작업은 SageMaker 콘솔의 하이퍼파라미터 튜닝 작업(Hyperparameter tuning jobs)에서 볼 수 있습니다. 참고로 첨부된 이미지에 표시된 튜닝 작업 이름은 타임스탬프 차이로 인해 표시된 이름과 일치하지 않습니다.

 

 

튜닝이 완료되면 결과 요약에 액세스할 수 있습니다. 다음 코드 블록을 복사하고 붙여 넣어 성능 내림차순으로 정렬된 pandas dataframe에서 튜닝 작업 결과를 검색합니다.

# Summary of tuning results ordered in descending order of performance
df_tuner = sagemaker.HyperparameterTuningJobAnalytics(tuner.latest_tuning_job.job_name).dataframe()
df_tuner = df_tuner[df_tuner["FinalObjectiveValue"]>-float('inf')].sort_values("FinalObjectiveValue", ascending=False)
df_tuner

성능이 가장 우수한 하이퍼파라미터 조합을 검사할 수 있습니다.

 

 

4단계: SageMaker Clarify를 사용하여 모델 바이어스를 확인하고 모델 예측을 설명

모델 훈련이 완료된 후에는 배포 전에 모델 또는 데이터에 내재된 바이어스가 있는지 파악하는 것이 중요합니다. 모델 예측은 바이어스의 원인이 될 수 있습니다(예: 한 그룹에 대해 다른 그룹보다 더 자주 부정적인 결과를 생성하는 예측을 수행하는 경우). SageMaker Clarify는 훈련된 모델이 예측을 수행하는 방법을 특성 귀인 접근 방식을 사용하여 설명하는 데 도움이 됩니다. 이 자습서에서는 모델 설명 가능성을 위한 훈련 후 바이어스 지표 및 SHAP 값을 중점적으로 살펴봅니다. 구체적으로, 다음과 같은 명령 태스크를 다룹니다.

  • 데이터 및 모델 바이어스 감지
  • 특성 중요도 값을 사용한 모델 설명 가능성
  • 단일 데이터 샘플에 대한 특성 및 로컬 설명의 영향

SageMaker Clarify로 모델 바이어스 감지를 수행하려면 분석의 일부로 임시 엔드포인트에 SageMaker 모델을 배포해야 합니다. 이 엔드포인트는 SageMaker Clarify 분석이 완료된 후 삭제됩니다. 다음 코드 블록을 복사하고 붙여 넣어 튜닝 작업에서 식별된 최상의 훈련 작업을 사용하여 SageMaker 모델을 생성합니다.

tuner_job_info = sagemaker_client.describe_hyper_parameter_tuning_job(HyperParameterTuningJobName=tuner.latest_tuning_job.job_name)

model_matches = sagemaker_client.list_models(NameContains=xgb_model_name)["Models"]

if not model_matches:
    _ = sess.create_model_from_job(
            name=xgb_model_name,
            training_job_name=tuner_job_info['BestTrainingJob']["TrainingJobName"],
            role=sagemaker_role,
            image_uri=tuner_job_info['TrainingJobDefinition']["AlgorithmSpecification"]["TrainingImage"]
            )
else:

    print(f"Model {xgb_model_name} already exists.")

바이어스 감지를 실행하려면 SageMaker Clarify에서 다수의 구성을 설정해야 합니다. Amazon SageMaker Clarify에서 자세한 내용을 찾을 수 있습니다. 이 자습서에서는 표준 구성 외에, 고객의 성별에 따라 대상의 값이 왜곡되는지 여부를 확인하여 데이터에 여성에 대한 통계적 바이어스가 있는지 감지하도록 SageMaker Clarify를 설정합니다. 다음 코드를 복사하고 붙여 넣어 SageMaker Clarify 구성을 설정합니다.

train_df = pd.read_csv(train_data_uri)
train_df_cols = train_df.columns.to_list()

clarify_processor = sagemaker.clarify.SageMakerClarifyProcessor(
    role=sagemaker_role,
    instance_count=clarify_instance_count,
    instance_type=clarify_instance_type,
    sagemaker_session=sess,
)

# Data config
bias_data_config = sagemaker.clarify.DataConfig(
    s3_data_input_path=train_data_uri,
    s3_output_path=bias_report_output_uri,
    label="fraud",
    headers=train_df_cols,
    dataset_type="text/csv",
)

# Model config
model_config = sagemaker.clarify.ModelConfig(
    model_name=xgb_model_name,
    instance_type=train_instance_type,
    instance_count=1,
    accept_type="text/csv",
)

# Model predictions config to get binary labels from probabilities
predictions_config = sagemaker.clarify.ModelPredictedLabelConfig(probability_threshold=0.5)

# Bias config
bias_config = sagemaker.clarify.BiasConfig(
    label_values_or_threshold=[0],
    facet_name="customer_gender_female",
    facet_values_or_threshold=[1],
)

# Run Clarify job
clarify_processor.run_bias(
    data_config=bias_data_config,
    bias_config=bias_config,
    model_config=model_config,
    model_predicted_label_config=predictions_config,
    pre_training_methods=["CI"],
    post_training_methods=["DPPL"])

clarify_bias_job_name = clarify_processor.latest_job.name

SageMaker Clarify 안에서 훈련 전 지표는 데이터의 기존 바이어스를 보여주고 훈련 후 지표는 모델 예측의 바이어스를 보여줍니다. SageMaker SDK를 사용하여 바이어스를 확인할 그룹과 고려할 바이어스 지표를 지정할 수 있습니다. 이 자습서에서는 클래스 불균형(CI)예측된 레이블의 양수 비율 차이(DPPL)를 각각 훈련 전 및 훈련 후 바이어스 통계 표본으로 사용합니다. 훈련 전 바이어스 측정훈련 후 데이터 및 모델 바이어스에서 다른 바이어스 지표에 대한 자세한 내용을 찾을 수 있습니다. 다음 코드 블록을 복사하고 붙여 넣어 SageMaker Clarify를 실행하고 바이어스 보고서를 생성합니다. 선택한 바이어스 지표는 run_bias 메서드에 인수로 전달됩니다. 이 코드를 완료하는 데 약 12분이 걸립니다.

clarify_processor.run_bias(
    data_config=bias_data_config,
    bias_config=bias_config,
    model_config=model_config,
    model_predicted_label_config=predictions_config,
    pre_training_methods=["CI"],
    post_training_methods=["DPPL"]
    )

clarify_bias_job_name = clarify_processor.latest_job.name

SageMaker Clarify 출력은 기본 S3 버킷에 저장됩니다. 다음 코드를 복사하고 붙여 넣어 Amazon S3의 SageMaker Clarify 보고서를 SageMaker Studio의 로컬 디렉터리에 PDF 형식으로 다운로드합니다.

# Copy bias report and view locally
!aws s3 cp s3://{write_bucket}/{write_prefix}/clarify-output/bias/report.pdf ./clarify_bias_output.pdf

PDF 보고서의 훈련 전 및 훈련 후 바이어스 지표를 볼 때 이 데이터 세트에는 고객 성별 특성과 관련된 클래스 불균형이 있는 것으로 보입니다. 이러한 불균형은 SMOTE와 같은 기법을 적용하여 훈련 데이터 세트를 다시 생성함으로써 교정될 수 있습니다. 또한 SageMaker Data Wrangler를 사용하고 SMOTE와 같이 서비스 내에서 제공되는 여러 옵션 중 하나를 지정하여 훈련 데이터 세트의 균형을 조정할 수 있습니다. 자세한 내용은 Data Wrangler 데이터 균형 조정을 참조하세요. 간결성을 위해 이 단계는 이 자습서에 포함되지 않았습니다.

데이터 바이어스에 더해 SageMaker Clarify에서는 훈련된 모델을 분석하고 특성 중요도에 따라 모델 설명 가능성 보고서를 생성할 수 있습니다. SageMaker Clarify는 SHAP 값을 사용하여 각 입력 특성이 최종 예측에 기여한 정도를 설명합니다. 다음 코드 블록을 복사하고 붙여 넣어 모델 설명 가능성 분석을 구성하고 실행합니다. 이 코드 블록을 완료하는 데 약 14분이 걸립니다.

explainability_data_config = sagemaker.clarify.DataConfig(
    s3_data_input_path=train_data_uri,
    s3_output_path=explainability_report_output_uri,
    label="fraud",
    headers=train_df_cols,
    dataset_type="text/csv",
)

# Use mean of train dataset as baseline data point
shap_baseline = [list(train_df.drop(["fraud"], axis=1).mean())]

shap_config = sagemaker.clarify.SHAPConfig(
    baseline=shap_baseline,
    num_samples=500,
    agg_method="mean_abs",
    save_local_shap_values=True,
)

clarify_processor.run_explainability(
    data_config=explainability_data_config,
    model_config=model_config,
    explainability_config=shap_config
)

다음 코드를 복사하고 붙여 넣어 Amazon S3의 SageMaker Clarify 설명 가능성 보고서를 SageMaker Studio의 로컬 디렉터리에 PDF 형식으로 다운로드합니다.

# Copy explainability report and view
!aws s3 cp s3://{write_bucket}/{write_prefix}/clarify-output/explainability/report.pdf ./clarify_explainability_output.pdf

이 보고서에는 입력 특성이 모델 예측에 기여한 정도를 보여주는 특성 중요도 차트가 포함됩니다. 이 자습서에서 훈련된 모델의 경우 예측 생성에서 num-injuries 특성이 가장 중요한 역할을 하고 customer_gender_male 특성이 바로 뒤를 잇는 것으로 보입니다. 이러한 특성 순위는 예측 메커니즘에 대한 중요한 인사이트를 제공하며 공정하고 설명 가능한 ML 사용을 통해 모델 개선 및 개발을 촉진합니다.

 

 

SageMaker Studio의 SageMaker 리소스(SageMaker Resources)실험 및 시험(Experiments and trials) 옵션의 드롭다운 목록에서도 바이어스 및 설명 가능성 분석 결과를 볼 수 있습니다. 할당되지 않은 시험 구성 요소(Unassigned trial components)를 선택합니다.

 

 

clarify-explainability-<datetimestamp>라는 이름의 설명 가능성 보고서를 선택합니다.

 

 

설명 가능성(Explainability) 탭에서 특성 중요도 차트를 시각화할 수 있습니다. PDF 보고서 내보내기(Export PDF report)를 선택하여 보고서를 다운로드할 수도 있습니다.

 

 

SageMaker Clarify에서 생성된 설명 가능성 보고서는 개별 샘플에 대한 로컬 SHAP 값이 포함된 out.csv라는 파일도 제공합니다. 다음 코드 블록을 복사하여 붙여 넣고 이 파일을 사용하여 단일 예제에 대한 설명(각 특성이 모델의 예측에 미치는 영향)을 시각화합니다.

import matplotlib.pyplot as plt
import matplotlib
%matplotlib inline
local_explanations_out = pd.read_csv(explainability_report_output_uri + "/explanations_shap/out.csv")
feature_names = [str.replace(c, "_label0", "") for c in 
local_explanations_out.columns.to_series()]
local_explanations_out.columns = feature_names

selected_example = 100
print("Example number:", selected_example)

local_explanations_out.iloc[selected_example].plot(
    kind="bar", title="Local explanation for the example number " + str(selected_example), rot=60, figsize=(20, 8)
);

선택한 예제(테스트 세트의 첫 번째 샘플)에서 예측에 가장 많이 기여한 특성은 총 청구 금액, 성별 및 상해 수입니다.

 

 

5단계: 실시간 추론 엔드포인트에 모델 배포

이 단계에서는 하이퍼파라미터 튜닝 작업에서 나온 최상의 모델을 실시간 추론 엔드포인트에 배포한 다음 엔드포인트를 사용하여 예측을 생성합니다. 훈련된 모델을 배포할 때는 SageMaker SDK, AWS SDK - Boto3 및 SageMaker 콘솔 등 다수의 방법을 사용할 수 있습니다. 자세한 내용은 Amazon SageMaker 설명서의 추론을 위한 모델 배포를 참조하세요. 이 예제에서는 SageMaker SDK를 사용하여 실시간 엔드포인트에 모델을 배포합니다.

 

다음 코드 블록을 복사하고 붙여 넣어 최상의 모델을 배포합니다.

best_train_job_name = tuner.best_training_job()

model_path = estimator_output_uri + '/' + best_train_job_name + '/output/model.tar.gz'
training_image = retrieve(framework="xgboost", region=region, version="1.3-1")
create_model_config = {"model_data":model_path,
                       "role":sagemaker_role,
                       "image_uri":training_image,
                       "name":endpoint_name_prefix,
                       "predictor_cls":sagemaker.predictor.Predictor
                       }
# Create a SageMaker model
model = sagemaker.model.Model(**create_model_config)

# Deploy the best model and get access to a SageMaker Predictor
predictor = model.deploy(initial_instance_count=predictor_instance_count, 
                         instance_type=predictor_instance_type,
                         serializer=CSVSerializer(),
                         deserializer=CSVDeserializer())
print(f"\nModel deployed at endpoint : {model.endpoint_name}")

이 코드는 최상의 훈련 작업 이름을 사용하여 Amazon S3에서 모델을 검색합니다. XGBoost는 text/libsvm 또는 text/csv 형식의 입력을 수락합니다. 이 자습서에 사용된 입력 데이터 세트는 CSV 형식이므로 배포 구성에 CSV 입력을 바이트 스트림으로 변환하는 CSVSerializer와 바이트 스트림 형식의 기본 모델 출력을 다시 CSV 형식으로 변환하여 사용할 수 있도록 하는 CSVDeserializer가 포함됩니다. 완료되면 코드 블록은 모델이 배포된 엔드포인트의 이름을 반환합니다. 이 배포에서는 엔드포인트를 호출하여 다음 섹션에 표시된 대로 예측을 실행하는 데 사용할 수 있는 SageMaker Predictor도 반환됩니다.

 

SageMaker Studio 인터페이스에서 SageMaker 리소스(SageMaker Resources) 아이콘을 클릭하고 드롭다운 목록에서 엔드포인트(Endpoints)를 선택하여 배포된 엔드포인트를 확인할 수 있습니다.

또한 SageMaker 콘솔의 추론(Inference), 엔드포인트(Endpoints)를 통해 엔드포인트를 검사할 수 있습니다.

이제 모델이 엔드포인트에 배포되었으니 REST API를 직접 호출하거나(이 자습서에는 설명되지 않음) AWS SDK, SageMaker Studio의 그래픽 인터페이스 또는 SageMaker Python SDK를 사용하여 REST API를 호출할 수 있습니다. 이 자습서에서는 배포 단계를 통해 제공되는 SageMaker Predictor를 사용하여 하나 이상의 테스트 샘플에서 실시간 모델 예측을 생성할 수 있습니다. 다음 코드 블록을 복사하고 붙여 넣어 엔드포인트를 호출하고 테스트 데이터의 단일 샘플을 전송합니다.

# Sample test data
test_df = pd.read_csv(test_data_uri)
payload = test_df.drop(["fraud"], axis=1).iloc[0].to_list()
print(f"Model predicted score : {float(predictor.predict(payload)[0][0]):.3f}, True label : {test_df['fraud'].iloc[0]}")

셀의 출력은 모델 엔드포인트에서 다시 전송된 실제 레이블과 예측 점수를 보여줍니다. 예측 확률이 아주 낮으므로 이 테스트 샘플은 모델에 의해 사기가 아닌 것으로 올바르게 레이블링되었습니다.

6단계: 리소스 정리

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

모델 및 엔드포인트를 삭제하려면 다음 코드를 복사하여 노트북에 붙여 넣습니다.

# Delete model
try:
 sess.delete_model(xgb_model_name)
except:
 pass
sess.delete_model(model.name)

# Delete inference endpoint config
sess.delete_endpoint_config(endpoint_config_name=predictor._get_endpoint_config_name())

# Delete inference endpoint
sess.delete_endpoint(endpoint_name=model.endpoint_name)

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 도메인을 사용한 경우 6단계로 건너뛰고 결론 섹션으로 바로 진행합니다. 

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 라이브러리와 AWS 관리형 XGBoost 컨테이너를 사용하여 SageMaker 하이퍼파라미터 튜닝 작업을 통해 모델을 훈련하고 튜닝했습니다. 또한 SageMaker Clarify를 사용하여 바이어스 및 모델 설명 가능성을 분석하고 보고서를 사용하여 개별 예측에 특성이 미치는 영향을 평가했습니다. 마지막으로, SageMaker SDK를 사용하여 모델을 실시간 추론 엔드포인트에 배포하고 샘플 페이로드를 통해 테스트했습니다.

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

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

ML 모델을 자동으로 생성

AutoML을 사용하여 코드 작성 없이 ML 모델을 개발하는 방법을 알아봅니다.
다음 »

훈련된 모델 배포

추론을 위해 훈련된 ML 모델을 배포하는 방법을 알아봅니다.
다음 »

추가 실습 자습서 찾기

심화 학습을 위한 다른 기계 학습 자습서를 살펴봅니다.
다음 »