마지막 주의 첫날이다. 새 개념이 아니라 흩어진 지식을 시험장에서 꺼낼 형태로 다시 묶는다.
[도메인 1 — 데이터 준비 28%] 수집 저장 준비·변환 특성 관리 ───── ───── ────────── ────────── Kinesis DS ─┐ Data Wrangler(비주얼) Feature Store Firehose ─┼─▶ S3 (데이터레이크) ─▶ Processing Job(코드) ─▶ ├ 온라인 : 저지연 단건 배치 업로드 ─┘ + Glue Catalog Glue ETL / EMR(Spark) └ 오프라인: S3·대량 Ground Truth (스키마·메타) Athena(SQL 즉석 조회) │ (라벨링) Clarify(사전 편향 점검) │ ▼[도메인 2 — 모델 개발 26%] 학습용 데이터 학습 ───────────▶ 튜닝 ───────────▶ 평가 ───────────▶ 모델 아티팩트 Training Job AMT 지표 선택 model.tar.gz (S3) 빌트인/프레임워크 Bayesian·Random Accuracy·F1·AUC │ /커스텀 컨테이너 Grid·Hyperband RMSE·MAE·R² ▼ File/Pipe/FastFile objective_metric Clarify(사후 편향) Model Registry Spot + 체크포인트 Debugger(과적합·병목 룰) (→ 도메인 3)
이 지도의 가로축은 "데이터가 모델이 되는 순서"이고, 세로축은 "누가 그 단계를 책임지는가"다. 시험 문항은 거의 항상 이 지도 위의 한 지점을 지목한다. 시나리오를 읽으며 "지금 어느 칸의 이야기인가"를 먼저 찍으면 보기 4개 중 절반은 다른 칸의 서비스라 즉시 소거된다.
시험은 "실시간인가 일괄인가", "코드를 짤 것인가 비주얼로 할 것인가", "어디에 저장할 것인가"로 서비스를 가른다. 실시간 이벤트면 Kinesis, 적재 후 변환이면 Glue, 비주얼 전처리·빠른 EDA면 Data Wrangler, S3를 SQL로 즉석 조회면 Athena다. 데이터 레이크의 중심은 거의 항상 S3이고, 나머지는 그 주변에서 수집·변환·조회 역할을 나눠 맡는다.
⚠️ 함정: "코드를 거의 작성하지 않고 시각적으로"가 나오면 Data Wrangler, "내가 쓴 전처리 스크립트를 관리형으로 실행"이면 Processing Job이다. 둘을 뒤집어 놓는 보기가 오답으로 쓰이기 쉽다. Data Wrangler와 Processing Job은 대립 관계가 아니라 Data Wrangler의 흐름을 Processing Job으로 내보내 파이프라인에 넣는 것이 표준 조합이다.
오버샘플링(SMOTE 등) · 언더샘플링 · 클래스 가중치(XGBoost scale_pos_weight)
극단값(이상치)·왜도가 큰 분포
클리핑 / 로그·제곱근 변환 / 구간화(binning)
텍스트
토큰화 → BoW·TF-IDF → 임베딩(BlazingText 등)
고차원 희소
PCA로 차원 축소, 또는 임베딩
⚠️ 함정: 데이터 누수(leakage) 는 조용히 성능을 부풀린다. 대표 사례 두 가지. ① 스케일러·대치값을 전체 데이터로 계산한 뒤 학습/검증을 나누면 검증 정보가 학습에 새어 든다 — 반드시 학습 세트로 fit하고 검증에는 transform만 한다. ② 시계열을 무작위로 셔플해 분할하면 미래가 과거를 학습시킨다 — 시계열은 반드시 시간 순 분할이다.
Feature Store는 특성을 한 번 정의해 학습과 추론이 함께 쓰게 만드는 중앙 저장소다.
구분
온라인 스토어
오프라인 스토어
목적
실시간 추론용 단건 조회
학습·배치용 대량 조회
지연
밀리초 단위 저지연
낮지 않음(분석형)
저장
최신 값 위주
S3에 이력 누적
조회 방법
런타임 API로 레코드 단건 GetRecord
Athena·Glue로 SQL 조회
대표 시나리오
결제 시점 고객 특성 즉시 조회
과거 시점 기준 학습 데이터셋 생성
import boto3# 온라인 스토어: 실시간 추론 직전 단건 조회fs_runtime = boto3.client('sagemaker-featurestore-runtime')resp = fs_runtime.get_record( FeatureGroupName='customer-features', RecordIdentifierValueAsString='C-10293',)# 오프라인 스토어는 S3에 쌓이므로 Athena로 SQL 조회해 학습 데이터셋을 만든다
Feature Store의 존재 이유는 training-serving skew 제거다. 학습 때 계산한 특성과 추론 때 계산한 특성이 미세하게 달라지면 성능이 조용히 떨어진다. 특성을 한 곳에 정의·버전관리하고 온라인/오프라인 양쪽이 같은 정의를 공유하면 이 불일치가 사라진다. "여러 팀·여러 모델이 같은 특성을 재사용", "학습과 실시간 추론의 특성을 일치"라는 키워드가 나오면 Feature Store다.
Clarify는 두 가지를 한다. ① 편향 탐지(bias detection) — 학습 전 데이터 편향, 학습 후 모델 편향을 측정한다. ② 설명가능성(explainability) — SHAP 값으로 어떤 특성이 예측에 얼마나 기여했는지 보여준다.
시점
문항에 나오는 표현
사전(pre-training)
"학습 데이터가 특정 집단에 치우쳤는가"
사후(post-training)
"예측 결과가 집단별로 공정한가"
설명(SHAP)
"어떤 특성이 이 예측을 만들었나"
편향은 두 시점에서 본다. 사전(pre-training) 편향은 데이터 자체의 불균형(예: 특정 집단 표본 부족)을, 사후(post-training) 편향은 모델 예측이 집단별로 다르게 나오는지를 측정한다. "공정성·편향·차별을 점검하라"는 Clarify, "예측 근거를 설명하라/특성 기여도"는 Clarify의 SHAP이다. 모니터링 단계에서는 Model Monitor가 Clarify와 연동해 운영 중 편향·특성 기여도 드리프트를 감시한다.
모델 개발은 "어떤 알고리즘을, 어떻게 학습시키는가"다. 빌트인 알고리즘의 대표 매핑은 다음과 같다.
문제 유형
대표 알고리즘
결정적 키워드
표 형식 분류/회귀
XGBoost, Linear Learner
정형 테이블, 컬럼 기반
이미지 분류·객체탐지
Image Classification, Object Detection
사진, 바운딩 박스
텍스트 분류·임베딩
BlazingText
문서 분류, 단어 벡터
시계열 예측
DeepAR
향후 N일 수요, 여러 관련 시계열
클러스터링
K-Means
라벨 없음, 고객 세그먼트
차원 축소
PCA
특성이 너무 많음
이상 탐지
Random Cut Forest (RCF)
스트림 이상치, 라벨 없는 비정상
추천(희소 상호작용)
Factorization Machines
사용자×아이템 희소 행렬
알고리즘 매핑을 묻는다. "시계열 다변량 예측"에 회귀를 고르면 틀린다 — DeepAR이다. "실시간 스트림 이상치"는 RCF, "수천 차원 희소 추천"은 Factorization Machines다. 또 학습 데이터 입력 모드도 묻는다. 데이터가 인스턴스 디스크보다 크거나 시작 지연을 줄이고 싶으면 Pipe 모드(또는 최신 Fast File 모드)로 S3에서 스트리밍하고, 작은 데이터면 File 모드로 통째로 복사한다.
Spot은 반드시 체크포인트가 짝이다. checkpoint_s3_uri 없이 Spot만 켜면 회수될 때마다 처음부터 다시 학습해 오히려 손해다. 그리고 max_wait >= max_run이어야 한다 — Spot은 용량을 기다리는 시간이 추가로 필요하기 때문이다. "GPU로 바꿨는데 안 빨라진다"는 대개 연산이 아니라 I/O가 병목인 경우이며, 트리 계열(XGBoost)에 GPU를 붙이는 보기는 함정이다.
SageMaker Automatic Model Tuning(AMT)은 하이퍼파라미터 탐색을 자동화한다.
전략
성격
키워드
Bayesian
과거 결과로 다음 후보를 똑똑하게 고름(기본 권장)
"적은 시도로 효율적으로"
Random
무작위 샘플링, 병렬화 쉬움
"넓게 병렬 탐색"
Grid
이산 공간 전수 탐색
"후보가 소수·이산"
Hyperband
가망 없는 학습을 조기 종료
"자원 절약·조기 종료"
from sagemaker.tuner import HyperparameterTuner, IntegerParameter, ContinuousParametertuner = HyperparameterTuner( estimator=estimator, objective_metric_name='validation:auc', # 최적화 대상 지표 objective_type='Maximize', hyperparameter_ranges={ 'max_depth': IntegerParameter(3, 10), 'eta': ContinuousParameter(0.01, 0.3), }, max_jobs=30, # 총 학습 시도 수 max_parallel_jobs=3, # 동시 실행 수(Bayesian은 작게 두는 편이 유리) strategy='Bayesian',)tuner.fit({'train': train_input, 'validation': val_input})
튜닝 전략 선택은 "예산 효율 vs 병렬성"이다. Bayesian은 적은 시도로 좋은 값을 찾지만 앞선 결과를 참고하므로 병렬도를 너무 키우면 이점이 줄고, Random/Grid는 병렬화가 쉽지만 비효율적이며, Hyperband는 가망 없는 학습을 일찍 끊어 대규모 탐색의 비용을 줄인다. "적은 학습 횟수로 효율적 탐색"은 Bayesian, "조기 종료로 자원 절약"은 Hyperband가 키워드다.