AI 모델 성능을 끌어올리는 데이터 전처리, 결측치, 이상치, 스케일링, 인코딩, 데이터 분리, 파이프라인 자동화까지 실무 위주로 정리.
데이터 편향성
정의
- 데이터 편향성은 수집,처리,라벨링 과정에서 특정 집단, 속성, 상황이 과대 또는 과소대표되는 문제를 의미.
영향
- 모델의 예측 성능 불균형
- 특정 사용자 그룹에 대한 차별적 결과
- 서비스 신뢰도 하락 및 법적, 윤리적 문제 발생 가능성
대응 전략
(1) 데이터 수집 단계
방법 |
설명 |
예시 |
다양한 출처 확보 |
지역, 성별, 연령, 기기, 시간대 등 다양한 상황·집단 포함 |
전국 단위 고객 데이터를 수집해 수도권 집중 현상 방지 |
대표성 확보 |
실제 서비스 대상 분포를 반영한 표본 설계 |
신용평가 모델 → 나이·직업군 분포를 실제 금융권 고객 비율과 일치시키기 |
희귀 사례 보강 |
소수 클래스, 드문 이벤트를 의도적으로 추가 |
사고율 낮은 보험 청구 사례, 사기 거래 패턴 보강 |
(2) 데이터 전처리 단계
방법 |
설명 |
예시 |
데이터 균형화 |
클래스 불균형 해소 → 오버샘플링, 언더샘플링 |
SMOTE로 소수 클래스 생성, 다수 클래스 축소 |
데이터 증강 |
데이터 크기와 다양성 확대 |
텍스트 동의어 치환, 이미지 회전·색상 변경 |
라벨링 품질 관리 |
주관적 편향 최소화 |
다수의 어노테이터, 합의 기반 라벨 결정, 가이드라인 강화 |
(3) 공정성 평가 단계
방법 |
설명 |
모델 편향 측정 |
Demographic parity, Equalized odds, Equal opportunity 등 공정성 메트릭 활용 |
시뮬레이션 테스트 |
특정 속성(성별·지역·연령)에 따른 출력 차이 분석 |
A/B 테스트 |
실제 서비스에서 집단별 성능 차이 확인 및 개선 방향 도출 |
(4) 반복 개선 단게
- 정기적인 데이터 업데이트
- 편향 지표 모니터링
- 모델,데이터,정책 동시 개선
사례
분야 |
편향 문제 |
대응 |
이미지 인식 |
서양인 얼굴 위주 학습 -> 동양인 인식률 낮음 |
아시아인 데이터 보강, 데이터 증강 |
채용 AI |
특정 성별,학력 우대 -> 차별적 추천 |
성별,학력 비식별화, 공정성 메트릭 기반 모델 수정 |
금융 신용평가 |
나이,지역별 데이터 편중 -> 특정 계층 신용 점수 불리 |
인구 통계 기반 샘플링, 리밸런싱 기법 적용 |
정규화(Normalization) & 표준화(Standardization)
1. 개념 비교
항목 |
정규화 (Normalization) |
표준화 (Standardization) |
목적 |
데이터 값을 일정 범위로 스케일링 |
데이터 분포를 평균 0, 표준편차 1로 변환 |
수식 |
$x’ = \dfrac{x - x_{min}}{x_{max} - x_{min}}$ → [0, 1] |
$x’ = \dfrac{x - \mu}{\sigma}$ → 평균=0, 분산=1 |
전제 |
분포 가정 없음 |
가우시안(정규) 분포 가정 선호 |
주요 사용처 |
딥러닝 (신경망, 이미지/텍스트 임베딩 등) |
통계/머신러닝 (SVM, PCA, K-Means, 회귀 등) |
2. 활용 분야
분야 |
주로 쓰는 기법 |
이유 |
딥러닝 (신경망) |
정규화 |
입력값 범위 고정 → 가중치 업데이트 안정화, Gradient Exploding/Vanishing 완화 |
머신러닝 (통계 기반) |
표준화 |
공분산 기반 알고리즘(PCA, LDA, SVM 등)에서 변수 간 스케일 차이 제거 |
거리 기반 알고리즘 |
정규화 or 표준화 |
KNN, K-Means 등에서 변수 단위 차이에 따른 거리 계산 왜곡 방지 |
3. 주의할 점
학습 데이터로만 스케일링 기준($x_{min}$, $x_{max}$, $\mu$, $\sigma$)을 계산하고, 테스트 데이터는 같은 기준을 적용해야 함 → 데이터 누수(Data Leakage) 방지
극단값(Outlier) 존재 시 Min-Max 정규화는 민감 → 표준화(Z-score)나 로버스트 스케일링(Robust Scaler) 사용 고려
딥러닝에서도 Batch Normalization, Layer Normalization처럼 학습 과정 내에서 표준화 계열 기법을 사용하기도 함
텍스트 데이터 정제 (스페셜 토큰)
- 자연어 처리(NLP) 모델은 입력 텍스트를 토큰(token) 단위로 분리하여 처리
- 모델 학습 및 추론 과정에서 특별한 의미를 가지는 토큰(Special Token)을 활용
- 시퀀스 처리, 패딩, 마스킹, 문장 구분, 분류 등에 필수적 역할
주요 스페셜 토큰
토큰 |
의미 / 역할 |
사용 예시 |
<s> / [BOS] |
문장 시작(Start of Sequence) |
디코더가 문장 생성 시작을 알림 |
</s> / [EOS] |
문장 끝(End of Sequence) |
문장 종료 지점 표시 |
<pad> |
패딩(Padding) |
시퀀스 길이 맞추기 → 배치 단위 처리 |
<unk> |
알 수 없는 단어(Unknown) |
사전에 없는 단어(OOV) 대체 |
<sep> |
구분자(Separator) |
BERT 문장쌍 입력 시 두 문장 구분 |
<cls> |
분류(Classification) 토큰 |
문장 전체 의미 요약 → 분류 태스크에 활용 (BERT) |
<mask> |
마스킹(Masked token) |
MLM(Masked Language Model) 학습 시 단어 가려놓고 문맥으로 예측 |
모델별 처리 방식
Sequence-to-Sequence (S2S) 모델
- 사용 예 : 기계번역(Transformer, LSTM 기반 Encoder-Decoder)
- 특징
- 길이 맞추기 위해 Padding 사용 (보통 EOS 뒤에 채움)
- 사전에 없는 단어는
<unk>
로 치환 → 정보 손실 발생
- 예:
1 2
| Inoput : <s> 나는 학생 입니다 </s> <pad> <pad> Output : <s> I am a student </s> <pad> <pad>
|
- 사용 예:문장 분류, 개체명 인식, 질의응답 등
- 특징
- 입력 시 [CLS] / [SEP] 토큰으로 문장 전체 구조 표현
- 단어를 subword 단위로 분해 (WordPiece, SentencePiece) -> OOV 문제 완화
- 학습 시 일부 토큰을 [MASK]로 가려 문맥 기반 예측 학습(MLM)
- 예:
1 2
| Input : [CLS] 나는 [MASK] 입니다 [SEP] Model : 학생 -> 문맥으로 예측
|
Pandas 핵심 기능 정리
데이터 입출력 & 기본 확인
범주 |
코드 예시 |
설명 |
데이터 불러오기 |
pd.read_csv('data.csv') |
CSV 파일 읽기 |
데이터 확인 |
df.head() |
상위 5개 행 보기 |
|
df.info() |
데이터 타입 및 결측치 정보 |
|
df.describe() |
기초 통계 정보 확인 |
결측치 처리
코드 예시 |
설명 |
df.isnull().sum() |
컬럼별 결측치 개수 확인 |
df.dropna() |
결측치가 있는 행 제거 |
df['col'].fillna(df'['col']).mean() |
평균값으로 결측치 채우기 |
df.dropna(axis=0, thresh=5) |
5개 미만 값만 있는 행 삭제 |
df.dropna(axis=1) |
결측치가 하나라도 있는 열 삭제 |
inplace=True
- df.dropna(inplace=True) -> 원본
df
자체가 변경됨
- 기본값
False
는 새로운 DataFrame 반환 -> 원본 유지
중복 처리
코드 예시 |
설명 |
`df.drop_duplicates() |
완전 동일한 행 제거 |
`df.drop_duplicates(subset=[‘user_id’,’date]) |
특정 컬럼 기준 중복 제거 |
데이터 타입 변환
코드 예시 |
설명 |
`pd.to_datetime(df[‘data’]) |
문자열 -> 날짜 변환 |
`df[‘category’].astype(‘category’) |
범주형 데이터로 변환 |
조건 필터링 / 새로운 컬럼 생성
코드 예시 |
설명 |
`df[df[‘age’] > 30] |
age가 30 이상인 행 선택 |
`df[‘bmi’] = df[‘w’]/(df[‘h’]/100) ** 2 |
BMI 계산 후 컬럼 추가 |
그룹화 / 집계
코드 예시 |
설명 |
`df.groupby(‘category’)[‘sales’].sum() |
카테고리별 판매 합계 |
정렬
코드 예시 |
설명 |
`df.sort_values(by=’date’, ascending=False) |
날짜 기준 내림차순 정렬 |
이상치 탐지 (IQR 활용)
1 2 3 4
| Q1 = df['c'].quantile(0.25) Q3 = df['c'].quantile(0.75) IQR = Q3 - Q1 outliers = df[(df['c'] < Q1 - 1.5*IQR) | (df['c'] > Q3 + 1.5*IQR)]
|
문자열 처리
코드 예시 |
설명 |
df[‘name’].str.lower() |
소문자 변환 |
df[‘name’].str.strip() |
공백 제거 |
df[‘email’].str.split(‘@’).str[1] |
이메일 도메인 추출 |
날짜 / 시간 처리
코드 예시 |
설명 |
`df[‘date’] = pd.to_datetime(df[‘date’]) |
날짜 변환 |
`df[‘year’] = df[‘date’].dt.year |
연도 추출 |
`df[‘month’] = df[‘date’].dt.month |
월 추출 |
`df[‘weekday’] = df[‘date’].dt.day_name() |
요일 추출 |
`df[‘end’] - df[‘start’]).dt.days |
날짜 차이 계산 |
범주형 인코딩
코드 예시 |
설명 |
df['cat'].astype('category').cat.codes |
레이블 인코딩 |
`pd.get_dummies(df, columes=[‘cat’]) |
원-핫 인코딩 |
데이터 병합
코드 예시 |
설명 |
`pd.merge(df1, df2, on=’id’, how=’inner’) |
내부 조인 |
`pd.merge(df1, df2, on=’id’, how=’left’) |
왼쪽 조인 |
피벗 테이블
코드 예시 |
설명 |
df.pivot_table(index=’cat’, columns=’year’, values=’sales’, aggfunc=’sum’) |
피벗 테이블 생성 |
샘플링
코드 예시 |
설명 |
`df.sample(frac=0.1, random_state=42) |
10% 무작위 샘플 추출 |
포인트
inplace=True
-> 메모리 절약, 체인 연산 어려움 -> 실수 시 원복 힘듦
- 체인 연산 / 디버깅 편의성 위해 보통 기본값 False 사용 권장 후 필요한 경우 마지막에 덮어쓰기
- 대용량 데이터 :
chunksize
옵션으로 CSV 읽기 (pd.read_csv(..., chunksize=100000
))
데이터 증강 (Data Augmentation) 정리
- 데이터 증강은 기존 데이터를 변형/합성하여 모델이 더 일반화되도록 돕는 기법
- 특히 이미지, 음성, 텍스트 등 비정형 데이터 처리에서 많이 사용
- 목적
- 데이터 부족 문제 해소
- 모델이 다양한 상황 (노이즈, 가림, 색 변화 등)에 강건해지도록 개선
- 과적합(Overfitting) 완화
주요 기법별 특징
기법 |
적용 분야 |
방법 |
장점 |
주의할 점 |
Gaussian Blur |
이미지 |
가우시안 커널로 이미지 흐리게 |
해상도/화질 저하 상황 대응, 과적합 방지 |
디테일 손실 → 작은 물체 탐지 악영향 |
Random Erasing |
이미지 |
임의 영역 제거 후 채움 |
가림(occlusion) 상황 대응, 정규화 효과 |
중요한 객체 삭제 시 성능 저하 가능 |
Mixup |
이미지·오디오 |
두 샘플 입력+레이블 선형 혼합 |
일반화 향상, 과적합 완화 |
비현실적 샘플 → 해석 어려움, 경계 모호화 |
CutMix |
이미지 |
한 이미지 일부를 다른 이미지에 붙임 |
Mixup보다 객체 형태 보존 |
원본과 다른 의미 생길 수 있음 |
Color Jitter |
이미지 |
밝기·대비·채도·색조 변환 |
다양한 조명 상황 대응 |
과도 시 실제 데이터와 괴리 |
Noise Injection |
이미지·오디오·탭울러 |
랜덤 노이즈 추가 |
모델이 노이즈에 강건 |
너무 심하면 원본 패턴 왜곡 |
SMOTE |
탭울러(불균형 분류) |
소수 클래스 주변 k-NN 보간 |
불균형 개선, 다양성 증가 |
이상치 주변 합성 → 성능 저하 |
ADASYN |
탭울러(불균형 분류) |
어려운 영역에 집중 합성 |
경계 학습 강화 |
노이즈도 강화 가능, 과적합 위험 |
SpecAugment |
음성 |
스펙트로그램 구간/주파수 마스킹 |
음성 다양성 증가 |
정보 손실 주의 |
Back Translation |
텍스트 |
번역 후 다시 원문 언어로 역번역 |
자연스러운 문장 다양화 |
번역 품질 따라 성능 좌우 |
EDA |
텍스트 |
동의어 치환, 삭제, 삽입, 순서 변경 |
간단·빠른 증강 |
의미 왜곡 가능성 있음 |
그래프 데이터 증강
구분 |
기법 |
설명 |
장점 |
구조변형 |
Edge Dropping |
무작위로 일부 엣지 제거 |
연결 희소화, 과적합 방지 |
구조변형 |
Edge Perturbation |
엣지를 랜덤 추가/삭제 |
구조 다양성 증가 |
구조변형 |
Node Dropping |
일부 노드와 연결 엣지 제거 |
중요 노드 의존 감소 |
구조변형 |
Subgraph Sampling |
Random Walk/BFS로 부분 그래프 추출 |
대규모 그래프 학습 효율 ↑ |
노드 특성변형 |
Feature Masking |
일부 노드 피처를 0으로 마스킹 |
정보 불완전성에 강건 |
노드 특성변형 |
Feature Perturbation |
노드 피처에 노이즈 추가(예: Gaussian) |
잡음 환경 대응 |
노드 특성변형 |
Attribute Shuffling |
동일 클래스 내 노드 피처 섞기 |
데이터 다양성 증가 |
Mixup 계열 |
Graph Mixup |
두 그래프/노드 임베딩을 선형 보간 |
결정 경계 부드러움, 일반화 ↑ |
Mixup 계열 |
Manifold Mixup |
latent space에서 보간 |
일반화 성능 ↑ |
Mixup 계열 |
GraphSMOTE |
소수 클래스 근처 synthetic node 생성 |
클래스 불균형 완화 |
고급 기법 |
DropEdge |
학습 중 일부 엣지 랜덤 drop |
over-smoothing 완화 |
고급 기법 |
GraphCL/GRACE 등 |
두 증강 뷰를 만들어 contrastive loss 학습 |
표현 학습 강화, 라벨 부족에 효과 |
고급 기법 |
Adversarial Augmentation |
구조/피처에 adversarial perturbation 추가 |
모델 강건성(robustness) 강화 |
그래프 데이터 증강 (Generative Model)
Diffusion Model (확산 모델)
- 원리
- Forward: 데이터에 점진적으로 노이즈 추가 → 가우시안 분포
- Reverse: 학습된 네트워크가 노이즈 단계적 제거 → 샘플 생성
- 특징
- 매우 고품질 샘플, 모드 붕괴 거의 없음
- 학습·샘플링 느림(최근 DDIM 등으로 개선)
GAN (Generative Adversarial Network)
- 원리
- Generator: 가짜 데이터 생성
- Discriminator: 진짜/가짜 판별, 적대적 학습으로 Generator 개선
- 특징
- 학습/샘플링 빠름, 고품질 생성 가능
- 단점: 학습 불안정, 모드 붕괴(다양성 부족)
VAE (Variational Autoencoder)
- 원리
- Encoder: 데이터를 잠재 공간 확률분포로 인코딩
- Decoder: 잠재 벡터에서 데이터 복원, KL Divergence로 정규화
- 특징
- 안정적 학습, 잠재 공간 해석 용이(인터폴레이션 적합)
- 단점: 생성 품질이 GAN·Diffusion 대비 낮고 흐릿한 경향