머신러닝 워크플로우 개요
머신러닝 프로젝트는 일반적으로 다음과 같은 단계를 거친다:
- 데이터 처리 및 탐색
- 데이터 시각화
- 데이터 전처리
- 데이터셋 분리
- 모델 학습 및 평가
각 단계를 Titanic 데이터셋 예시를 통해 설명한다.
1. 데이터 처리 및 탐색
데이터 로드
먼저 데이터를 불러와서 기본적인 정보를 확인한다.
import pandas as pd
import numpy as np
# 데이터 로드
data = pd.read_excel("titanic.xls")
# 데이터 기본 정보 확인
data.info()
data.head()
data.describe()
주요 확인 사항
- 데이터 크기: 행과 열의 개수
- 데이터 타입: 각 컬럼의 타입 (숫자형, 범주형 등)
- 결측치:
isnull()또는info()로 확인 - 기본 통계:
describe()로 수치형 데이터의 분포 확인
2. 데이터 시각화
데이터를 시각화하여 패턴과 관계를 파악한다.
타겟 변수 분포 확인
import matplotlib.pyplot as plt
import seaborn as sns
# 타겟 변수의 분포 확인
f, ax = plt.subplots(1, 2, figsize=(12, 6))
data['survived'].value_counts().plot.pie(explode=[0, 0.1], autopct='%1.2f%%', ax=ax[0])
sns.countplot(x="survived", data=data, ax=ax[1])
plt.show()
특성별 분포 및 관계 분석
# 연속형 변수의 분포
data['age'].hist(bins=20, figsize=(18,8))
# 범주형 변수와 타겟의 관계
sns.barplot(x="pclass", y="survived", data=data)
sns.barplot(x="sex", y="survived", data=data)
# 다중 변수 관계 분석
grid = sns.FacetGrid(data, row="pclass", col="sex", height=4, aspect=2)
grid.map(plt.hist, "age", bins=10)
시각화의 목적
- 데이터 분포 이해: 타겟 변수의 클래스 불균형 확인
- 특성 중요도 파악: 어떤 특성이 타겟과 강한 상관관계를 가지는지 확인
- 이상치 탐지: 비정상적인 값이나 패턴 발견
- 전처리 전략 수립: 어떤 전처리가 필요한지 결정
3. 데이터 전처리
원시 데이터를 머신러닝 모델이 학습할 수 있는 형태로 변환한다.
3.1 범주형 변수 인코딩
머신러닝 모델은 숫자형 데이터만 처리할 수 있으므로, 범주형 변수를 숫자로 변환해야 한다.
from sklearn.preprocessing import LabelEncoder
# Label Encoding (순서가 없는 범주형 변수)
le = LabelEncoder()
le.fit(data['sex'])
data['gender'] = le.transform(data['sex'])
# One-Hot Encoding (더 많은 범주를 가진 경우)
data = pd.get_dummies(data, columns=['embarked'], prefix='embarked')
3.2 결측치 처리
결측치가 있으면 모델 학습에 문제가 발생할 수 있다.
# 방법 1: 결측치가 있는 행 제거
data = data[data['age'].notnull()]
data = data[data['fare'].notnull()]
# 방법 2: 결측치를 평균값으로 채우기
data['age'].fillna(data['age'].mean(), inplace=True)
# 방법 3: 결측치를 중앙값으로 채우기
data['age'].fillna(data['age'].median(), inplace=True)
3.3 특성 엔지니어링
원본 데이터에서 새로운 의미 있는 특성을 생성할 수 있다.
# 연속형 변수를 범주형으로 변환
data['age_cat'] = pd.cut(data['age'],
bins=[0, 7, 15, 30, 60, 100],
labels=["baby", "teen", "young", "adult", "old"])
# 문자열에서 정보 추출
conversion_rare = lambda x: x.split(",")[1].split(".")[0].strip()
data['title'] = data['name'].map(conversion_rare)
# 특성 정리 및 통합
data['title'] = data['title'].replace("Mlle", "Miss")
data['title'] = data['title'].replace("Ms", "Miss")
3.4 특성 선택
모델 학습에 사용할 특성을 선택한다.
# 학습에 사용할 특성 선택
X = data[['pclass', 'age', 'sibsp', 'parch', 'fare', 'gender']]
y = data['survived'] # 타겟 변수
4. 데이터셋 분리
전체 데이터를 훈련용과 테스트용으로 분리한다.
Train-Test Split
from sklearn.model_selection import train_test_split
# 데이터를 훈련용(80%)과 테스트용(20%)으로 분리
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2, # 테스트 데이터 비율
random_state=13, # 재현성을 위한 시드값
stratify=y # 타겟 변수의 분포를 유지 (선택사항)
)
분리하는 이유
- 훈련 데이터: 모델을 학습시키는 데 사용
- 테스트 데이터: 학습된 모델의 성능을 평가하는 데 사용
- 과적합 방지: 모델이 훈련 데이터에만 과도하게 맞춰지는 것을 방지
주의사항
- 테스트 데이터는 모델 학습 과정에서 절대 사용하지 않아야 한다
random_state를 설정하여 결과의 재현성을 보장한다- 클래스 불균형이 있는 경우
stratify옵션을 사용한다
5. 모델 학습 및 평가
모델 학습
from sklearn.tree import DecisionTreeClassifier
# 모델 생성 및 학습
model = DecisionTreeClassifier(max_depth=4, random_state=13)
model.fit(X_train, y_train)
예측 및 정확도 평가
from sklearn.metrics import accuracy_score
# 테스트 데이터로 예측
y_pred = model.predict(X_test)
# 정확도 계산
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
평가 지표
정확도(Accuracy) 외에도 다양한 평가 지표를 사용할 수 있다:
from sklearn.metrics import classification_report, confusion_matrix
# 분류 리포트 (정밀도, 재현율, F1 점수)
print(classification_report(y_test, y_pred))
# 혼동 행렬
print(confusion_matrix(y_test, y_pred))
새로운 데이터 예측
학습된 모델을 사용하여 새로운 데이터에 대한 예측을 수행할 수 있다.
# 새로운 데이터 예측
new_data = pd.DataFrame([[3, 18, 0, 0, 5, 1]],
columns=['pclass', 'age', 'sibsp', 'parch', 'fare', 'gender'])
prediction = model.predict(new_data)
probability = model.predict_proba(new_data)
print(f"예측 결과: {prediction[0]}")
print(f"생존 확률: {probability[0][1]:.4f}")
일반적인 머신러닝 워크플로우 체크리스트
-
✅ 데이터 로드 및 탐색
- 데이터 구조 파악
- 결측치 확인
- 기본 통계 확인
-
✅ 데이터 시각화
- 타겟 변수 분포 확인
- 특성 간 관계 분석
- 이상치 탐지
-
✅ 데이터 전처리
- 범주형 변수 인코딩
- 결측치 처리
- 특성 엔지니어링
- 특성 선택
-
✅ 데이터셋 분리
- 훈련/테스트 데이터 분리
- 검증 데이터 분리 (필요시)
-
✅ 모델 학습 및 평가
- 모델 선택 및 학습
- 예측 수행
- 성능 평가
- 하이퍼파라미터 튜닝 (필요시)
이 과정을 반복하며 모델의 성능을 개선해 나간다.