나이브 베이즈(Naive Bayes)

2022. 1. 24. 21:00AI/ML

이 포스트는 허민석님의 유튜브 머신러닝 내용을 정리한 글입니다. 실습 코드는 도서 나의 첫 머신러닝/딥러닝에서 발췌해왔습니다. 실습 코드와 자료는 링크의 Github에서 볼 수 있습니다

이번 포스트에서는 머신러닝 지도 학습 분류 알고리즘 중 하나인 나이브 베이즈(Naive Bayes) 알고리즘에 대해 알아보겠습니다. 이미 우리는 이전 포스트들에서 다양한 분류 알고리즘에 대해 알아봤습니다. 대표적으로 kNN은 데이터의 특성을 벡터 공간의 축으로 지정해서 데이터 간의 유클리드 거리를 토대로 분류했으며, SVM에서는 데이터를 분류하는 적절한 Decision Boundary를 찾아 데이터를 분류했습니다. 이번에 알아볼 나이브 베이즈 알고리즘은 확률 기반 알고리즘으로, 데이터를 독립적인 사건으로 가정(Naive)하고 독립 사건들을 베이즈 정리에 대입(Bayes)하여 특정 클래스에 속할 확률을 계산하여 분류합니다.  나이브 베이즈 알고리즘은 실제로 스팸 메일 분류, 문서 분류에 많이 사용되며 이외에도 감정 분석, 추천 시스템 등 다양한 분야에 사용됩니다. 그렇다면 이제 베이즈 정리는 무엇인지, 확률은 어떤 방식으로 계산되는지 보겠습니다.

 

아래는 나이브 베이즈를 공부하던 중 찾게된 사진입니다. 이 포스트를 다 보고나면, 셜록 홈즈의 말을 이해할 수 있을 것입니다.

출처: 위니버스 유튜브, <셜록 S2. EP2. 베스커빌의 개>

확률의 허점, 베이즈 정리

 

베이즈 정리를 이해하기 앞서, 책 "확률 게임"에 나오는 다음의 질문에 답해보겠습니다.

자동차 사고로 사망한 사람의 40%는 안전띠를 착용하지 않은 사람이라고 합니다. 그렇다면 반대로 자동차 사고로 사망한 사람의 60%는 안전띠를 착용했다는 의미인데, 안전띠를 착용하는 것이 더 위험하지 않나요?

우리는 당연히 이 말이 틀렸다는 것은 알지만, 그 이유에 대해서는 정확히 설명하지 못합니다. 그렇다면 아래의 표를 보겠습니다. 표는 이전 "머신러닝 모델의 성능을 알아보자" 포스트에 있는 암환자를 진단하는 시스템의 예시입니다.

실제 \ 예측 암환자 일반환자
암환자 5 50
일반환자 250 695

병원에 찾은 한 환자는 의사로부터 이런 말을 들었습니다. "우리 병원의 암환자 예측 시스템은 정확도는 70%입니다. 이 시스템으로 진단했을 때, 현재 암환자로 예측되셨습니다. 자세한 검사를 받아봐야 하겠지만, 당장 큰 걱정은 안 하셔도 됩니다. 실제로 암에 걸렸을 확률은 2%가 안되기 때문입니다." 의사는 어떤 근거로 이런 말을 할 수 있었을까요?

 

위의 두 질문에 대해 당장 답변하는 것은 쉽지 않을 것입니다. 답변에 앞서, 우리는 정보가 없는 상황에서 확률적으로 생각할 때 두 상황의 확률을 동일하게 생각합니다. 예를 들어 위의 예시에서 자동차 운전석에 앉은 사람이 안전벨트를 착용한 확률과 착용하지 않을 확률을 50:50으로 생각합니다. 이는 이유 불충분의 원리라고 불리며, 현실 삶에서도 빈번히 볼 수 있습니다. 또 다른 예로 주사위를 1000번 굴렸을 때, 우리는 1이 나올 횟수에 대한 기댓값을 166번으로 생각할 것입니다. 이는 논리적으로도 주사위를 굴렸을 때 1이 나올 확률이 1/6 임을 추론함과 동시에 수많은 시행을 통해서도 얻을 수 있습니다. 이때 우리가 주사위 1000번을 굴렸을 때 1이 나올 횟수에 대해 계산하기 위해 추론한 1/6의 확률을 경험적 확률(사전 확률)이라고 합니다. 이제 주사위 굴리기를 통계학에서 확률을 바라보는 두 관점인 빈도론(Frequentism)과 베이지안(Baysianism)의 입장에서 보겠습니다. 먼저 빈도론에서는 확률을 "반복 가능한 무작위 실험의 장기적인 빈도"라고 말합니다. 이 말을 해석하면 빈도론의 입장에서 주사위 굴리기에서 1이 나오는 확률은 무한히 많은 주사위 굴리기 경험을 통해 1이 나오는 빈도가 1/6에 수렴하는 객관적인 사건입니다. 따라서 빈도론은 다음과 같이 말할 것입니다. "주사위를 100번 던지면 1은 16번, 주사위를 1000번 던지면 1은 166번 등장합니다." 반면 베이지안의 입장에서 주사위 굴리기는 조금 다른 일입니다. 먼저 주관적으로 사전 확률을 정합니다. 주사위는 6면이 있으니 한 번의 시행에서 6은 1/6의 확률을 사전 확률로 정하겠습니다.. 다음 데이터를 관찰하며 가능도를 계산합니다. 이를 토대로 처음에 설정한 주관적인 확률을 보정하는 작업을 거칩니다. 가능도를 계산하고 확률을 보정하는 작업은 거치지 않았지만, 이러한 과정을 통해 베이지안은 다음과 같이 말할 것입니다. "주사위를 던지면, 1이 나온다고 1/6 확신할 수 있습니다."

 

조금은 이해가 되나요? 베이지안의 확률론에 대해서는 당장 이해가 어려울 수 있습니다. 고등 과정을 거치며 배운 확률은 모두 무한히 많은 실험을 통해 수렴하는 빈도론의 입장에서만 봤습니다. 하지만 무한히 많은 실험이 불가능한, 예를 들어 당장 해본 적 없는 게임에서 승리할 확률은 어떻게 될까요? 이러한 경우에는 게임을 해본 적이 없기 때문에 경험적 실험을 통해 확률을 계산할 수 없을 것입니다. 이때는 해당 게임 및 플레이어의 정보를 토대로 사전 확률을 설정한 다음 관련되는 다양한 데이터들을 토대로 확률을 보정하는, 베이지안 추론이 유용할 것입니다. 사실 우리는 이미 베이즈 정리에 대해 알고 있습니다. 베이즈 정리의 고등 수학 과정에서 배운 조건부 확률(P(A|B))에서 나왔으며 따라서 그 증명 또한 어렵지 않습니다. 이제야 위의 "안전띠를 매는 것이 더 위험한 것인가?" 질문에 대한 답을 해보겠습니다. 우리는 아무런 정보가 없는 상황에서 이유 불충분의 원리에 따라 운전 시 안전띠를 착용한 사람과 착용하지 않은 사람의 비율을 50:50으로 설정했습니다. 이후 데이터를 보아 사실 운전자의 95%는 안전띠를 착용했으며, 5%만이 안전띠를 착용하지 않았음을 알았습니다. 따라서 안전띠를 착용한 사람 중 사망한 비율과 안전띠를 착용하지 않은 사람 중 사망한 비율을 다시 계산해보니 전혀 다른 결과를 얻을 수 있었습니다. 이 과정이 바로 베이지안 추론, 베이즈 정리입니다. 확률을 구하면서 안전띠를 착용하지 않은 운전자 중 사망한 비율은 조건부 확률로, 다음의 식으로 표현할 수 있습니다. P(사망한 운전자|안전띠를 착용하지 않은 운전자) 

이제 암환자 예측 시스템을 보겠습니다. 표를 보면서 짐작했듯 70%의 정확도(TP/전체)는 사실 일반 환자를 일반 환자로 정확히 예측했기 때문에 높아진 수치입니다. 이는 암환자와 일반 환자의 비율이 50:50으로 두는 이유 불충분의 원리와는 달리, 실제로는 일반 환자의 비율이 암환자에 비해 극명히 높기 때문에, 시스템이 환자를 암 환자로 예측했더라도 실제 암환자일 비율은 정밀도(TP/(TP+FP))를 계산해보면 2% 채 되지 않습니다.

이제  확률의 허점이라는 말에 대해 어느 정도 이해할 수 있을 것입니다. 아래는 베이즈 공식과 그 증명 과정입니다.

P(A | B) = P(B | A) P(A) / P(B)

 

Bayes theorem과 증명 과정

이미 고등 수학 과정에서 조건부 확률의 공식을 배웠으므로, 귀납적 추리로도 베이즈 공식이 성립함은 익히 알 수 있을 것입니다. 오른쪽의 해석이 중요한데, P(A|B)를 단순히 "B 사건이 일어났을 때 A 사건이 일어날 확률"로 해석하기보다 베이지안의 시점에서 "사전 확률인 P(A), 즉 사건 A가 일어날 확률에 P(B|A) 사건 A가 일어났을 때의 사건 B의 확률을 곱한 다음 P(B), 사건 B가 일어날 확률로 조정해주면 사후 확률(사건 B가 발생한 이후 갱신된 사건 A의 확률)인 P(A|B)를 얻는다"라고 해석하는 것이 더 이해에 도움 될 것입니다. 사전 확률과 사후 확률에 대해 이해한다면 이제부터 확률을 보는 시점은 이전과 조금 달라질 것입니다.

 

이제 우리는 경험적 확률(사전 확률)서 시작해 확률을 바라보는 두 관점인 빈도론과 베이지안에 대해 알아봤으며 추가로 베이즈 정리의 공식을 증명해봤습니다. 하지만 이번에 배우는 알고리즘은 단순히 베이즈 알고리즘이 아닌 나이브 베이즈 알고리즘인데, 그렇다면 나이즈는 어떤 말일까요? 교재의 예시를 빌려와, 치킨 집에서 사건 A를 시간대, B를 맥주 주문으로 두고 아래의 표를 보겠습니다.

시간 맥주 주문
오전 X
오전 X
점심 O
점심 X
점심 X
저녁 O
저녁 O
저녁 O
저녁 X
저녁 X

이제 손님이 왔을 때, 저녁에 온 손님이 맥주를 주문할 확률을 구해보겠습니다. 베이즈 공식에 따르면 P(주문|저녁) = P(저녁|주문) * P(주문) / P(저녁)으로 (3/4 * 4/10) / (5/10), 0.6의 확률을 구할 수 있습니다. 이처럼 데이터 레이블이 두 개인 경우에는 사실 베이즈 공식을 사용하지 않더라도 굉장히 쉽게 확률을 구할 수 있습니다. 이번에는 데이터를 조금 더 추가해보겠습니다. 손님의 성별을 추가한 아래의 표에서 저녁에 온 남성 손님이 맥주를 주문할 확률을 구해보겠습니다. 저녁과 남성, 두 레이블이 동시에 발생하므로 결합확률의 특징으로 이해해야 합니다. 결합 확률은 위의 증명에서도 보였듯이, 두 가지 이상의 사건이 동시에 발생하는 확률로 사건 A와 사건 B가 있을 때 두 사건 A, B가 동시에 발생하는 확률 P(A, B)는 P(A|B) P(B), P(A∩B)로 계산합니다.

시간 성별 맥주 주문
오전 X
오전 X
점심 O
점심 X
점심 X
저녁 O
저녁 O
저녁 O
저녁 X
저녁 X

P(주문|저녁, 남성) = P(저녁, 남성|주문) * P(주문) / P(저녁, 남성) = (3/4 * 4/10) / (4/10) = 3/4, 0.75의 확률을 구할 수 있습니다. 데이터 레이블이 셋 이상 있으니 슬슬 계산량이 많아집니다. 현실의 문제에서는 이 보다 훨씬 많은 데이터 레이블로 확률을 구해야 하기 때문에, 나이브 베이즈 알고리즘에서는 모든 사건을 독립적인 사건으로 간주합니다. 모든 사건을 독립적으로 보게 되면, 결합 확률의 공식에서 P(A, B)를 더 이상 P(A|B) P(B)로 구할 필요 없이 P(A) P(B)로 구할 수 있습니다. 다시 돌아와 P(주문|저녁, 남성)을 나이브 베이즈 알고리즘에서 구하면 P(주문|저녁, 남성) = (P(저녁|주문) * P(남성|주문) * P(주문)) / (P(저녁) * P(성인))으로 구할 수 있습니다. 조금 더 간단히, P(저녁) * P(성인)은 정규화 상수로, 전체 확률을 조정해주는 확률값입니다. 나이브 베이즈 알고리즘에서는 공통분모인 정규화 상수를 제거해 계산량을 더 줄입니다. 따라서 나이브 베이즈 알고리즘으로 구한 저녁에 온 남성 손님이 맥주를 주문할 확률은 0.75가 아닌 3/4 * 10/4, 0.3이 됩니다. 마찬가지 방법으로 저녁에 온 남성 손님이 맥주를 주문하지 않을 확률을 구하면 0.066이 나오며, 따라서 저녁에 남성 손님이 올 경우 맥주를 주문할 것으로 분류할 수 있습니다. 이제 나이브 베이즈 알고리즘에서 특징이 여러 개인 경우의 공식은 다음과 같이 표현할 수 있겠습니다.

특징이 여러 개인 경우의 나이브 베이즈 공식

특징이 여러 개인 경우에도 나이브 베이즈 공식은 단순히 하나의 식으로 표현할 수 있습니다. 위의 치킨집 예시를 다시 빌려와 우리는 계산량을 줄이고자 공통분모인 정규화 상수를 제거한 채 계산했습니다. 결과적으로 저녁에 오는 남성 손님은 맥주를 주문할 확률은 0.3, 주문하지 않은 확률은 0.066으로, 저녁에 오는 남성 손님의 특징은 맥주를 주문하는 레이블에 분류될 것입니다. 이때 유의할 것은 저녁이라는 특징과 남성의 특징 서로는 독립적이라는 점입니다. 이제 베이즈 이론과 나이브 베이즈 알고리즘이 어느 정도 이해되었으리라 생각합니다. 서두에서 말했듯이 나이브 베이즈 알고리즘은 스팸 메일 분류에 굉장히 뛰어난 성능을 보입니다. 스팸 메일 분류는 뒤의 실습에서 다시 살펴보기로 하고, 이제는 데이터들의 특징이 이산적이지 않은 경우의 나이브 베이즈 알고리즘을 살펴보겠습니다. 우리가 위에서 살펴본 모든 예시들은 데이터들이 이산적이라는 특징을 가지고 있습니다. 맥주 주문은 O, X로 나뉘며 성별 또한 남성과 여성 두 분류, 시간대는 오전, 점심, 저녁 세 분류로 나누었습니다. 만약 데이터의 특징들이 연속적일 경우에는 어떤 방법을 사용해야 할까요? 이때는 가우시안 나이브 베이즈 분류(Gaussian Naive Bayes)를 사용하는 것이 좋습니다. 가우시안 나이브 베이즈는 특징들의 값들이 정규 분포(가우시안 분포)되어 있다는 가정 하에 조건부 확률을 계산합니다. 정규 분포되어 있다는 가정은 표본 평균과 표본 분산을 가진다는 것을 의미하며 나이브 베이즈 공식과 정규 분포의 표현식을 결합한 형태로 표현합니다. 지금 당장 아래의 수식으로 표현할 수 있지만 당장은 이 수식을 너무 자세히 알 필요는 없을 것 같습니다. 지금 중요한 점은 이산적이지 않은 연속적인 특징들에 대해서는 가우시안 나이브 베이즈 분류를 사용하는 것이 효율적이라는 것입니다. 다음 포스트 실습에서 직접 해볼 것이지만 예시로 붓꽃의 꽃받침 길이에 따른 분류는, 길이라는 연속적인 특징들을 가우시안 나이브 베이즈 분류기로 분류하는 것입니다.

가우시안 나이브 베이즈 공식

반면 위의 예시들처럼 이산적인 데이터의 경우에는 사이킷런에서 제공하는 두 가지의 나이브 베이즈 분류 모델을 상황에 맞게 적절히 사용하면 됩니다. 다음은 다항 분포 나이브 베이즈(Multinomial Naive Bayes)와 베르누이 나이브 베이즈(Bernoulli Naive Bayes)에 대한 설명과 두 차이점, 사용 예시입니다.

 

먼저 다항 분포 나이브 베이즈는 데이터의 특징들의 출현 횟수를 표현할 때 사용합니다. 예를 들어 동전을 2번 던졌을 때 앞면이 2번, 뒷면이 0번 나왔다면 데이터는 (앞면, 뒷면) = (2,0)과 같이 나타낼 것입니다. 인덱스는 앞면과 뒷면을 의미하며, 인덱스에 해당하는 값은 앞면과 뒷면의 출현 횟수를 표시합니다. 반면 베르누이 나이브 베이즈는 데이터의 특징들을 0과 1로 표현할 때 사용합니다. 위의 예시에서 앞면이 2번 나왔음에도 앞면 출현 횟수인 2를 표시하는 것이 아니라, 앞면이 한 번이라도 나왔으니 1, 뒷면은 한 번도 나오지 않았으니 0으로 표시해 베르누이 나이브 베이즈에서 동전 던지기 데이터는 (앞면, 뒷면) = (1,0)과 같이 표현될 것입니다. 실습에서는 다음의 총 세 가지 데이터셋을 분류해볼 것이며 붓꽃(iris) 데이터셋 분류는 가우시안 나이브 베이즈 분류 모델로, 영화 리뷰 긍정/부정 분류는 다항 분포 나이브 베이즈 분류 모델로, 스팸 메일 분류는 베르누이 나이브 베이즈 분류 모델을 사용할 것입니다.

 

실습에 앞서, 다른 모델에서처럼 나이브 베이즈 분류 모델에서도 overfitting, underfitting 등의 문제점을 방지하기 위해 모델 학습에 보정해줘야 하는 부분이 있습니다. 먼저 스무딩입니다. 스무딩은 이산적인 데이터들의 경우 빈도수가 0일 때 확률이 0이 되는 문제점을 극복하기 위해 나온 보정 방법으로, 학습 데이터에 없던 데이터가 출현해도 빈도수에 1을 더해서 확률이 0이 되는 현상을 방지합니다. 스팸 메일 분류 예시를 들자면 현재까지 우리가 만든 나이브 베이즈 분류 모델에서 우리는 메일에 'free', 'coupon' 두 특징만으로 학습하고자 했는데, 새로운 단어인 'sale'이 등장한다면 학습 데이터에 없던 단어이기 때문에 확률을 0으로 만들어 버려 스팸 분류를 제대로 하지 못하는 문제점이 발생합니다. 따라서 이러한 특징들에 대해서는 새로운 데이터를 봤을 때, 0이 아니라 빈도수를 1 늘려 확률을 계산하게끔 하는 기법입니다. 파이썬을 사용하신 분들이라면 collections 라이브러리의 defaultdict(int)를 떠올리면 이해에 도움이 될 것 같습니다. 다음으로 언더플로우 현상은 Vanishing gradient를 떠올리면 이해가 쉽습니다. Vanishing gradient는 뉴럴 네트워크에서 Backpropagation으로 학습하는 도중 활성화 함수를 sigmoid로 설정해 0과 1 사이의 값이 지속적으로 곱해지는 이유로 Gradient 항이 사실상 사라져 학습망이 깊어질수록 이전의 노드들이 결과에 미치는 영향이 급격히 줄어드는 상황을 말합니다. 언더플로우 현상 또한 확률은 항상 1보다 작기 때문에, 많은 특징들에 대해 모든 확률들을 곱하다 보면(나이브 베이즈 분류에서는 모든 사건을 독립적으로 간주하기 때문에, 모든 특징들의 확률을 곱하는 상황이 자주 등장합니다.) 0에 가까운 너무 낮은 숫자가 나와 비교 및 분류가 힘들어지는 현상입니다. 따라서 이런 경우에는 로그를 취한 다음 연산을 진행하는 등의 방법으로 언더플로우 현상을 방지할 수 있습니다.

 

이번 포스트에서 알아본 나이브 베이즈 알고리즘은 모든 데이터의 특징들을 독립적인 간주하는 나이브 가정에도 불구하고, 높은 정확도를 보이며 특히 앞에서 말했듯이 문서 및 메일 분류에 굉장히 강한 모습을 보입니다. 또한 데이터의 특징들을 독립적으로 간주하기 때문에 계산량이 월등히 적어지며 다른 모델들과 비교했을 때 계산 속도가 상당히 빠릅니다. 하지만 그러한 가정으로 인하여 현실 세계의 다른 분류에서는 사용이 어려운 경우도 많으며, 이러한 점을 조심하여 사용해야만 좋은 정확도를 얻을 수 있습니다. 다음 포스트에서는 가우시안 나이브 베이즈 분류 모델을 사용하여 꽃받침 길이에 따른 붓꽃 데이터를 분류하는 실습을 진행해보겠습니다.