Machine Learning

머신러닝 워크플로우 개요

머신러닝 프로젝트는 일반적으로 다음과 같은 단계를 거친다:

  1. 데이터 처리 및 탐색
  2. 데이터 시각화
  3. 데이터 전처리
  4. 데이터셋 분리
  5. 모델 학습 및 평가

각 단계를 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}")

일반적인 머신러닝 워크플로우 체크리스트

  1. 데이터 로드 및 탐색

    • 데이터 구조 파악
    • 결측치 확인
    • 기본 통계 확인
  2. 데이터 시각화

    • 타겟 변수 분포 확인
    • 특성 간 관계 분석
    • 이상치 탐지
  3. 데이터 전처리

    • 범주형 변수 인코딩
    • 결측치 처리
    • 특성 엔지니어링
    • 특성 선택
  4. 데이터셋 분리

    • 훈련/테스트 데이터 분리
    • 검증 데이터 분리 (필요시)
  5. 모델 학습 및 평가

    • 모델 선택 및 학습
    • 예측 수행
    • 성능 평가
    • 하이퍼파라미터 튜닝 (필요시)

이 과정을 반복하며 모델의 성능을 개선해 나간다.