나이브 베이즈 알고리즘 이해 및 활용
나이브 베이즈(Naive Bayes) 알고리즘은 머신러닝에서 분류(Classification) 문제를 해결하는 데 사용되는 간단하면서도 효과적인 확률 기반 알고리즘이다. 이 게시물에서는 나이브 베이즈 알고리즘의 기본 원리, 다양한 유형, 실제 사용 예시, 그리고 장단점에 대해 자세히 알아본다.
📌 나이브 베이즈 알고리즘 소개
나이브 베이즈 알고리즘은 베이즈 정리(Bayes' Theorem)를 기반으로 한다. 베이즈 정리는 주어진 데이터로부터 어떤 사건의 확률을 추론하는 방법을 제공한다. 나이브 베이즈는 '나이브(naive)'라는 이름에서 알 수 있듯이, 모든 특성(feature)들이 서로 독립적이라는 가정을 한다. 이 독립성 가정은 현실에서는 잘 맞지 않을 수 있지만, 계산의 단순성을 제공하며, 많은 경우에 좋은 성능을 보인다.
🧮 베이즈 정리 (Bayes' Theorem)
베이즈 정리는 다음과 같은 식으로 표현된다.
P(A|B) = (P(B|A) * P(A)) / P(B)
여기서:
- P(A|B)는 사후 확률(posterior probability)로, 사건 B가 주어졌을 때 사건 A가 발생할 확률이다.
- P(B|A)는 우도(likelihood)로, 사건 A가 주어졌을 때 사건 B가 발생할 확률이다.
- P(A)는 사전 확률(prior probability)로, 사건 A가 발생할 확률이다.
- P(B)는 주변 우도(marginal likelihood)로, 사건 B가 발생할 확률이다.
나이브 베이즈 분류기는 각 특성이 주어졌을 때 클래스(class)에 속할 확률을 계산하고, 가장 높은 확률을 가진 클래스로 데이터를 분류한다.
📊 나이브 베이즈 유형
나이브 베이즈 알고리즘은 데이터의 특성에 따라 여러 유형으로 나뉜다.
- 가우시안 나이브 베이즈 (Gaussian Naive Bayes):
- 연속적인 숫자 특성을 다룰 때 사용된다. 각 클래스 내에서 특성들이 가우시안(정규) 분포를 따른다고 가정한다.
- 예시: 키, 몸무게와 같은 연속적인 값을 사용하여 성별을 예측하는 경우.
- 다항 분포 나이브 베이즈 (Multinomial Naive Bayes):
- 텍스트 분류와 같이 이산적인 특성의 빈도를 다룰 때 사용된다. 각 클래스 내에서 특성들이 다항 분포를 따른다고 가정한다.
- 예시: 문서 내 단어 빈도를 사용하여 문서의 주제를 분류하는 경우.
- 베르누이 나이브 베이즈 (Bernoulli Naive Bayes):
- 특성이 이진 값(0 또는 1)을 가질 때 사용된다. 각 클래스 내에서 특성들이 베르누이 분포를 따른다고 가정한다.
- 예시: 특정 단어가 문서에 있는지 없는지를 사용하여 스팸 메일을 분류하는 경우.
💡 예제: 스팸 메일 분류
나이브 베이즈 알고리즘이 어떻게 텍스트 분류에 사용될 수 있는지 스팸 메일 분류 예제를 통해 살펴보자.
- 데이터 준비:
- 스팸 메일과 일반 메일(ham)로 분류된 메일 데이터셋을 준비한다.
- 각 메일은 단어들의 집합으로 표현된다.
- 특성 추출:
- 각 메일에서 단어의 빈도를 계산한다. 예를 들어, '할인', '광고', '무료'와 같은 단어가 스팸 메일에서 자주 나타날 수 있다.
- 모델 훈련:
- 다항 분포 나이브 베이즈 분류기를 사용하여 훈련 데이터를 학습시킨다.
- 각 클래스(스팸, 일반)에 대해 각 단어의 조건부 확률을 계산한다.
- 분류:
- 새로운 메일이 주어지면, 각 단어의 빈도를 계산하고, 각 클래스에 속할 확률을 계산한다.
- 가장 높은 확률을 가진 클래스로 메일을 분류한다.
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import accuracy_score
# Sample data
documents = [
"Free offer today only",
"Get discount now",
"Important meeting schedule",
"Project deadline approaching",
"Claim your prize free"
]
labels = ['spam', 'spam', 'ham', 'ham', 'spam']
# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(documents, labels, test_size=0.25, random_state=42)
# Convert text to numerical data using CountVectorizer
vectorizer = CountVectorizer()
X_train_counts = vectorizer.fit_transform(X_train)
X_test_counts = vectorizer.transform(X_test)
# Train Multinomial Naive Bayes classifier
classifier = MultinomialNB()
classifier.fit(X_train_counts, y_train)
# Predict on the test set
predictions = classifier.predict(X_test_counts)
# Evaluate accuracy
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy: {accuracy}")
# Example of predicting a new document
new_document = ["New meeting schedule"]
new_counts = vectorizer.transform(new_document)
new_prediction = classifier.predict(new_counts)
print(f"Prediction for new document: {new_prediction}")
💪 장점 및 단점
장점:
- 구현이 간단하고 빠르다.
- 높은 차원의 데이터에서도 잘 작동한다.
- 적은 양의 훈련 데이터로도 좋은 성능을 낼 수 있다.
- 다양한 유형의 데이터에 적용 가능하다.
단점:
- 특성 간의 독립성 가정이 현실과 맞지 않을 수 있다.
- 훈련 데이터에 없는 단어가 나타나면 확률이 0이 되는 문제가 발생할 수 있다 (라플라스 스무딩으로 해결 가능).
- 연속적인 숫자 데이터에 대해서는 가우시안 나이브 베이즈를 사용해야 하며, 데이터가 정규 분포를 따르지 않으면 성능이 저하될 수 있다.
📚 추가 팁
- 데이터 전처리: 텍스트 데이터의 경우, 불용어 제거, 어간 추출, 토큰화 등의 전처리 과정을 거치는 것이 좋다.
- 라플라스 스무딩: 훈련 데이터에 없는 단어에 대한 확률이 0이 되는 것을 방지하기 위해 라플라스 스무딩(Laplace smoothing) 또는 가산 스무딩(additive smoothing)을 사용한다.
- 특성 선택: 중요한 특성을 선택하여 모델의 성능을 향상시킬 수 있다.
정리
나이브 베이즈 알고리즘은 간단하면서도 강력한 분류 알고리즘이다. 텍스트 분류, 스팸 메일 필터링, 감성 분석 등 다양한 분야에서 널리 사용되고 있다.
주요 용어
- 베이즈 정리 (Bayes' Theorem)
- 나이브 베이즈 (Naive Bayes)
- 사전 확률 (Prior Probability)
- 사후 확률 (Posterior Probability)
- 우도 (Likelihood)
- 라플라스 스무딩 (Laplace Smoothing)