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 1

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

MLA-C01· AssociateWeek 3 · Day 1읽기 약 13분
핵심 정리
  • 특성 공학은 raw 데이터를 알고리즘이 패턴을 학습할 수 있는 수치 표현으로 바꾸는 작업 전체다.
  • 4대 축으로 외운다 — 스케일링 / 인코딩 / 결측치 / 이상치.
  • 거리·경사 기반 모델(KNN, 신경망, 선형회귀)은 스케일링 필수, 트리 기반(XGBoost)은 스케일에 둔감하다.
  • 명목형은 One-Hot, 서열형은 Ordinal, 고카디널리티는 타깃/빈도 인코딩·임베딩.
  • 모든 변환은 train으로만 fit, test는 transform — 이 원칙 하나가 데이터 누수의 절반을 막는다.

Day 1 - 특성 공학: 모델이 읽을 수 있는 숫자로 바꾸는 기술

특성 공학이 왜 시간의 대부분을 먹나

모델 학습에서 데이터 과학자가 시간의 70~80%를 쓰는 곳은 화려한 알고리즘 튜닝이 아니라 특성 공학(feature engineering)이다. raw 데이터는 결측치가 뚫려 있고, 단위가 제각각이며, "서울/부산/대구" 같은 문자열이 섞여 있다. 모델은 이걸 그대로 못 읽는다.

MLA-C01 시험은 "이 데이터에 어떤 변환을 적용해야 하는가"를 시나리오로 끊임없이 묻는다. 알고리즘 이름보다 언제 어떤 변환을 고르는가가 핵심이다.

[raw 데이터]
   │  숫자 단위가 제각각          → ① 스케일링
   │  문자열 범주가 섞임          → ② 인코딩
   │  빈 칸이 뚫려 있음           → ③ 결측치 처리
   │  극단값이 튀어 있음          → ④ 이상치 처리
   │  분포가 한쪽으로 치우침      → ⑤ 수치 변환·구간화
   v
[모델이 읽을 수 있는 수치 행렬]

왜 스케일링이 필요한가

연봉(예: 50,000,000)과 나이(예: 35)를 같은 모델에 넣으면, 거리 기반 알고리즘(KNN, K-Means)이나 경사하강법 기반 모델(선형회귀, 신경망)은 단위가 큰 연봉에 압도된다. 두 점 사이 유클리드 거리를 계산하면 나이 차이는 무시되고 연봉 차이만 반영된다.

from sklearn.preprocessing import StandardScaler, MinMaxScaler
 
# 표준화(Standardization): 평균 0, 표준편차 1로 변환
# z = (x - mean) / std
scaler = StandardScaler()
X_std = scaler.fit_transform(X_train)
 
# 정규화(Normalization): [0, 1] 범위로 변환
# x' = (x - min) / (max - min)
minmax = MinMaxScaler()
X_norm = minmax.fit_transform(X_train)

스케일러 선택표

스케일러변환이상치 영향결과 범위언제
StandardScaler(x−평균)/표준편차받음대체로 −3~3정규분포에 가까울 때, 일반적 기본값
MinMaxScaler(x−최소)/(최대−최소)크게 받음정확히 0~1범위가 명확할 때(픽셀 0~255), 신경망 입력
RobustScaler(x−중앙값)/IQR적게 받음가변이상치가 많을 때

알고리즘별 스케일링 필요 여부 — 시험에서 바로 갈리는 지점이다.

알고리즘 계열스케일링이유
KNN, K-Means필수거리 계산이 단위에 지배됨
선형/로지스틱 회귀, SVM필수경사하강 수렴 속도, 정규화 항의 공정성
신경망필수활성화 포화·수렴 불안정 방지
결정트리, Random Forest, XGBoost불필요분할 기준이 "임계값 비교"라 단위와 무관

경사하강법은 손실 함수 표면을 따라 내려가는데, 특성 스케일이 제각각이면 손실 표면이 길쭉한 타원(elongated contour)이 된다. 이러면 gradient가 최저점을 향해 직선으로 못 가고 지그재그로 진동하며 수렴이 느려진다. 스케일링으로 모든 축을 비슷한 범위로 맞추면 손실 표면이 동심원에 가까워져 수렴이 빨라진다.

⚠️ 함정: 스케일러는 반드시 train 데이터로만 fit하고, 그 통계량으로 validation/test를 transform해야 한다. test 데이터까지 포함해 fit하면 test 정보가 학습에 새어 들어가는 데이터 누수(data leakage)가 발생한다. scaler.fit_transform(X_train) 후 scaler.transform(X_test)가 정답이다.

범주형 변수 인코딩

"색상: 빨강/파랑/초록" 같은 범주형 데이터는 숫자로 바꿔야 한다. 방법 선택이 모델 성능을 크게 가른다.

import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
 
# One-Hot Encoding: 각 범주를 별도 이진 열로
# 빨강 -> [1,0,0], 파랑 -> [0,1,0], 초록 -> [0,0,1]
ohe = pd.get_dummies(df['color'])
 
# Label Encoding: 각 범주에 정수 부여
# 빨강 -> 0, 파랑 -> 1, 초록 -> 2
le = LabelEncoder()
df['color_encoded'] = le.fit_transform(df['color'])

인코딩 선택표

방법적합한 범주차원 증가위험
One-Hot명목형(순서 없음), 저카디널리티범주 수만큼고카디널리티에서 차원 폭발
Ordinal/Label서열형(저/중/고, S/M/L)없음명목형에 쓰면 가짜 순서를 학습
타깃 인코딩고카디널리티 명목형없음데이터 누수에 취약
빈도 인코딩고카디널리티 명목형없음빈도가 같은 범주를 구분 못 함
임베딩(딥러닝)초고카디널리티지정 차원학습 데이터·시간이 필요

One-Hot 인코딩은 순서가 없는 명목형(nominal) 범주에 쓴다. 빨강·파랑·초록 사이엔 크기 관계가 없으므로, Label 인코딩으로 0/1/2를 주면 모델이 "초록(2) > 파랑(1)"이라는 잘못된 순서를 학습한다. Label/Ordinal 인코딩은 순서가 있는 서열형(ordinal) 범주에 적합하다.

범주가 수천 개일 때(우편번호, 상품 ID)는 One-Hot으로 펼치면 차원이 폭발(curse of dimensionality)한다. 이럴 땐 타깃 인코딩·빈도 인코딩·임베딩을 쓴다.

타깃 인코딩은 강력하지만 데이터 누수에 취약하다. "범주 A의 타깃 평균"을 계산할 때 그 행 자신의 타깃을 포함하면 정답을 미리 본 셈이 된다. 이를 막으려면 K-fold 방식으로 다른 fold의 통계만 쓰거나, 스무딩(smoothing)을 적용해 표본이 적은 범주는 전체 평균 쪽으로 끌어당긴다.

결측치 처리

현실 데이터엔 빈 칸이 흔하다. 대부분의 알고리즘(XGBoost 등 일부 제외)은 NaN을 못 받으므로 채우거나 제거해야 한다.

from sklearn.impute import SimpleImputer, KNNImputer
 
# 평균/중앙값/최빈값으로 대치
imp = SimpleImputer(strategy='median')  # mean, median, most_frequent, constant
X_filled = imp.fit_transform(X)
 
# KNN: 유사한 행들의 값으로 대치
knn_imp = KNNImputer(n_neighbors=5)
X_knn = knn_imp.fit_transform(X)

대치 전략 선택표

상황전략이유
결측 5% 미만, 무작위행 삭제편향이 거의 없고 단순
수치형, 이상치 있음중앙값 대치평균은 이상치에 끌려감
수치형, 분포가 정규에 가까움평균 대치분포 중심을 유지
범주형최빈값 또는 "Unknown" 범주새 범주가 정보일 수 있음
결측 자체가 의미를 가짐"결측 여부" 플래그 열 추가정보를 버리지 않음
결측이 많고 패턴이 있음KNN·모델 기반 대치유사 행에서 추정

결측 메커니즘은 통계학에서 3가지로 나뉜다. MCAR(Missing Completely At Random, 완전 무작위), MAR(Missing At Random, 다른 관측 변수에 의존), MNAR(Missing Not At Random, 결측값 자체에 의존). MCAR이면 단순 삭제도 편향을 안 만들지만, MNAR(예: 고소득자가 소득을 안 적는 경향)이면 단순 대치가 심각한 편향을 만든다. 평균 대치는 분산을 인위적으로 줄여 상관관계를 약화시킨다.

이상치 처리

이상치(outlier)는 측정 오류일 수도, 진짜 드문 사건(사기 거래)일 수도 있다. 무조건 제거하면 안 된다.

import numpy as np
 
# IQR 방법: Q1 - 1.5*IQR 미만, Q3 + 1.5*IQR 초과를 이상치로
Q1, Q3 = np.percentile(data, [25, 75])
IQR = Q3 - Q1
lower, upper = Q1 - 1.5 * IQR, Q3 + 1.5 * IQR
outliers = data[(data < lower) | (data > upper)]
 
# Z-score 방법: |z| > 3 을 이상치로
z = (data - data.mean()) / data.std()
outliers_z = data[np.abs(z) > 3]
탐지 방법기준분포 가정이상치에 견고한가
IQRQ1−1.5×IQR 미만 / Q3+1.5×IQR 초과없음견고함
Z-score평균에서 표준편차 3배 초과정규분포 가정이상치가 평균·표준편차를 흔듦

처리 방법을 고르는 판단표

이상치의 정체처리예
측정·입력 오류제거하거나 결측으로 전환나이 999세
코딩 규약(sentinel value)결측으로 해석 후 대치면적 99999
진짜 드문 사건이지만 모델을 흔듦캡핑(winsorizing), 로그 변환초고가 부동산
진짜 드문 사건이면서 탐지 대상절대 제거 금지사기 거래, 설비 고장

부동산 가격 예측 모델에서 "면적" 열에 99999가 들어 있었다. 이는 결측을 99999로 코딩한 sentinel value였는데, 팀이 모르고 그대로 학습시켜 모델이 모든 집을 초고가로 예측했다. raw 데이터의 코딩 규약(데이터 사전, data dictionary)을 먼저 확인하는 것이 특성 공학의 0단계다.

⚠️ 함정: 사기 탐지·이상 탐지에서 이상치는 노이즈가 아니라 정답 신호다. IQR로 걸러 제거하면 양성 클래스가 통째로 사라진다. 이상치 처리는 항상 "이 값이 오류인가, 의미 있는 사건인가"를 도메인 맥락에서 먼저 판단해야 한다.

수치형 변환과 구간화

치우친(skewed) 분포는 로그 변환으로 정규분포에 가깝게 만들면 선형 모델 성능이 오른다. 연속형을 구간(bin)으로 나누는 binning은 나이를 "10대/20대/30대"로 묶어 비선형 관계를 단순화하거나 이상치 영향을 줄인다.

import numpy as np
import pandas as pd
 
# 로그 변환: 오른쪽으로 긴 꼬리(소득, 가격)를 압축
df['log_income'] = np.log1p(df['income'])  # log(1+x), 0 처리 안전
 
# 구간화(binning): 연속형 -> 범주형
df['age_group'] = pd.cut(df['age'], bins=[0, 18, 35, 60, 100],
                          labels=['청소년', '청년', '중년', '노년'])
변환목적대가
로그 변환오른쪽 긴 꼬리를 압축해 정규에 가깝게해석이 로그 단위로 바뀜
제곱근 변환로그보다 약한 압축위와 동일
구간화(binning)비선형 관계 단순화, 이상치 완화구간 내 정보 손실
다항 특성곡선 관계를 선형 모델이 잡게 함차원 증가, 과적합 위험

SageMaker 빌트인 알고리즘 중 일부는 특정 입력 형식을 요구한다. Linear Learner나 XGBoost는 보통 CSV/libsvm/RecordIO-protobuf를 받는데, 대규모 학습에서는 RecordIO-protobuf가 효율적이다. 또 XGBoost는 결측치를 내부적으로 학습 가능한 기본 방향으로 처리하므로 사전 대치가 항상 필요하진 않다. 알고리즘별 입력 요구사항을 아는 것도 특성 공학의 일부다.

변환 순서와 누수 방지

파이프라인으로 묶으면 순서와 누수 방지를 코드 수준에서 강제할 수 있다.

[분할] train / validation / test
   │
   ├─ train ── fit_transform ──> 변환기(평균·최소·최대·범주 목록)를 학습
   │                                     │
   ├─ validation ── transform ───────────┤ 같은 변환기 재사용
   └─ test ─────── transform ────────────┘
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
 
preprocessor = ColumnTransformer([
    ("num", StandardScaler(), ["age", "income"]),
    ("cat", OneHotEncoder(handle_unknown="ignore"), ["region"]),
])
X_train_t = preprocessor.fit_transform(X_train)
X_test_t = preprocessor.transform(X_test)   # test엔 fit 안 함 — 누수 방지

handle_unknown="ignore"가 중요하다. test에만 등장하는 새 범주가 있어도 에러 없이 전부 0으로 처리해 서빙 시점의 장애를 막는다.

파생 특성: 없던 정보를 꺼내기

변환만큼 중요한 것이 원래 컬럼에서 새 특성을 만들어내는 일이다. 모델은 사람이 당연하게 아는 것을 스스로 알아내지 못한다.

원본파생 특성왜 도움이 되나
타임스탬프요일, 시간대, 월, 공휴일 여부주말·야간 같은 주기적 패턴을 잡음
가입일가입 후 경과일(tenure)절대 날짜보다 경과 기간이 예측력이 큼
거래 목록최근 30일 건수·합계·평균시점 요약이 개별 거래보다 유용
주소·좌표지역 코드, 중심지까지 거리원시 좌표는 모델이 해석하기 어려움
텍스트길이, 단어 수, 특정 키워드 포함 여부문장을 수치로 요약
두 수치 컬럼비율(부채/소득), 차이관계 자체가 신호일 때가 많음

파생 특성은 미래 누수가 생기기 쉬운 경로다. "최근 30일 합계"를 계산할 때 예측 시점 이후의 거래가 섞이면 백테스트만 좋아진다. 집계 특성은 항상 예측 시점 이전 데이터만 쓰도록 경계를 명시해야 한다.

변환 선택 요약표

데이터 특징적용할 변환이유
단위가 제각각인 수치 + 거리 기반 모델표준화/정규화큰 단위가 거리를 지배
단위가 제각각인 수치 + 트리 모델변환 불필요분할 임계값 비교라 무관
순서 없는 저카디널리티 범주One-Hot가짜 순서를 만들지 않음
순서 있는 범주Ordinal순서 정보를 살림
고카디널리티 범주타깃/빈도 인코딩, 임베딩차원 폭발 회피
오른쪽으로 긴 꼬리 분포로그 변환선형 모델 적합도 개선
이상치가 많은 수치RobustScaler, 캡핑중앙값·IQR 기준이 흔들리지 않음
결측이 의미를 가짐결측 플래그 컬럼 추가정보를 버리지 않음

다음 글에서는 이 변환들을 코드 없이 시각적으로 적용하는 SageMaker Data Wrangler를 본다.

📖 용어

  • 특성 공학(feature engineering) : raw 데이터를 모델이 학습할 수 있는 숫자 표현으로 다듬는 작업 전체.
  • 스케일링 : 단위가 제각각인 수치 특성을 비슷한 범위로 맞추는 것. 거리·경사 기반 모델에 필수.
  • 표준화(Standardization) : 평균을 0, 표준편차를 1로 만드는 변환. 가장 무난한 기본 선택.
  • 정규화(Normalization) : 값을 0~1 범위로 눌러 담는 변환. 범위가 명확한 데이터에 쓴다.
  • 명목형(nominal) : 서울/부산처럼 순서가 없는 범주. One-Hot이 정석.
  • 서열형(ordinal) : 저/중/고처럼 순서가 있는 범주. 정수 인코딩이 자연스럽다.
  • One-Hot 인코딩 : 범주마다 0/1 열을 하나씩 만들어 순서를 부여하지 않는 인코딩.
  • 카디널리티 : 범주형 컬럼의 고유값 개수. 높으면 One-Hot 대신 타깃·빈도 인코딩을 쓴다.
  • 타깃 인코딩 : 각 범주를 그 범주의 타깃 평균값으로 바꾸는 인코딩. 강력하지만 누수에 취약하다.
  • 대치(imputation) : 비어 있는 값을 평균·중앙값·최빈값 등으로 채워 넣는 것.

📝 연습 문제

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

문제 1

KNN 분류 모델에서 "연봉(단위: 원, 수백만~수천만)"과 "근속연수(0~30)" 두 특성을 쓰는데 근속연수가 예측에 거의 반영되지 않는다. 가장 적절한 조치는?

문제 2

"도시: 서울/부산/대구/광주" 명목형 범주를 LabelEncoder로 0/1/2/3으로 변환해 선형회귀에 넣었더니 성능이 이상하다. 원인으로 가장 적절한 것은?

문제 3

데이터 누수를 피하면서 StandardScaler를 적용하는 올바른 절차는?

문제 4

소득 데이터가 오른쪽으로 길게 치우쳐 있고(소수의 초고소득자) 선형회귀 성능이 낮다. 분포를 개선하기 위한 변환으로 가장 적절한 것은?

문제 5

사기 탐지 데이터셋에서 IQR 기준으로 이상치를 탐지했더니 사기 거래 대부분이 이상치로 분류됐다. 이때 적절한 처리는?

이전Week 2 종합 — 데이터 수집·저장 복습Week 2 · Day 5다음 SageMaker Data Wrangler: 코드 없이 끝내는 데이터 준비Week 3 · Day 2

참고 공식 자료

  • MLA-C01 공식 시험 안내(새 탭에서 열림)

이 페이지

  • 특성 공학이 왜 시간의 대부분을 먹나
  • 왜 스케일링이 필요한가
  • 범주형 변수 인코딩
  • 결측치 처리
  • 이상치 처리
  • 수치형 변환과 구간화
  • 변환 순서와 누수 방지
  • 파생 특성: 없던 정보를 꺼내기
  • 변환 선택 요약표
  • 용어
  • 연습 문제