AI/ML

[ML] 지도학습 - 분류모델 (나이브 베이즈)

죵욜이 2024. 12. 29. 01:02

나이브 베이즈 (Naive Bayes) 란?

  • 확률에 기반한 머신러닝 알고리즘
  • 베이즈 정리를 기반으로 하는 통계적 분류 기법
  • 나이브 라는 이름이 붙은 이유는 각 특징(feature) 이 독립적이라고 가정하기 때문
  • 주로 텍스트 분류 문제에서 널리 사용
  • 데이터가 특정 클래스에 속할 확률을 계산하는 분류 모델임

나이브 베이즈의 주요 개념

1. 베이즈 정리:

나이브 베이즈는 베이즈 정리를 기반으로 동작합니다. 베이즈 정리는 다음과 같은 수식으로 표현됩니다:

 

  • P(X|C) : 클래스 C 가 주어졌을 때, 데이터 X 가 나타날 확률 (우도, Likelihood)
  • P(C) : 클래스 C 가 나타날 확률 (사전 확률, Prior Probability)
  • P(X) : 데이터 X 가 나타날 확률 (증거, Evidence)

 

2. 조건부 독립 가정:

  • 나이브 베이즈는 "조건부 독립 가정(Conditional Independence Assumption)"을 전제로 합니다.
  • 이는 각 특성(feature)이 클래스 에 대해 서로 독립적이라고 가정합니다.
    • 예를 들어, 이메일에서 단어 "offer"와 "free"가 등장한다고 해서 두 단어가 서로 영향을 미치지 않는다고 간주합니다.
  • 이 가정 덕분에 계산이 간단해지지만, 현실에서는 항상 성립하지 않을 수 있습니다.

 

3. 확률 계산:

조건부 독립 가정에 따르면, 가 여러 특성으로 구성된 경우:

 

4. 클래스 예측:

나이브 베이즈는 를 최대화하는 클래스를 선택합니다:


나이브 베이즈의 종류

  1. 가우시안 나이브 베이즈(Gaussian Naive Bayes):
    • 연속형 데이터에서 사용됩니다.
    • 특성이 정규분포(가우시안 분포)를 따른다고 가정합니다.

 

 

2. 멀티노미얼 나이브 베이즈(Multinomial Naive Bayes):

  • 텍스트 데이터와 같이 이산형 특성(예: 단어 빈도수, 단어 등장 횟수)에서 사용됩니다.

3. 베르누이 나이브 베이즈(Bernoulli Naive Bayes):

  • 이진 데이터(예: 단어의 존재 여부)에서 사용됩니다.


나이브 베이즈의 장점

  1. 간단하고 빠름:
    • 계산량이 적고, 대규모 데이터셋에서도 빠르게 동작합니다.
  2. 적은 데이터로도 효과적:
    • 작은 데이터셋에서도 높은 성능을 보일 수 있습니다.
  3. 스팸 필터링과 텍스트 분류에서 유용:
    • 텍스트 데이터를 다룰 때 특히 좋은 성능을 보입니다.
  4. 다중 클래스 분류 지원:
    • 여러 클래스를 동시에 처리할 수 있습니다.

나이브 베이즈의 단점

1. 조건부 독립 가정의 한계

  • 현실 데이터에서 특성들이 종종 상관관계를 가지므로, 조건부 독립 가정이 성립하지 않을 수 있다
  • 이로인해 성능이 떨어질 수 있습니다.

2. 데이터 희소성 문제 

  • 특정 클래스에서 어떤 값이 한 번도 등장하지 않으면, 해당 확률이 0 이되어 전체 확률 계산에 영향을 줍니다.
    이를 해결하기 위해 라플라스 스무딩(Laplace Smoothing) 을 사용합니다.

3. 연속형 데이터 처리 제한

  • 가우시안 나이브 베이즈 외의 변형에서는 연속형 데이터를 처리하기 어렵습니다.

나이브 베이즈의 활용 사례

  1. 텍스트 분류:
    • 스팸 이메일 필터링, 감정 분석, 주제 분류 등.
  2. 의료 진단:
    • 특정 증상을 기반으로 질병을 예측.
  3. 추천 시스템:
    • 사용자 행동을 기반으로 콘텐츠 추천.
  4. 이상 탐지:
    • 금융 거래에서 사기 탐지.

예시

- 데이터 로드 및 전처리

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 데이터 로드
data = load_breast_cancer()
X = data.data
y = data.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터 스케일링
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

 

- 모델 학습

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 모델 생성 및 학습
model = GaussianNB()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")