Data Wrangler를 통해 저장한 train/test 데이터를 활용해 모델을 학습하고 학습 단계에서 생성한 리포트에 어떤 내용들이 포함되었는지 확인해 보는 실습 내용을 정리해 본다.
실습 환경은 SageMaker Studio Notebook이며, 데이터는 S3 버킷에 저장된 CSV 파일을 사용한다. 예측 목표는 개인 소득이 $50,000 이하인지 여부를 판별하는 것으로 이진 분류 문제다. 따라서 분류 모델 중 Xgbosot 알고리즘을 선택해 모델 학습을 진행한다.
이후 모델 훈련 작업을 구성하고 실행한 뒤, 예측 성능을 평가하고 마지막으로 학습이 끝난 후 생성된 모델 아티팩트가 저장되었는지 확인해 보자!


실습 과정의 전체적인 아키텍처는 위와 같다. S3에 저장된 데이터를 Notebook 코드와 ECR의 알고리즘 컨테이너 이미지로 불러와 Training Job을 실행하고, 학습이 완료되면 생성된 모델 아티팩트를 다시 S3에 저장하는 흐름이다.
1) 세션/권한/리전 초기화
import os
from time import strftime
import boto3
from IPython.display import FileLink, display
from sagemaker import Session, image_uris, get_execution_role
from sagemaker.estimator import Estimator
from sagemaker.inputs import TrainingInput
from sagemaker.debugger import Rule, rule_configs
# --- Session / IAM / Region ---
sm_session = Session() # 세션 생성
role = get_execution_role() # SageMaker 실행 권한(Role)
region = sm_session.boto_region_name # 현재 리전
SageMaker에서 모델 학습을 실행하기 위해서는 먼저 세션(Session), 실행 권한(Role), 리전(Region)을 준비해야 한다.
세션은 sagemaker.Session()을 통해 생성되는 실행 환경으로, 계정 정보와 리전, 기본 S3 버킷 설정을 포함하여 학습 요청을 전달하고 결과 저장 위치를 관리한다. S3에 저장되어 있는 학습 데이터를 가져와 사용하며 학습 과정에서 생성되는 로그는 CloudWatch에 기록되고, 최종 모델 파일 역시 다시 S3에 저장된다. SageMaker가 이러한 작업을 대신 수행하려면 다른 AWS 서비스에 접근할 수 있는 권한이 필요한데, 이를 위해 IAM Role을 지정한다. 특히 Execution Role은 SageMaker가 S3에서 데이터를 읽고 모델을 저장하며, 로그를 CloudWatch에 기록할 수 있도록 해준다. 마지막으로 리전은 AWS 리소스가 위치한 물리적 데이터센터를 의미하며, SageMaker 인스턴스, S3 버킷, 컨테이너 이미지는 동일한 리전에 있어야 안정적으로 동작한다.
2) S3 버킷과 데이터 경로 설정
s3 = boto3.resource('s3')
for buckets in s3.buckets.all():
if 'labdatabucket' in buckets.name:
bucket = buckets.name
prefix = 'scripts/data'
output_path = 's3://{}/{}/output'.format(bucket, prefix)
train_path = f"s3://{bucket}/{prefix}/train/adult_data_processed_train.csv"
validation_path = f"s3://{bucket}/{prefix}/validation/adult_data_processed_validation.csv"
train_input = TrainingInput(train_path, content_type='text/csv')
validation_input = TrainingInput(validation_path, content_type='text/csv')
3) Estimator 구성
container_uri = image_uris.retrieve(framework="xgboost", region=region, version="1.5-1")
run_name = f"lab-2-run-{strftime('%m%d%H%M')}"
est = Estimator(
image_uri=..., role=..., instance_count=1, instance_type="ml.m5.xlarge",
output_path=..., sagemaker_session=...,
rules=[Rule.sagemaker(rule_configs.create_xgboost_report())],
base_job_name=run_name,
)
SageMaker에서 학습 작업을 실행하기 위해서는 먼저 어떤 알고리즘 컨테이너를 사용할지와 학습에 필요한 리소스 설정을 정해야 한다.
이번 과정에서는 공식 XGBoost 컨테이너 이미지를 사용하기 위해 image_uris.retrieve() 함수를 통해 리전에 맞는 컨테이너 URI를 불러왔다. 이후 Estimator 객체를 정의하는데, 여기에는 학습에 필요한 핵심 설정이 담긴다.
image_uri에는 사용할 알고리즘 컨테이너 URI를 넣고, role에는 SageMaker 실행 권한을 부여한다. instance_type과 instance_count는 학습에 사용할 인스턴스의 종류와 개수를 정하며, output_path는 학습이 끝난 후 모델 아티팩트를 저장할 S3 경로를 의미한다. 또한 rules 옵션에는 SageMaker Debugger 규칙을 추가해 학습 완료 후 자동으로 리포트를 생성하도록 했다.
즉, Estimator는 SageMaker에서 학습을 어떻게, 어떤 환경에서, 어떤 컨테이너를 사용해 실행할지 정의하는 학습 작업의 청사진이라고 할 수 있다.
4) 하이퍼파라미터 설정
est.set_hyperparameters(
max_depth = 5,
eta = 0.2,
gamma = 4,
min_child_weight = 6,
subsample = 0.7,
verbosity = 0,
objective = 'binary:logistic',
num_round = 800
)
Estimator를 정의한 뒤에는 모델의 동작 방식을 결정하는 하이퍼파라미터를 설정해야 한다.
이번 실습에서는 XGBoost 알고리즘을 사용하므로, 트리 기반 부스팅 모델의 대표적인 하이퍼파라미터들을 지정하였다. max_depth는 트리의 최대 깊이를 제한하여 복잡도를 제어하고, eta는 학습률로서 모델이 데이터를 학습하는 속도를 조정한다. gamma와 min_child_weight는 분할 기준을 강화하여 과적합을 방지하는 역할을 하며, subsample은 학습에 사용하는 데이터 샘플의 비율을 지정해 모델의 일반화를 돕는다. verbosity는 로그 출력 수준을 결정하고, objective는 학습 목표를 정의하는데, 이번 예제에서는 이진 분류(binary:logistic) 문제를 풀기 위해 설정하였다. 마지막으로 num_round는 부스팅을 반복하는 횟수를 의미한다.
5) 학습 실행
est.fit({"train": train_input, "validation": valid_input}, wait=True)
6) 리포트 확인
job_name = est.latest_training_job.job_name
report_key = f"{prefix}/output/{job_name}/rule-output/CreateXgboostReport/xgboost_report.ipynb"
waiter = s3_client.get_waiter("object_exists")
waiter.wait(Bucket=bucket, Key=report_key)
local_dir = "CreateXgboostReport"
os.makedirs(local_dir, exist_ok=True)
local_ipynb = os.path.join(local_dir, "xgboost_report.ipynb")
s3_client.download_file(bucket, report_key, local_ipynb)
하이퍼파라미터 설정이 끝나면, fit() 메서드를 사용하여 학습 작업을 실행한다. fit() 함수에는 학습 데이터와 검증 데이터를 각각의 채널(train, validation)로 전달한다. 이렇게 지정된 데이터는 S3에서 불러와 컨테이너 내에서 학습에 사용된다.
코드에서 wait=True 옵션을 주었기 때문에, 학습이 완료될 때까지 Notebook 셀은 대기 상태로 유지된다. 학습이 진행되는 동안 로그는 CloudWatch에 기록되며, 학습이 끝나면 모델 아티팩트가 자동으로 S3의 output_path에 저장된다. 저장되는 파일은 일반적으로 model.tar.gz 형태이며, 이후 배포나 추가 평가 과정에서 그대로 활용할 수 있다.
또한 Estimator를 생성할 때 디버거 Rule을 지정했기 때문에, 학습이 종료되면 SageMaker Debugger가 자동으로 학습 과정을 분석한 리포트 노트북(ipynb)을 생성한다. 이 리포트에는 학습 메트릭, 과적합 여부, 피처 중요도 등 모델 학습에 대한 요약 결과가 포함되어 있다.


생성된 모델 아티팩트는 학습 후 노트북에서도 확인할 수 있고 s3에 직접 들어가 확인할 수도 있다.
7) ipynb → HTML 변환
import nbformat
from nbconvert import HTMLExporter
_ensure_pkgs(["nbformat", "nbconvert"])
nb_node = nbformat.read(local_ipynb, as_version=4)
html_exporter = HTMLExporter()
# html_exporter.exclude_input = True # (선택) 입력 셀 숨김
body, _ = html_exporter.from_notebook_node(nb_node)
local_html = os.path.join(local_dir, "xgboost_report.html")
with open(local_html, "w", encoding="utf-8") as f:
f.write(body)
html_key = report_key.replace("xgboost_report.ipynb", "xgboost_report.html")
s3_client.upload_file(local_html, bucket, html_key, ExtraArgs={"ContentType": "text/html"})
display(FileLink(local_ipynb, result_html_prefix="클릭하여 XGBoost 리포트 노트북 열기: "))
display(FileLink(local_html, result_html_prefix="클릭하여 XGBoost 리포트 HTML 열기: "))
학습이 끝나면 SageMaker Debugger가 자동으로 생성한 리포트 노트북(ipynb) 파일이 S3에 저장된다. 이 리포트에는 학습 과정에서 수집된 메트릭, 과적합 여부, 하이퍼파라미터 영향, 피처 중요도 등 모델 분석 결과가 포함되어 있어 모델 성능을 점검하는 데 유용하다.
코드에서는 먼저 학습 잡 이름을 가져와(est.latest_training_job.job_name), 해당 학습 잡에 연결된 리포트 파일의 경로(report_key)를 구성한다. 이후 S3 waiter를 통해 리포트 파일이 생성될 때까지 대기하고, 파일이 준비되면 Notebook 환경의 로컬 디렉터리로 다운로드한다.
다운로드한 ipynb 파일은 그대로 열어볼 수 있지만, 공유나 배포를 위해 HTML로 변환하는 과정도 추가된다. 이를 위해 nbformat과 nbconvert 라이브러리를 활용하여 노트북 파일을 HTML 문서로 변환한 뒤, 변환된 HTML 파일 역시 다시 S3에 업로드한다. 이렇게 하면 브라우저에서 직접 열어볼 수 있다. 이를 통해 사용자는 학습이 끝난 후 곧바로 노트북 형태의 상세 리포트 또는 웹 브라우저에서 열리는 HTML 리포트를 확인할 수 있다.
분석 리포트에는 아래와 같은 주요 내용들이 포함되어 있다.
| 항목 | 설명 |
| Distribution of True Labels of the Dataset |
데이터셋 내 실제 레이블 분포를 보여줌. 클래스 간 비율이 균형적인지 확인 가능 |
| Loss vs Step Graph | 학습 과정에서 손실(loss)이 스텝(step)마다 어떻게 변화하는지 시각화. 학습 진행 상황과 과적합 여부를 파악하는 데 사용 |
| Feature Importance | 모델 예측에 영향을 미친 주요 피처들의 중요도를 시각화. 어떤 변수가 모델 성능에 큰 영향을 주는지 확인 가능 |
| Confusion Matrix | 예측 값과 실제 값을 비교한 혼동 행렬. 어떤 클래스에서 오분류가 많이 발생하는지 확인 |
| Evaluation of the Confusion Matrix | 혼동 행렬을 기반으로 Accuracy, Precision, Recall, F1-score 등 평가 지표를 계산 |
| Accuracy Rate of Each Diagonal Element over Iteration |
학습 반복(iteration)에 따라 각 클래스별 정확도가 어떻게 변하는지 추적. 특정 클래스에서 성능 개선 여부 확인 가능 |
| Receiver Operating Characteristic (ROC) Curve |
민감도(True Positive Rate)와 특이도(False Positive Rate)의 관계를 시각화. AUC 값으로 모델 분류 성능 평가 |
| Distribution of Residuals at Last Saved Step |
마지막 학습 단계에서 실제 값과 예측 값 차이(잔차) 분포를 보여줌. 특정 구간에서 과소/과대 예측 경향이 있는지 확인 |
위 결과로 나온 리포트의 일부를 보면,





1. 레이블 분포
막대그래프에서 보듯이, 데이터셋 내 클래스 1(소득 > 50k)이 클래스 0보다 더 많이 분포되어 있어 약간의 불균형 데이터셋임을 확인할 수 있다. 이런 경우에는 성능 평가 지표를 확인할 때도 정확도 보다는 정밀도, 재현율을 확인하고 학습 시 샘플링 방법도 고려해 볼 필요가 있어 보인다.
2. 손실 곡선
훈련 손실(train logloss)은 꾸준히 감소하는 반면, 검증 손실(validation logloss)은 초반에 급격히 줄어든 뒤 일정 수준에서 수렴하는 모습을 보인다. 이는 모델이 과적합 없이 안정적으로 학습되었다는 것을 예상해 볼 수 있다. 그리고 후반부에 검증 손실이 더 이상 줄지 않는 점은 추가 반복 학습(num_round)을 늘려도 성능 개선 여지가 크지 않음을 알 수 있다.
3. 정확도 변화 (Accuracy Rate of Each Diagonal Element over Iteration)
클래스별 정확도를 iteration 별로 추적한 그래프다. 클래스 1은 약 90% 수준으로 안정적인 정확도를 유지하는 반면, 클래스 0은 학습 초반에 급격히 향상되지만 65% 정도에서 수렴한다. 이를 통해 소수 클래스(0)에 대한 예측이 상대적으로 어렵다는 것을 보여주며, 데이터 불균형의 영향일 가능성이 있어 보인다.
4. 혼동 행렬
검증 데이터 예측 결과를 보면, 대다수 샘플은 올바르게 분류되었지만 클래스 0에서 잘 분류하지 못하고 있는 걸 확인할 수 있다. 불균형 데이터에서 항상 발생하는 소수의 클래스를 맞추지 못하는 문제점이 여기서도 발생하고 있는 이런 상황에서는 소수의 클래스를 잘 맞추는 모델을 구현하는 것이 핵심이 되는 것 같다.
5. ROC 곡선
ROC Curve의 AUC 값은 약 0.92로 성능이 좋은 편이라고 볼 수 있을 것 같다.
SageMaker의 장점은 단순히 모델을 학습하는 것에 그치지 않고, 자동으로 생성되는 리포트를 통해 모델 성능을 직관적으로 분석할 수 있다는 점이다. 손실 곡선, 혼동 행렬, ROC 곡선, 피처 중요도 등 핵심 지표가 포함된 리포트를 통해 모델이 얼마나 잘 학습되었는지, 어느 부분에서 보완이 필요한지를 쉽게 확인할 수 있었다.
'AWS' 카테고리의 다른 글
| [AWS] SageMaker Studio사용해 모델 배포하기 (0) | 2025.08.25 |
|---|---|
| [AWS] Amazon SageMaker 사용해 모델 튜닝 및 하이퍼파라미터 최적화하기 (0) | 2025.08.24 |
| [AWS] SageMaker Data Wrangler를 사용해 데이터 처리하기 (0) | 2025.08.20 |
| [AWS] ML 수명 주기(ML Lifecycle)와 MLflow (0) | 2025.08.01 |
| [AWS] Amazon SageMaker AI (0) | 2025.08.01 |