RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (72) N
    • Study Note (37) N
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (22) N
      • 머신러닝 (4) N
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/머신러닝

[ML 기초] 통계가 머신러닝이 되는 순간: 나이브 베이즈와 ML 프로세스

2025. 12. 19. 15:49

머신러닝이라고 하면 거창해 보이지만, 사실 그 시작은 우리가 배웠던 '베이즈 정리'에서 출발합니다.

오늘은 스팸 메일 필터링의 원리가 되는 나이브 베이즈 분류(Naive Bayes Classification)와, 앞으로 계속 보게 될 머신러닝의 전체적인 학습 프로세스를 정리해 봅니다.

 

1. 베이즈 정리: 사후 확률을 계산하는 마법

우리가 머신러닝을 통해 알고 싶은 것은 "결과(데이터)를 보고 원인(클래스)을 예측하는 것"입니다. 이를 통계 용어로 사후 확률(Posterior Probability)이라고 합니다.

$$P(\text{원인}|\text{결과}) = \frac{P(\text{결과}|\text{원인}) \times P(\text{원인})}{P(\text{결과})}$$
  • 사전 확률 ($P(\text{원인})$): 데이터를 보기 전, 원인이 발생할 확률 (예: 전체 메일 중 스팸일 확률)
  • 가능도/우도 ($P(\text{결과}|\text{원인})$): 원인이 주어졌을 때, 해당 데이터가 나타날 확률 (예: 스팸 메일 안에 '쿠폰'이라는 단어가 있을 확률)
  • 사후 확률 ($P(\text{원인}|\text{결과})$): 데이터를 확인한 후, 그 원인이 진짜일 확률 (우리가 구하려는 예측값)

핵심: 우리는 전 세계의 모든 데이터를 알 수 없으므로, 샘플(훈련) 데이터를 통해 위 확률들을 추정해야 합니다

 

2. 왜 '나이브(Naive)'인가?: 차원의 저주 해결하기

현실 세계의 문제는 복잡합니다. 스팸 메일을 판단할 때 '쿠폰'이라는 단어 하나만 보지 않죠. '주식', '광고', '대출' 등 수많은 단어(조건)를 동시에 고려해야 합니다.

 

$$P(\text{Spam} | \text{Coupon} \cap \text{Stock} \cap \dots)$$

 

하지만 조건이 늘어날수록 계산량은 폭증합니다. 이를 '차원의 저주(Curse of Dimensionality)'라고 합니다.

이를 해결하기 위해 등장한 것이 나이브 베이즈 분류입니다

 

나이브(Naive)한 가정

"모든 특징(단어)들은 서로 독립적이다." 라고 단순하게(Naive하게) 가정해버리는 것입니다.

이렇게 하면 복잡한 결합 확률을 단순한 곱셈으로 쪼개서 계산할 수 있습니다.

  • 복잡: $P(\text{Coupon} \cap \text{Stock} | \text{Spam})$
  • 단순화: $P(\text{Coupon}|\text{Spam}) \times P(\text{Stock}|\text{Spam})$

비록 단순한 가정이지만, 스팸 필터링이나 텍스트 분류에서 놀라울 정도로 강력한 성능을 발휘합니다.

 

3. 머신러닝 프로세스의 큰 그림 (Big Picture)

이제 베이즈 정리를 이용해 실제 모델을 만드는 5단계 프로세스를 살펴봅시다. 이 흐름은 앞으로 배울 모든 머신러닝에 동일하게 적용됩니다.

  1. 데이터 수집: 전체 데이터의 일부인 샘플 데이터를 모읍니다.
  2. 데이터 분리 (Splitting):
    • 훈련 셋 (Training Set): 정답을 알려주고 모델을 가르치는 용도.
    • 테스트 셋 (Test Set): 모델이 잘 배웠는지 시험 보는 용도.
  3. 특징 추출 (Feature Extraction): 데이터를 모델이 이해할 수 있는 형태(숫자, 벡터)로 가공합니다.
  4. 학습 (Training): 훈련 데이터를 통해 확률(사전확률, 우도)을 계산합니다. 이때 데이터의 분포를 정규분포(Gaussian)로 가정하여 추정하기도 합니다.
  5. 평가 (Evaluation): 테스트 셋을 넣어 예측 결과와 실제 정답을 비교해 성능을 측정합니다.

4. [실습] Python으로 구현하는 나이브 베이즈

Gaussian Naive Bayes를 scikit-learn 라이브러리로 구현해 보겠습니다.

의료 데이터 적용 예시: 감기 증상 예측

  • X (특징): 열(Fever), 기침(Cough) 여부
  • Y (타겟): 독감(Flu) 인지 아닌지 (0: 정상, 1: 독감)
import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 1. 데이터 생성 (가상의 의료 데이터)
# 특징: [체온(°C), 기침빈도(회/분)]
X = np.array([
    [36.5, 0], [36.0, 1], [35.9, 0], [36.7, 1], # 정상 그룹
    [38.5, 5], [39.0, 4], [38.2, 6], [39.5, 5]  # 독감 그룹
])
y = np.array([0, 0, 0, 0, 1, 1, 1, 1]) # 0: 정상, 1: 독감

# 2. 데이터 분리 (Train / Test)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 모델 생성 및 학습 (Gaussian Naive Bayes)
# 데이터가 연속적인 값(체온 등)을 가질 때 정규분포를 가정하는 GaussianNB를 사용합니다.
model = GaussianNB()
model.fit(X_train, y_train)

# 4. 예측 및 평가
y_pred = model.predict(X_test)

print("=== 모델 평가 결과 ===")
print(f"정확도: {accuracy_score(y_test, y_pred):.2f}")
print("\n=== 새로운 환자 예측 ===")
new_patient = [[38.0, 4]] # 체온 38도, 기침 4회
prediction = model.predict(new_patient)
print(f"환자 상태 예측: {'독감(Flu)' if prediction[0] == 1 else '정상(Normal)'}")

# 확률 확인 (베이즈 정리에 의해 계산된 사후 확률)
proba = model.predict_proba(new_patient)
print(f"독감일 확률: {proba[0][1]*100:.2f}%")

 

5. 분석가의 Insight: 의료 데이터에서의 활용

강의 자료에서 본 스팸 메일 필터링 예제는 의료 데이터 분석과 완벽하게 대칭됩니다.

  • 스팸 메일 분류:
    • 단어(Coupon, Stock) $\rightarrow$ 스팸 여부 판단
  • 질병 진단 분류:
    • 증상(Fever, Cough) $\rightarrow$ 질병 유무 판단

특히 나이브 베이즈는 데이터가 적을 때도 비교적 잘 작동하고, 결과가 확률(Probability)로 나오기 때문에 의료진에게 "이 환자는 85%의 확률로 독감이 의심됩니다"라고 설명하기에 아주 적합한 베이스라인 모델입니다.

통계적 이론이 탄탄할수록 머신러닝 모델의 결과를 더 깊이 있게 해석할 수 있습니다.

 

 

'Study Note > 머신러닝' 카테고리의 다른 글

"모든 변수가 다 중요할까?" 피처 중요도(Feature Importance)로 모델 다이어트하기  (0) 2025.12.20
내 모델 믿어도 될까? 교차 검증(Cross Validation) 완벽 가이드  (0) 2025.12.20
머신러닝의 꽃, 앙상블과 부스팅 (XGBoost, LightGBM) 완전 정복  (1) 2025.12.19
    'Study Note/머신러닝' 카테고리의 다른 글
    • "모든 변수가 다 중요할까?" 피처 중요도(Feature Importance)로 모델 다이어트하기
    • 내 모델 믿어도 될까? 교차 검증(Cross Validation) 완벽 가이드
    • 머신러닝의 꽃, 앙상블과 부스팅 (XGBoost, LightGBM) 완전 정복
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바