CertNote/ 출퇴근 학습 노트
로드맵
KOEN
CLF-C02 · FoundationalCloud Practitioner - Foundational
DVA-C02 · AssociateDeveloper - Associate
SAA-C03 · AssociateSolutions Architect - Associate
SOA-C02 · AssociateCloudOps Engineer - Associate
SAP-C02 · ProfessionalSolutions Architect - Professional
DOP-C02 · ProfessionalDevOps Engineer - Professional
SCS-C03 · SpecialtySecurity - Specialty
MLA-C01 · AssociateMachine Learning Engineer - Associate
  • Week 1
    • 1.ML 수명주기와 ML 엔지니어의 역할
    • 2.ML 문제 유형과 평가 지표 기초
    • 3.AWS ML 스택 한눈에 보기
    • 4.SageMaker 개요: Studio, 학습/추론, 빌트인 알고리즘
    • 5.Week 1 종합 — ML 기초·AWS 스택 복습
  • Week 2
  • Week 3
    • 1.특성 공학: 모델이 읽을 수 있는 숫자로 바꾸는 기술
    • 2.SageMaker Data Wrangler: 코드 없이 끝내는 데이터 준비
    • 3.SageMaker Feature Store: 특성을 자산으로 관리하기
    • 4.데이터 편향·품질: Clarify, 불균형 처리, 데이터 분할
    • 5.Week 3 종합 — 특성 공학·데이터 품질 복습
  • Week 4
  • Week 5
  • Week 6
  • Week 7
  • Week 8
  • Week 9
  • Week 10
AIF-C01 · FoundationalAI Practitioner - Foundational
DEA-C01 · AssociateData Engineer - Associate
MLS-C01 · SpecialtyMachine Learning - Specialty
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← MLA-C01/Week 3/Day 3

기준: MLA-C01 시험 가이드·오류 제보

MLA-C01· AssociateWeek 3 · Day 3읽기 약 12분
핵심 정리
  • Feature Store는 특성을 중앙에서 저장·재사용·일관 제공하는 저장소다. 단위는 Feature Group.
  • Feature Group의 필수 요소는 Record Identifier(행 식별자)와 Event Time(기록 시점).
  • 온라인 스토어 = 밀리초 단위 단건 조회(실시간 추론), 오프라인 스토어 = S3 Parquet 이력(학습·배치).
  • 가장 큰 가치는 training/serving skew 방지 — 학습과 추론이 같은 특성 정의를 공유한다.
  • Event Time 기반 point-in-time correct join이 미래 정보 누수(look-ahead bias)를 막는다.

Day 3 - SageMaker Feature Store: 특성을 자산으로 관리하기

Feature Store란 무엇인가

어제 만든 특성들이 노트북 안 데이터프레임에만 있다면 다음 프로젝트에서 같은 특성을 또 만들어야 한다. 더 나쁜 건 학습 때 쓴 변환과 추론 때 쓴 변환이 미묘하게 달라져 모델 성능이 조용히 무너지는 것이다.

Feature Store는 ML 특성을 중앙에서 저장·관리·제공하는 저장소다. 핵심 단위는 Feature Group으로, 관계형 테이블처럼 행과 열로 구성되며 각 열이 하나의 특성(feature)이다.

필수 요소무엇인가왜 필요한가
Record Identifier각 행을 식별하는 키 (예: customer_id)온라인 조회의 키, 최신값 판정 기준
Event Time그 특성 값이 기록된 시점시점 정합성(time travel)의 기준
from sagemaker.feature_store.feature_group import FeatureGroup
 
feature_group = FeatureGroup(name='customer-features', ...)
 
feature_group.create(
    record_identifier_name='customer_id',   # 행 식별자
    event_time_feature_name='event_time',    # 이벤트 시각
    role_arn=role,
    enable_online_store=True                 # 온라인 스토어 활성화
)
 
# 특성 적재
feature_group.ingest(data_frame=df, max_workers=3)

같은 customer_id에 대해 event_time이 다른 여러 레코드가 쌓이면, "특정 시점의 특성 값이 무엇이었나"를 재구성할 수 있다.

customer_id = cust_123 의 이력

event_time          purchase_30d   activity_score
2026-01-15 10:00        12             0.71
2026-03-02 09:30        18             0.83
2026-06-24 14:10        25             0.66   ← 온라인 스토어가 반환하는 "최신값"

오프라인 스토어는 위 세 줄을 모두 보관한다 → 과거 시점 재구성 가능

Event Time은 시계열 데이터베이스의 bitemporal 개념과 닿아 있다. 모델을 과거 데이터로 학습할 때 "그 시점에 실제로 알 수 있었던 특성 값"만 써야 미래 정보 누수(look-ahead bias)를 막는다. 예를 들어 2024년 1월 거래를 예측하는데 2024년 3월에 갱신된 특성 값을 쓰면 미래를 본 것이다. Event Time 기반 조회는 이 시간적 정합성을 보장하는 메커니즘이다.

온라인 스토어와 오프라인 스토어

Feature Store의 핵심은 두 종류의 스토어를 동시에 제공한다는 점이다. 시험에서 이 둘의 차이를 구분해야 한다.

구분온라인 스토어 (Online)오프라인 스토어 (Offline)
목적실시간 추론학습·배치
지연 시간밀리초 (저지연)높음 (배치)
저장 방식빠른 key-value 조회S3 (Parquet)
조회 단위최신 레코드 1건 (GetRecord)전체 이력 (대량)
비용상대적으로 높음저렴(S3)
사용 APIGetRecord (단건)Athena 쿼리 / S3 직접
정답 키워드"밀리초", "실시간 추론", "단건""학습 데이터셋", "전체 이력", "대량 조회"
# 온라인 스토어: 실시간 추론 시 최신 특성 조회
record = featurestore_runtime.get_record(
    FeatureGroupName='customer-features',
    RecordIdentifierValueAsString='cust_12345'
)
 
# 오프라인 스토어: 학습용 데이터셋 생성 (Athena)
query = feature_group.athena_query()
query.run(query_string="SELECT * FROM customer_features WHERE ...",
          output_location='s3://my-bucket/query-results/')

Feature Store 가 온라인 스토어와 오프라인 스토어로 동기화되어 각각 실시간 추론과 학습 데이터셋에 쓰이는 구조

⚠️ 함정: 온라인 스토어만 활성화하면 학습용 이력이 S3에 쌓이지 않고, 오프라인만 활성화하면 실시간 추론에서 저지연 조회를 못 한다. 대부분의 실제 ML 시스템은 둘 다 활성화해서, 같은 특성을 학습(오프라인)과 추론(온라인)에 일관되게 쓴다. 데이터를 ingest하면 SageMaker가 온라인에는 최신값을, 오프라인에는 이력을 자동으로 동기화한다.

일관성: training/serving skew 방지

Feature Store의 가장 큰 가치는 학습과 추론이 같은 특성 정의를 공유한다는 점이다. training/serving skew는 학습 때와 서빙 때 특성 계산 방식이 달라 모델 성능이 떨어지는 고전적 문제다.

전형적 시나리오: 학습 파이프라인은 pandas로 "최근 30일 평균 구매액"을 계산하고, 추론 서버는 Java로 같은 값을 다시 계산한다. 두 구현이 미묘하게 다르면(경계 처리, 반올림) 모델이 보는 값이 학습 때와 달라진다.

skew의 원인구체적 예Feature Store의 해법
두 언어로 중복 구현Python 학습 / Java 서빙계산은 한 번, 양쪽은 읽기만
경계 조건 해석 차이"최근 30일"에 오늘 포함 여부정의가 저장소에 고정됨
버그 수정이 한쪽만 반영학습 코드만 고침단일 정의라 동시 반영
시점 불일치추론 때 더 최신 값을 씀Event Time으로 시점 정합
[특성 계산 파이프라인]  ──ingest──>  [Feature Store]
                                        |
                  ┌─────────────────────┴──────────────────┐
                  v                                          v
        [오프라인 스토어]                            [온라인 스토어]
        학습 데이터셋 생성                          실시간 추론 조회
        (Athena, 동일 정의)                        (GetRecord, 동일 정의)

training/serving skew는 ML 시스템의 기술 부채를 다룬 Google의 "Hidden Technical Debt in Machine Learning Systems" 논문에서 강조한 핵심 문제다. 모델 코드는 전체 ML 시스템의 작은 부분이고, 데이터 파이프라인과 특성 일관성이 실패의 주원인이다. Feature Store는 특성을 "코드"가 아니라 "공유 데이터 자산"으로 승격시켜, 정의를 한 곳에 모으는 것으로 이 부채를 줄인다.

특성 재사용과 거버넌스

Feature Store의 두 번째 가치는 재사용이다. A팀이 만든 "고객 생애 가치", "최근 활동 점수" 같은 특성을 B팀이 새 모델에 그대로 가져다 쓸 수 있다.

기능무엇을 해결하나
검색·발견어떤 특성이 이미 있는지 몰라 중복 제작하는 문제
메타데이터·설명이 특성이 정확히 무엇을 뜻하는지 모르는 문제
버전·계보언제 어떻게 만들어졌는지 추적 불가 문제
IAM 권한민감한 특성에 아무나 접근하는 문제

Feature Store에는 여러 Feature Group을 시점 정합성에 맞게 조인하는 기능이 있다. 학습 데이터를 만들 때 customer 특성과 product 특성을 각자의 event time 기준으로 조인하면, "그 시점에 알 수 있었던 값들"만 정확히 결합된다. 이를 point-in-time correct join이라 하며, 수작업으로 하면 매우 까다로운 미래 누수 방지를 자동화해준다.

잘못된 조인 (미래 누수)              올바른 point-in-time 조인
예측 시점: 2026-01-15                예측 시점: 2026-01-15
customer 특성: 2026-03-02 값 ✗       customer 특성: 2026-01-15 이전 최신값 ✓
  → 두 달 뒤의 정보를 미리 봄            → 그 시점에 알 수 있던 값만 사용

한 핀테크 회사가 사기 탐지와 신용 평가 두 모델을 운영하는데, 둘 다 "최근 거래 빈도"라는 특성이 필요했다. 처음엔 각 팀이 따로 계산해 정의가 미묘하게 달랐고, 한 팀이 버그를 고쳐도 다른 팀에 반영이 안 됐다. Feature Store로 이 특성을 한 번 정의해 공유하자 정의 불일치가 사라지고, 한 곳을 고치면 양쪽 모델이 함께 개선됐다.

데이터 흐름 정리

전형적 파이프라인은 이렇게 이어진다.

순서단계도구
①raw 데이터를 특성으로 변환Data Wrangler / Processing Job
②Feature Store에 적재(온라인+오프라인 동시)ingest
③학습 데이터셋 생성오프라인 스토어 + Athena
④실시간 최신 특성 조회온라인 스토어 + GetRecord

이 흐름 전체가 동일한 특성 정의를 공유하므로 일관성이 유지된다.

시험 판별 요약

시나리오 문구정답
"밀리초 안에 사용자 최신 특성 조회"온라인 스토어 GetRecord
"학습용 전체 이력을 대량 조회"오프라인 스토어 + Athena
"학습과 추론 계산이 달라 성능 저하"Feature Store로 정의 통합
"그 시점에 알 수 있던 값만 써야 함"Event Time 기반 point-in-time 조인
"두 팀이 같은 특성을 따로 만든다"Feature Group 공유·재사용

스토어 활성화 조합과 결과

Feature Group을 만들 때 온라인·오프라인 중 무엇을 켜느냐가 이후에 할 수 있는 일을 결정한다.

조합가능한 것불가능한 것적합
온라인만밀리초 단건 조회학습용 이력 조회이미 학습 데이터가 따로 있는 서빙 전용
오프라인만대량 이력 조회, 학습셋 생성저지연 실시간 조회배치 추론만 하는 파이프라인
둘 다학습·추론 모두—대부분의 실제 ML 시스템
  • 둘 다 켜면 ingest 한 번으로 온라인엔 최신값이, 오프라인엔 이력이 각각 반영된다.
  • 나중에 학습 이력이 필요해졌는데 오프라인을 꺼둔 상태였다면, 그 기간의 이력은 되살릴 수 없다.

어떤 특성을 Feature Store에 넣나

모든 컬럼을 넣는 것이 답은 아니다. 관리 비용과 가치의 균형이 있다.

넣을 가치가 큰 특성이유
계산 비용이 큰 집계 특성매번 다시 계산하면 비쌈
여러 모델이 공통으로 쓰는 특성재사용 효과가 큼
학습·추론 모두에서 필요한 특성skew 방지 효과가 직접적
정의가 미묘해 오해가 생기는 특성단일 정의로 못 박음
굳이 넣지 않아도 되는 것이유
원본 raw 컬럼 그대로데이터 레이크에 이미 있음
한 모델에서 일회성으로 쓰는 특성재사용 가치가 낮음
매 요청마다 즉석에서 계산되는 값저장 이점이 없음

시점 정합성이 무너지는 순간

예측하려는 시점: 2026-01-15
   │
   ├─ 올바름: event_time <= 2026-01-15 중 가장 최신 레코드 사용
   │
   └─ 잘못됨: 최신 레코드(2026-06-24)를 그대로 사용
                → 5개월 뒤의 정보를 학습에 넣은 셈
상황왜 위험한가
과거 학습셋을 만들며 "현재 최신값"을 조인미래 정보가 라벨을 설명해버림
여러 Feature Group을 각기 다른 기준으로 조인일부 특성만 미래를 봄
Event Time을 적재 시각으로 잘못 기록실제 관측 시점과 어긋남

⚠️ 함정: 백테스트 성능이 유난히 좋을 때는 성능을 기뻐하기 전에 시점 정합성을 먼저 의심해야 한다. point-in-time correct join을 쓰지 않은 학습셋은 거의 항상 낙관적인 숫자를 낸다.

다음 글에서는 이렇게 준비한 데이터가 공정하고 균형 잡혀 있는지 점검하는 데이터 편향·품질과 SageMaker Clarify를 본다.

📖 용어

  • Feature Store : ML 특성을 중앙에 모아 저장하고 학습·추론에 일관되게 제공하는 저장소.
  • Feature Group : Feature Store의 기본 단위. 행과 열로 이뤄진 테이블 형태이며 특성들이 열이 된다.
  • Record Identifier : 각 행을 구분하는 키. 온라인 조회 시 이 값으로 최신 레코드를 찾는다.
  • Event Time : 그 특성 값이 언제 기록됐는지의 시각. 과거 시점 재구성과 누수 방지의 기준.
  • 온라인 스토어 : 최신 특성 1건을 밀리초 안에 돌려주는 key-value 저장소. 실시간 추론용.
  • 오프라인 스토어 : 모든 이력을 S3에 Parquet으로 쌓아두는 저장소. 학습 데이터셋 생성용.
  • GetRecord : 온라인 스토어에서 식별자로 최신 레코드 하나를 가져오는 API.
  • training/serving skew : 학습 때와 추론 때 특성 계산이 달라 모델이 조용히 나빠지는 현상.
  • point-in-time correct join : 예측 시점 기준으로 "그때 알 수 있던 값"만 결합하는 조인 방식.
  • look-ahead bias(미래 누수) : 예측 시점 이후의 정보를 학습에 써서 성능이 부풀려지는 오류.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

실시간 추천 서비스가 사용자가 페이지를 열 때마다 해당 사용자의 최신 특성을 밀리초 내에 조회해야 한다. SageMaker Feature Store에서 적합한 것은?

문제 2

학습 파이프라인은 Python으로, 추론 서버는 Java로 "최근 30일 평균 구매액"을 각각 계산하다 미묘한 차이로 모델 성능이 저하됐다. 이를 근본적으로 해결하는 접근은?

문제 3

Feature Group을 생성할 때 반드시 지정해야 하며, 특정 시점의 특성 값을 재구성하는 기준이 되는 요소는?

문제 4

학습용 데이터셋을 만들기 위해 Feature Store에 쌓인 전체 특성 이력을 대량으로 조회하려 한다. 가장 적합한 방법은?

문제 5

두 팀이 동일한 "고객 활동 점수" 특성을 각자 만들어 정의가 어긋나고 버그 수정이 한쪽에만 반영되는 문제가 있다. Feature Store가 제공하는 해결책은?

이전SageMaker Data Wrangler: 코드 없이 끝내는 데이터 준비Week 3 · Day 2다음 데이터 편향·품질: Clarify, 불균형 처리, 데이터 분할Week 3 · Day 4

참고 공식 자료

  • MLA-C01 공식 시험 안내(새 탭에서 열림)
  • Amazon S3 공식 문서(새 탭에서 열림)
  • Amazon SageMaker AI 공식 문서(새 탭에서 열림)
  • Amazon Athena 공식 문서(새 탭에서 열림)

이 페이지

  • Feature Store란 무엇인가
  • 온라인 스토어와 오프라인 스토어
  • 일관성: training/serving skew 방지
  • 특성 재사용과 거버넌스
  • 데이터 흐름 정리
  • 스토어 활성화 조합과 결과
  • 어떤 특성을 Feature Store에 넣나
  • 시점 정합성이 무너지는 순간
  • 용어
  • 연습 문제