[AI 101] 데이터셋 구성의 모든 것 – AI 성능을 좌우하는 데이터 준비의 기술
핵심 요약
“좋은 데이터가 좋은 AI를 만든다”는 AI 업계의 불변의 진리입니다. 아무리 뛰어난 알고리즘이라도 데이터셋 구성이 잘못되면 실패합니다. Training set(60-80%), Validation set(10-20%), Test set(10-20%)의 올바른 분할, 철저한 데이터 전처리(결측치, 이상치, 정규화), 그리고 정확한 데이터 라벨링이 AI 프로젝트 성공의 80%를 차지합니다. 이 포스팅에서는 Kaggle 우승팀이 사용하는 데이터셋 구성 전략부터 무료 라벨링 도구, 실전 전처리 코드까지 완벽하게 설명합니다.
📍 목차
- 데이터 수집 방법과 출처
- Training/Validation/Test set의 역할과 분할 비율
- 데이터 전처리와 정제 과정
- 데이터 라벨링(Labeling)이란?
- 실전 데이터셋 구성 체크리스트
1. 데이터 수집 방법과 출처
1-1. 데이터 수집의 중요성
AI 프로젝트의 80% 시간은 데이터 수집과 전처리에 사용됩니다.
| AI 프로젝트 단계 | 소요 시간 비율 | 설명 |
|---|---|---|
| 데이터 수집 | 30% | 적합한 데이터 찾기, 수집, 저장 |
| 데이터 전처리 | 50% | 정제, 변환, 라벨링 |
| 모델 개발 | 15% | 알고리즘 선택, 학습 |
| 평가 및 배포 | 5% | 테스트, 최적화, 배포 |
결론: 데이터 수집과 전처리가 전체 프로젝트의 80%를 차지합니다.
1-2. 데이터 수집 5가지 방법
1️⃣ 공개 데이터셋 활용
가장 빠르고 쉬운 방법입니다. 이미 정제되고 라벨링된 데이터를 무료로 사용할 수 있습니다.
주요 공개 데이터셋 플랫폼:
| 플랫폼 | URL | 특징 | 데이터 종류 |
|---|---|---|---|
| Kaggle Datasets | kaggle.com/datasets | 50,000개 이상 데이터셋 | 이미지, 텍스트, 정형 |
| AI Hub (한국) | aihub.or.kr | 한국어 데이터 풍부 | 음성, 텍스트, 이미지 |
| UCI ML Repository | archive.ics.uci.edu | 학술 연구용 | 정형 데이터 위주 |
| ImageNet | image-net.org | 1,400만 장 이미지 | 이미지 분류 |
| Google Dataset Search | datasetsearch.research.google.com | 구글의 데이터셋 검색 엔진 | 모든 종류 |
| Hugging Face Datasets | huggingface.co/datasets | NLP 데이터셋 풍부 | 텍스트, 음성 |
장점:
- ✅ 무료
- ✅ 즉시 사용 가능
- ✅ 이미 정제되고 라벨링됨
- ✅ 벤치마크 비교 가능
단점:
- ❌ 특정 프로젝트에 맞지 않을 수 있음
- ❌ 경쟁사도 같은 데이터 사용
- ❌ 저작권 제한 있을 수 있음
2️⃣ 웹 스크래핑(Web Scraping)
인터넷에서 데이터를 자동으로 수집하는 방법입니다.
Python 웹 스크래핑 예시:
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 웹페이지 가져오기
url = 'https://example.com/products'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 데이터 추출
products = []
for item in soup.find_all('div', class_='product'):
name = item.find('h2', class_='title').text
price = item.find('span', class_='price').text
products.append({'name': name, 'price': price})
# DataFrame으로 저장
df = pd.DataFrame(products)
df.to_csv('products.csv', index=False)추천 라이브러리:
- BeautifulSoup: HTML 파싱
- Scrapy: 대규모 스크래핑 프레임워크
- Selenium: 동적 웹페이지 스크래핑
주의사항:
- ⚠️
robots.txt확인 (스크래핑 허용 여부) - ⚠️ 저작권 존중
- ⚠️ 서버에 과부하 주지 않기 (요청 간격 두기)
3️⃣ API 활용
공식 API를 통해 데이터를 수집하는 방법입니다.
인기 API:
| API | 용도 | 무료 제한 |
|---|---|---|
| Twitter API | 소셜 미디어 데이터 | 월 500,000 트윗 |
| YouTube Data API | 영상 메타데이터 | 일 10,000 쿼터 |
| OpenWeatherMap | 날씨 데이터 | 일 1,000회 |
| Google Maps API | 지도 데이터 | 월 $200 크레딧 |
| Reddit API | 커뮤니티 데이터 | 무제한 (Rate limit 있음) |
Python API 사용 예시:
import requests
# OpenWeatherMap API 예시
api_key = 'YOUR_API_KEY'
city = 'Seoul'
url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}'
response = requests.get(url)
weather_data = response.json()
print(f"온도: {weather_data['main']['temp']}K")
print(f"날씨: {weather_data['weather'][0]['description']}")4️⃣ 센서 및 IoT 데이터
하드웨어 센서로 직접 데이터 수집하는 방법입니다.
예시:
- 스마트폰 센서: 가속도계, 자이로스코프, GPS
- IoT 기기: 온습도 센서, 카메라, 마이크
- 웨어러블: 심박수, 걸음 수, 수면 패턴
Arduino 센서 데이터 수집 예시:
import serial
import csv
# Arduino와 시리얼 연결
ser = serial.Serial('/dev/ttyUSB0', 9600)
# 데이터 수집
with open('sensor_data.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['timestamp', 'temperature', 'humidity'])
for i in range(1000):
line = ser.readline().decode('utf-8').strip()
timestamp, temp, humidity = line.split(',')
writer.writerow([timestamp, temp, humidity])5️⃣ 크라우드소싱
다수의 사람들에게 데이터를 수집하는 방법입니다.
크라우드소싱 플랫폼:
- Amazon Mechanical Turk: 미국 중심
- 크라우드웍스 (한국): 한국어 데이터 수집
- Google Forms: 설문 조사
- Figure Eight (Appen): 데이터 라벨링 전문
비용:
- 이미지 라벨링: 개당 $0.01~0.10
- 텍스트 분류: 개당 $0.05~0.20
- 음성 녹음: 분당 $1~5
1-3. 데이터 수집 시 법적 고려사항
GDPR, 개인정보보호법 준수:
| 항목 | 설명 | 예시 |
|---|---|---|
| 개인정보 익명화 | 이름, 주민번호 등 제거 | “홍길동” → “사용자_1234” |
| 동의 획득 | 데이터 수집 전 동의 | “데이터 수집 동의” 체크박스 |
| 목적 명시 | 사용 목적 명확히 | “AI 학습용” |
| 저장 기간 제한 | 불필요한 데이터 삭제 | 프로젝트 종료 후 1년 |
2. Training/Validation/Test set의 역할과 분할 비율
2-1. 3가지 데이터셋의 역할
AI 학습은 시험 공부와 비슷합니다.
| 데이터셋 | 시험 공부 비유 | AI 학습 역할 |
|---|---|---|
| Training set | 📚 교과서 | 모델이 패턴을 학습하는 데이터 |
| Validation set | 📝 모의고사 | 모델 성능을 중간 평가하고 하이퍼파라미터 조정 |
| Test set | 🎓 수능 | 최종 모델 성능을 평가 (절대 학습에 사용 안 함) |
2-2. Training Set (훈련 데이터)
역할: 모델이 패턴을 학습하는 데이터
예시:
from sklearn.model_selection import train_test_split
# 데이터 로드
X = [[1, 2], [3, 4], [5, 6], [7, 8]] # 입력 데이터
y = [0, 0, 1, 1] # 정답 레이블
# Training과 나머지 분할 (80:20)
X_train, X_temp, y_train, y_temp = train_test_split(
X, y, test_size=0.2, random_state=42
)
print(f"Training set 크기: {len(X_train)}") # 80%특징:
- ✅ 전체 데이터의 60~80%
- ✅ 모델이 이 데이터를 반복해서 학습
- ✅ 많을수록 좋음 (단, 과적합 주의)
2-3. Validation Set (검증 데이터)
역할: 모델의 중간 성능 평가 및 하이퍼파라미터 조정
하이퍼파라미터 튜닝 예시:
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
# 하이퍼파라미터 후보
param_grid = {
'n_estimators': [10, 50, 100],
'max_depth': [5, 10, 20]
}
# Grid Search (내부적으로 Validation set 사용)
model = RandomForestClassifier()
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X_train, y_train)
print(f"최적 하이퍼파라미터: {grid_search.best_params_}")특징:
- ✅ 전체 데이터의 10~20%
- ✅ 학습 중 모델 성능 모니터링
- ✅ 과적합 조기 발견
Early Stopping 예시 (딥러닝):
from tensorflow.keras.callbacks import EarlyStopping
# Validation loss가 5 epoch 동안 개선 없으면 학습 중단
early_stop = EarlyStopping(monitor='val_loss', patience=5)
model.fit(
X_train, y_train,
validation_data=(X_val, y_val),
epochs=100,
callbacks=[early_stop]
)2-4. Test Set (테스트 데이터)
역할: 최종 모델의 일반화 성능 평가
중요 원칙:
- ⚠️ 절대 학습에 사용하지 않음
- ⚠️ 단 한 번만 평가
- ⚠️ Test set 성능을 보고 모델 수정하면 데이터 누수(Data Leakage)
Test set 평가 예시:
# 최종 모델 평가 (딱 한 번!)
test_accuracy = model.score(X_test, y_test)
print(f"Test Accuracy: {test_accuracy:.2%}")
# ❌ 잘못된 사용: Test set 성능을 보고 모델 재학습
# if test_accuracy 2-5. 데이터셋 분할 비율
전통적 비율 (데이터
| 데이터 크기 | Training | Validation | Test |
|---|---|---|---|
| 1,000개 | 60% (600) | 20% (200) | 20% (200) |
| 10,000개 | 60% (6,000) | 20% (2,000) | 20% (2,000) |
| 100,000개 | 60% (60,000) | 20% (20,000) | 20% (20,000) |
빅데이터 시대 비율 (데이터 > 1,000,000):
| 데이터 크기 | Training | Validation | Test | 이유 |
|---|---|---|---|---|
| 1,000,000개 | 98% (980,000) | 1% (10,000) | 1% (10,000) | Validation/Test에 10,000개면 충분 |
| 10,000,000개 | 99.5% (9,950,000) | 0.25% (25,000) | 0.25% (25,000) | 더 많은 데이터를 학습에 활용 |
핵심 원칙:
- 절대적 개수가 중요 (비율이 아님)
- Validation/Test는 각 10,000개 정도면 충분
- 나머지는 모두 Training에 사용
2-6. K-Fold Cross Validation
데이터가 부족할 때 사용하는 기법입니다.
작동 방식:
전체 데이터를 K개(보통 5 or 10)로 나눔
Fold 1: [Test] [Train] [Train] [Train] [Train]
Fold 2: [Train] [Test] [Train] [Train] [Train]
Fold 3: [Train] [Train] [Test] [Train] [Train]
Fold 4: [Train] [Train] [Train] [Test] [Train]
Fold 5: [Train] [Train] [Train] [Train] [Test]
→ 각 Fold의 성능 평균을 최종 성능으로 사용Python 구현:
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
# 5-Fold Cross Validation
scores = cross_val_score(model, X, y, cv=5)
print(f"각 Fold 점수: {scores}")
print(f"평균 점수: {scores.mean():.2%}")
print(f"표준편차: {scores.std():.2%}")장점:
- ✅ 모든 데이터를 Training과 Test에 활용
- ✅ 과적합 방지
- ✅ 안정적인 성능 평가
단점:
- ❌ 학습 시간 K배 증가 (5-Fold면 5번 학습)
3. 데이터 전처리와 정제 과정
3-1. 데이터 전처리란?
데이터 전처리(Data Preprocessing)는 원시 데이터를 AI가 학습할 수 있는 형태로 변환하는 과정입니다.
전처리 파이프라인:
원시 데이터
↓
1. 데이터 정제 (결측치, 이상치, 중복 제거)
↓
2. 데이터 변환 (정규화, 인코딩)
↓
3. 데이터 증강 (Data Augmentation)
↓
학습 가능한 데이터3-2. 데이터 정제 (Data Cleansing)
1️⃣ 결측치 처리
결측치(Missing Values)는 데이터가 비어 있는 경우입니다.
Python 결측치 확인:
import pandas as pd
import numpy as np
# 샘플 데이터
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, np.nan, 30, 35],
'salary': [50000, 60000, np.nan, 70000]
})
# 결측치 확인
print(df.isnull().sum())출력:
name 0
age 1
salary 1
dtype: int64결측치 처리 방법:
| 방법 | 설명 | 코드 | 장점 | 단점 |
|---|---|---|---|---|
| 삭제 | 결측치가 있는 행 제거 | df.dropna() | 간단 | 데이터 손실 |
| 평균 대체 | 평균값으로 채우기 | df.fillna(df.mean()) | 간단 | 분산 감소 |
| 중앙값 대체 | 중앙값으로 채우기 | df.fillna(df.median()) | 이상치에 강함 | 분산 감소 |
| 최빈값 대체 | 가장 많이 나타난 값 | df.fillna(df.mode()[0]) | 범주형 데이터에 적합 | 편향 발생 |
| 예측 모델 | 다른 변수로 예측 | scikit-learn SimpleImputer | 정확함 | 복잡함 |
예시 코드:
# 방법 1: 삭제
df_clean = df.dropna()
# 방법 2: 평균 대체
df['age'].fillna(df['age'].mean(), inplace=True)
# 방법 3: 예측 모델 (scikit-learn)
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
df[['age', 'salary']] = imputer.fit_transform(df[['age', 'salary']])2️⃣ 이상치 처리
이상치(Outliers)는 비정상적으로 크거나 작은 값입니다.
이상치 탐지 방법:
1. IQR (Interquartile Range) 방법:
import pandas as pd
# 샘플 데이터
df = pd.DataFrame({'salary': [30000, 35000, 40000, 45000, 50000, 1000000]})
# IQR 계산
Q1 = df['salary'].quantile(0.25)
Q3 = df['salary'].quantile(0.75)
IQR = Q3 - Q1
# 이상치 경계
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상치 제거
df_clean = df[(df['salary'] >= lower_bound) & (df['salary'] 2. Z-Score 방법:
from scipy import stats
import numpy as np
# Z-Score 계산
z_scores = np.abs(stats.zscore(df['salary']))
# Z-Score > 3이면 이상치로 간주
df_clean = df[z_scores 3️⃣ 중복 데이터 제거
# 중복 확인
print(f"중복 개수: {df.duplicated().sum()}")
# 중복 제거
df_clean = df.drop_duplicates()3-3. 데이터 변환 (Data Transformation)
1️⃣ 정규화 (Normalization)
정규화는 데이터를 0~1 범위로 조정합니다.
공식:
[
X_{norm} = \frac{X – X_{min}}{X_{max} – X_{min}}
]
Python 구현:
from sklearn.preprocessing import MinMaxScaler
# 샘플 데이터
df = pd.DataFrame({'salary': [30000, 50000, 70000, 90000]})
# Min-Max 정규화
scaler = MinMaxScaler()
df['salary_normalized'] = scaler.fit_transform(df[['salary']])
print(df)출력:
salary salary_normalized
0 30000 0.0
1 50000 0.333333
2 70000 0.666667
3 90000 1.02️⃣ 표준화 (Standardization)
표준화는 데이터를 평균 0, 표준편차 1로 조정합니다.
공식:
[
X_{std} = \frac{X – \mu}{\sigma}
]
Python 구현:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df['salary_standardized'] = scaler.fit_transform(df[['salary']])
print(df)정규화 vs 표준화:
| 항목 | 정규화 (Min-Max) | 표준화 (Z-Score) |
|---|---|---|
| 범위 | 0 ~ 1 | 평균 0, 표준편차 1 |
| 이상치 영향 | 크다 | 작다 |
| 사용 시기 | 이미지 (픽셀 0~255) | 일반적인 수치 데이터 |
3️⃣ 범주형 데이터 인코딩
범주형 데이터(성별, 색상 등)를 숫자로 변환해야 AI가 학습할 수 있습니다.
1. Label Encoding:
from sklearn.preprocessing import LabelEncoder
df = pd.DataFrame({'color': ['red', 'blue', 'green', 'red']})
# Label Encoding
encoder = LabelEncoder()
df['color_encoded'] = encoder.fit_transform(df['color'])
print(df)출력:
color color_encoded
0 red 2
1 blue 0
2 green 1
3 red 22. One-Hot Encoding:
# One-Hot Encoding
df_encoded = pd.get_dummies(df['color'], prefix='color')
print(df_encoded)출력:
color_blue color_green color_red
0 0 0 1
1 1 0 0
2 0 1 0
3 0 0 1언제 어떤 인코딩을 사용할까?
| 상황 | 추천 방법 | 이유 |
|---|---|---|
| 순서가 있는 범주 (소/중/대) | Label Encoding | 숫자로 순서 표현 가능 |
| 순서가 없는 범주 (색상) | One-Hot Encoding | 숫자 크기가 의미 없음 |
| 범주가 많음 (> 10개) | Target Encoding | One-Hot은 차원 폭발 |
3-4. 데이터 증강 (Data Augmentation)
이미지 데이터의 양을 인위적으로 늘리는 기법입니다.
Python 구현 (TensorFlow):
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 데이터 증강 설정
datagen = ImageDataGenerator(
rotation_range=20, # 20도 회전
width_shift_range=0.2, # 좌우 20% 이동
height_shift_range=0.2, # 상하 20% 이동
horizontal_flip=True, # 좌우 반전
zoom_range=0.2 # 20% 확대/축소
)
# 원본 이미지 로드
from tensorflow.keras.preprocessing import image
img = image.load_img('cat.jpg', target_size=(224, 224))
img_array = image.img_to_array(img)
img_array = img_array.reshape((1,) + img_array.shape)
# 증강된 이미지 생성
i = 0
for batch in datagen.flow(img_array, batch_size=1):
i += 1
if i > 5: # 5개 생성
break효과:
- ✅ 데이터 양 10배 이상 증가
- ✅ 과적합 방지
- ✅ 모델의 일반화 성능 향상
4. 데이터 라벨링(Labeling)이란?
4-1. 데이터 라벨링의 정의
데이터 라벨링(Labeling)은 원시 데이터에 정답 표시를 붙이는 작업입니다.
예시:
| 원시 데이터 (이미지) | 라벨 (정답) |
|---|---|
| 🐶 사진 | “개” |
| 🐱 사진 | “고양이” |
| 🚗 사진 | “자동차” |
4-2. 라벨링 유형
1️⃣ 분류(Classification) 라벨링
전체 데이터에 하나의 레이블을 붙입니다.
예시:
- 이메일: “스팸” or “정상”
- 리뷰: “긍정” or “부정”
- 이미지: “고양이”, “개”, “새”
2️⃣ 객체 탐지(Object Detection) 라벨링
이미지 내 객체의 위치를 표시합니다.
바운딩 박스(Bounding Box):
이미지: 거리 사진
라벨:
- 자동차: (x=100, y=150, w=200, h=150)
- 사람: (x=300, y=200, w=80, h=180)
- 신호등: (x=500, y=50, w=40, h=100)3️⃣ 시맨틱 세그멘테이션(Semantic Segmentation)
픽셀 단위로 레이블을 붙입니다.
예시:
자율주행차 이미지
- 도로: 파란색
- 차량: 빨간색
- 보행자: 초록색
- 건물: 회색4️⃣ 텍스트 라벨링
텍스트에 의미를 표시합니다.
개체명 인식(NER) 예시:
문장: "삼성전자가 서울에서 스마트폰을 출시했다."
라벨:
- 삼성전자: [조직]
- 서울: [장소]
- 스마트폰: [제품]4-3. 라벨링 도구
무료 오픈소스 도구:
| 도구 | 용도 | URL | 특징 |
|---|---|---|---|
| Labelbox | 이미지, 비디오 | labelbox.com | 클라우드 기반, 협업 기능 |
| CVAT | 컴퓨터 비전 | cvat.org | 객체 탐지, 세그멘테이션 |
| LabelImg | 이미지 | GitHub | 바운딩 박스, 오프라인 |
| Doccano | 텍스트 | doccano.github.io | NER, 문장 분류 |
| Label Studio | 모든 타입 | labelstud.io | 이미지, 텍스트, 오디오 |
한국 라벨링 플랫폼:
| 플랫폼 | URL | 특징 |
|---|---|---|
| AI Hub | aihub.or.kr | 한국 정부 지원, 무료 |
| 에이모 (AIMMO) | aimmo.ai | 자동화 라벨링 |
| 크라우드웍스 | crowdworks.kr | 크라우드소싱 |
4-4. 라벨링 실전 팁
1️⃣ 라벨링 가이드라인 작성
일관성을 위해 명확한 규칙을 정의하세요.
예시:
이미지 분류 가이드라인
1. 개 vs 고양이
- 귀 모양이 뾰족하면 → 고양이
- 귀 모양이 둥글면 → 개
2. 애매한 경우
- 동물이 2종류 이상 → "기타"로 분류
- 흐릿한 이미지 → "불명확"으로 분류
3. 품질 기준
- 바운딩 박스는 객체를 정확히 포함
- 여백은 최소 5픽셀 이하2️⃣ 품질 검증
라벨링 품질을 확인하세요.
방법:
- 전체 데이터의 10% 샘플링
- 2명 이상이 동일하게 라벨링 (Inter-annotator agreement)
- 일치율 95% 이상 목표
from sklearn.metrics import cohen_kappa_score
# 두 라벨러의 결과
labeler1 = [0, 1, 1, 0, 1]
labeler2 = [0, 1, 1, 1, 1]
# Cohen's Kappa 계산 (일치도)
kappa = cohen_kappa_score(labeler1, labeler2)
print(f"일치도: {kappa:.2f}") # 0.75 (상당히 일치)3️⃣ 액티브 러닝 (Active Learning)
모델이 확신 없는 데이터만 사람이 라벨링하는 기법입니다.
프로세스:
1. 일부 데이터 수동 라벨링 (1,000개)
2. 모델 학습
3. 모델이 예측 (확률값 포함)
4. 확신도 낮은 데이터만 추가 라벨링 (200개)
5. 모델 재학습
6. 반복효과:
- ✅ 라벨링 비용 50~70% 절감
- ✅ 적은 데이터로 높은 성능
5. 실전 데이터셋 구성 체크리스트
데이터 수집 단계
- [ ] 프로젝트 목표에 맞는 데이터 출처 확인
- [ ] 최소 10,000개 이상 데이터 확보
- [ ] 저작권 및 개인정보 문제 없는지 확인
- [ ] 데이터 다양성 확보 (다양한 상황, 각도, 조명)
데이터 분할 단계
- [ ] Training/Validation/Test set 비율 결정
- 데이터
- 데이터 > 1,000,000: 98/1/1
- [ ] Stratified Split 사용 (클래스 비율 유지)
- [ ] Test set은 절대 학습에 사용하지 않음
데이터 전처리 단계
- [ ] 결측치 확인 및 처리
- [ ] 이상치 탐지 및 제거
- [ ] 중복 데이터 제거
- [ ] 정규화/표준화 수행
- [ ] 범주형 데이터 인코딩
- [ ] 데이터 증강 (이미지/텍스트)
데이터 라벨링 단계
- [ ] 라벨링 가이드라인 작성
- [ ] 라벨링 도구 선택
- [ ] 샘플 라벨링 후 품질 검증
- [ ] 전체 라벨링 수행
- [ ] 최종 품질 검증 (10% 샘플)
최종 확인
- [ ] 각 클래스별 데이터 균형 확인
- [ ] 라벨 분포 시각화
- [ ] 샘플 데이터 육안 확인
- [ ] 데이터 저장 및 백업
FAQ: 초보자가 자주 묻는 질문
Q1. 데이터가 부족하면 어떻게 하나요?
A. 세 가지 방법이 있습니다: (1) 데이터 증강(Augmentation): 이미지 회전, 확대 등으로 인위적으로 늘리기, (2) 전이 학습(Transfer Learning): 다른 데이터로 사전 학습된 모델 활용, (3) 크라우드소싱: Amazon MTurk, 크라우드웍스로 데이터 수집.
Q2. Training과 Test set의 분포가 달라도 되나요?
A. 절대 안 됩니다. 이를 “데이터 드리프트(Data Drift)”라고 하며, 모델이 실제 환경에서 제대로 작동하지 않습니다. Training과 Test는 같은 분포에서 랜덤 샘플링해야 합니다.
Q3. Validation set이 꼭 필요한가요?
A. Yes. Validation 없이 Test set으로만 평가하면, Test set에 과적합될 수 있습니다. Validation은 “모의고사”, Test는 “수능”이라고 생각하세요.
Q4. 라벨링 비용이 너무 비쌉니다. 대안이 있나요?
A. (1) 약한 지도학습(Weak Supervision): Snorkel 같은 도구로 자동 라벨링, (2) Self-supervised Learning: 라벨 없이 학습 (BERT, GPT), (3) Semi-supervised Learning: 소량만 라벨링하고 나머지는 자동 예측.
Q5. 정규화와 표준화 중 뭘 써야 하나요?
A. 이미지(픽셀 0~255): Min-Max 정규화 (0~1로 변환). 일반 수치 데이터: Z-Score 표준화 (이상치에 강함). 정답은 없으니 둘 다 시도해보고 성능 비교하세요.
외부 참고 자료
데이터셋 구성을 더 깊게 배우고 싶다면:
- Kaggle Learn – Data Cleaning – 실전 데이터 정제 튜토리얼
- scikit-learn – train_test_split – 공식 문서
- Labelbox 가이드 – 데이터 라벨링 도구
- AI Hub 데이터셋 – 한국어 공개 데이터셋
- Google Dataset Search – 데이터셋 검색 엔진
정리: 이 글에서 배운 것
✅ 데이터 수집: Kaggle, AI Hub, 웹 스크래핑, API, 크라우드소싱
✅ 데이터 분할: Training(60-80%) / Validation(10-20%) / Test(10-20%)
✅ 데이터 전처리: 결측치, 이상치, 정규화, 인코딩, 증강
✅ 데이터 라벨링: Labelbox, CVAT, 가이드라인 작성, 품질 검증
✅ 핵심 원칙: Test set은 절대 학습 금지, 데이터 품질이 모델 성능 결정
다음 편에서는 “신경망의 시작 – 퍼셉트론에서 딥러닝까지“에 대해 자세히 알아봅니다. 특히 단층 퍼셉트론, 다층 퍼셉트론, 역전파 알고리즘을 수식과 코드로 완벽 설명하겠습니다.
같이 보기
- 합성 데이터(Synthetic Data) 완벽 가이드: AI가 AI를 위해 데이터를 만든다! 실제 데이터 부족을 해결하는 마법
- 특성 공학(Feature Engineering) – AI 성능을 2배 높이는 데이터 변환의 기술
- AI 프로젝트 85% 실패의 진짜 원인 – 데이터 품질과 정제의 모든 것
- AI가 차별하는 충격적 이유 – 데이터 편향과 공정성의 모든 것
- AI 보안 완벽 가이드: 당신의 AI를 해킹하는 6가지 방법과 막는 법 – 공격과 방어의 모든 것!
- EU AI Act 완벽 해부: 세계 최초 AI 규제법의 모든 것 – 위반 시 매출 7% 벌금, 당신의 AI는 안전한가?
- AI 환각(Hallucination) 완벽 분석: 왜 AI는 자신있게 거짓말을 하는가? 원인, 탐지, 해결법까지!
