이번에는 스팸 메일이나 문서 분류 작업에 많이 활용되는 나이브 베이즈 (Naïve Bayes) 모형에 대해 포스팅 하고자 한다.
베이즈 정리 (Bayes' Theorem)는 과거에 이미 일어난 어떤 사건의 사전확률과 앞으로 일어날 사후확률 사이의 관계를 확률적으로 나타내는 이론으로서 사건 X가 발생했을 때 사건 Y의 확률은 베이즈 정리에 따라 다음과 같이 표현된다.
여기에서 P(Y)는 사건 X가 영향을 미치지 않을 경우 사건 Y가 발생하는 사전확률을 의미하고, LY는 사건 Y를 전제로 한 사건 X의 우도(가능성)를 의미한다. P(X)는 X의 사전확률로 증거 (Evidence)라고 하며, 모든 확률의 합을 1로 만들기 위한 정규화 상수 (Normalizing Constant)의 역할을 한다.
예를 들어, 전체 메일에서 20%가 스팸 메일이고, 스팸 메일의 15%에 ‘당첨’이라는 단어가 있으며, ‘당첨’을 포함한 메일은 전체 메일의 4%라고 가정해보자. 어떤 메일에서 ‘당첨’이라는 단어가 발견됐을 때 그 메일이 스팸 메일일 사후확률은 베이즈 정리에 의하여 다음과 같이 구할 수 있다.
메일에서 당첨이라는 단어가 발견됐을 때 그 메일이 스팸 메일일 확률은 75%가 된다.
나이브 베이즈 (Naive Bayes) 모형은 베이즈 정리에 기반하여 범주를 예측하는 지도학습모형이다. 모형의 이름에 나이브 (Naïve, 순진 또는 단순)라는 표현이 들어간 이유는 데이터의 특성(독립변수)들 사이에는 어떠한 연관성 없이 상호 독립적이라는 매우 단순한 가정을 전제로 하는 분류 모형이기 때문이다. 이항 분류 예측할 때 독립변수로 사용될 수 있는 특성들 간에는 서로 연관성이 존재할 수 있음에도 불구하고, 나이브 베이즈 모형에서는 특성들 사이에 연관성이 없어서 각각의 특성들이 이탈고객 확률에 독립적으로 기여한다고 간주하게 된다. 나이브 베이즈 분류 모형은 목표 데이터가 각 클래스에 속할 확률을 모두 계산한 다음 가장 높은 확률을 갖는 클래스로 목표 데이터를 분류한다. 따라서, 클래스 전반에 걸친 확률 분포를 추정할 수 있기 때문에 해당 분류기가 얼마나 정확하게 예측하는지에 대한 확실성을 판단할 수 있다.
나이브 베이즈 모형이 단순한 가정을 전제로 함에도 불구하고, 분류 예측에서 자주 사용하는 이유는 독립변수로 사용되는 다수 특성들 간의 연관성을 단순화 시켜 베이즈 정리에 의한 조건부 확률 계산을 매우 단순화 할 수 있기 때문이다. 만약, 독립변수로 사용되는 특성이 하나가 아니라, 여러 개라면 베이즈 정리에서 보였던 PX가 아니라, PX1, , Xn을 계산해야 하는데, 이때 독립변수들 간의 상호작용까지 고려한 결합확률 계산은 매우 복잡하게 된다. 그러나, 나이브 베이즈에서는 모든 독립변수(Xn)가 서로 독립적이라고 가정하기 때문에 독립변수 X1,,Xn에 대한 k개의 클래스를 갖는 종속변수 Y의 분류 확률은 다음과 같이 단순화될 수 있다.
또한, 나이브 베이즈는 특정 클래스에 속할 확률의 대소 비교를 통해 분류 예측을 수행하므로 분모를 제거함으로써 계산량을 줄일 수 있다.
따라서, 나이브 베이즈 모형에서 주어진 독립변수 X1Xn에 대해 목표 데이터가 특정 클래스 Ck에 속하는 확률을 계산하기 위한 식을 정리하면,
그리고, 계산된 각 클래스에 속할 확률 Ck를 기반으로 최종 결정되는 종속변수 Y는 다음과 같이 표현할 수 있다.
여기에서 argmax(f(x))는 함수 f(x)가 최댓값을 갖는 클래스를 선택하는 기능을 한다.
나이브 베이즈 모형은 주로 스팸 필터, 문서 분류 등과 같이 텍스트 분류 문제에 대중적으로 사용된다. 또한 비교적 간단한 분류 알고리즘을 가지고 있어 쉽게 이해할 수 있으며, 조정해야 하는 인자가 적다는 장점이 있다. 이 때문에 나이브 베이즈는 초기에 기초 분류 작업을 하는 데 사용하기 적합하다.
그러나 나이브 베이즈 모형은 독립변수들 간의 독립성을 전제로 하는 단순한 가정에 의한 분류 예측이기 때문에 실제로 존재하는 변수들 간의 영향력과 관계를 무시할 수 있고, 이는 복잡한 데이터 구조를 갖는 고차원 분류 문제에서는 좋은 성능을 보이지 못하는 단점이 있다. 또한 집단을 분류하는 문제에는 좋은 성능을 낼 수 있으나, 각 집단에 속할 확률값 자체는 편향된 결과일 수 있기 때문에 확률값 자체를 신뢰하거나, 이를 기반으로 가설검정을 하는 등의 연계 분석은 바람직하지 않다. 이러한 이유로 신용평가와 같은 확률값 기반의 의사결정 문제에서는 나이브 베이즈 모형이 자주 사용되지는 않는다.
[4] 유형
나이브 베이즈 모형은 독립변수들의 데이터 형태에 따라 다양한 유형이 존재한다. 독립변수가 연속적인 수치형일 경우에는 가우시안 나이브 베이즈 모형을, 범주형일 경우에는 베르누이나 다항분포 나이브 베이즈 모형을 사용한다.
(1) 가우시안 나이브 베이즈
가우시안 나이브 베이즈 (Gaussian Naive Bayes)는 독립변수가 모두 연속적인 값을 지닐 때 사용하는 모형이다. 독립변수의 값들이 정규분포(가우시안 분포)를 따른다고 가정하고, 각 독립변수와 클래스마다 정규분포의 평균 ui,k, 표준편차 i,k2가 달라지므로 주어진 클래스들의 확률분포는 다음과 같은 정규분포식을 통해 계산할 수 있다.
따라서 가우시안 나이브 베이즈는 연속적인 특성이 있는 데이터를 분류하는 데 적합하다.
(2) 베르누이 나이브 베이즈
베르누이 나이브 베이즈 (Bernoulli Naive Bayes) 모형은 독립변수가 0 또는 1이라는 이진값만을 가지는 베르누이 분포를 가질 때 사용하는 모형이다. 가령, 스팸 메일 분류 문제에서는 사전에 존재하는 모든 단어를 독립변수로 설정하고, 메일에 해당 단어가 나오면 1을, 아니면 0으로 값을 할당하여 분류를 수행하는데 이때 사용하는 모형이 베르누이 나이브 베이즈 모형이다. 베르누이 나이브 베이즈 모형에서 우도 (Likelihood)는 다음과 같이 정의되는데,
스팸 메일 분류 문제라면, PC1은 특정 단어 xi가 스팸 메일 C1에 나타날 확률이 되며 단순하게,
로 계산할 수 있다. 가령, 10개의 스팸 메일에서 ‘당첨’이라는 단어가 1번~7번 스팸 메일에 나오고, 8~10번 스팸 메일에는 나오지 않았다면 PC1=0.7이 된다.
베르누이 나이브 베이즈 모형은 학습 데이터에 나타나지 않았던 단어가 예측하고자 하는 목표 데이터에 나타나게 되면 확률 추정치는 0이 되어 이 추정치가 곱해질 때 다른 확률의 모든 정보를 없애는 문제가 발생할 수 있다. 즉, 어떤 특정 단어가 정상 메일에만 나타나고 스팸 메일에는 나타나지 않았다면 우도함수 정의에 의해 그 단어가 나타난 메일이 스팸일 가능성은 0이 되어 해당 메일은 스팸으로 분류되지 않는 문제가 존재한다. 이런 문제를 해결하기 위해 적절히 값의 보정을 수행하는 스무딩 (Smoothing) 기법을 사용하는데, 스무딩이란 아래와 같이 작은 샘플 보정값 를 분모와 분자에 더하여 추정값 0이 존재하더라도 단순 곱에 의해 전체가 0이 되는 문제를 극복하고자 하는 것이다.
를 통해 스무딩의 정도를 조절할 수 있으며, 특히 가 1인 경우를 라플라스 스무딩 (Laplace Smoothing)이라고 하고, 스무딩 기법 중 가장 자주 사용하는 방법이다.
(3) 다항분포 나이브 베이즈
다항분포 나이브 베이즈 (Multinomial Naive Bayes)는 독립변수가 다항분포의 표본이라고 가정하는 나이브 베이즈 모형이다. 즉, 여러 범주에서 관측한 개수 또는 횟수의 확률을 나타내므로 빈도나 빈도 비율을 나타내는 독립변수에 적합한 나이브 베이즈 모형이다. 다항분포 나이브 베이즈의 우도는 다음과 같이 계산된다.
즉, 다항분포 나이브 베이즈에서 특정 단어 xi가 스팸 메일 C1에 나타날 우도 PC1는,
로 계산한다. 예를 들어 10개의 스팸 메일에 ‘당첨’이라는 단어가 10번, ‘복권’이라는 단어가 7번, ‘행운’이라는 단어가 3번 나왔을 경우, 우도 PC1=0.5가 된다. 이처럼 데이터의 출현 횟수에 따라 값을 달리한 데이터에는 다항분포 나이브 베이즈 모형을 사용하는 것이 적합하다.
한편, 다항분포 나이브 베이즈에서 적용되는 스무딩은 다음과 같다.
아래 실습은 베르누이 나이브 베이즈를 이용하여 스팸 메일을 분류하는 모형을 만들어보겠다.
연습
전처리과정은 생략하겠다.
#1. 모듈 및 함수 불러오기
from sklearn.feature_extraction.text import CountVectorizer
#2. 변수 선택(독립변수/종속변수)
X= data['v2']
Y= data['v1']
#3. 데이터 분할(학습용/평가용 데이터 세트)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
#4. 문서 단어 행렬(DTM) 변환
cv=CountVectorizer(binary=True, stop_words=‘english’, min_df=3)
X_train= cv.fit_transform(X_train)
X_test= cv.transform(X_test)
#5. 변환 결과 출력
print(‘단어별 인덱스 부여 결과\n’, cv.vocabulary_)
print(‘ ‘)
print(‘문서 단어 행렬 변환 결과\n’, X_train.toarray())
모형 학습 및 예측
#1. 모듈 및 함수 불러오기
from sklearn.naive_bayes import BernoulliNB
#2. 모형 학습 및 예측
model = BernoulliNB()
model.fit(X_train, Y_train)
Y_pred = model.predict(X_test)
print(‘평가용 데이터 세트에 대한 예측값\n’, Y_pred)
모형 평가
This post was written based on what I read and studied the book below.
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747
댓글