본문 바로가기
TIL/머신러닝

2021.9.21 TIL : [ML] 지도 학습 - Naive Bayes

by yeon_zoo 2021. 9. 21.

머신 러닝에서 가장 기초 알고리즘으로 배우면서도 자주 쓰이는 것 중 하나도 나이브 베이즈 알고리즘을 배운다. 

 

특징(feature)과 라벨링

예를 들어 하루종일 Let it go를 듣는 나에게 새로운 음악을 추천하는 머신러닝 알고리즘을 만들고 싶다고 해보자.

그러면 Let it go의 특징들 (템포, 장르, 가수의 성별, 음악의 밀도)을 분석하고 다른 음악들을 라벨링(내가 좋아할 것 같은 음악, 좋아하지 않는 음악) 할 수 있다. 

 

이렇게 라벨링된 데이터들은 특징을 시각화한 산포도(scatter plot)으로 나타낼 수 있다. 컴퓨터는 3차원도 이해할 수 있지만 우리는 2차원으로 그려야 이해가 쉽기 때문에 2차원으로 그린다. 

Stanley Terrain Classification

Stanley라는 자동차는 사막에서 달리는 세계 최초의 자율 주행차로 만들어졌다. 이 차는 자율로 속도를 조절하면서 운행한다. 여기서 분석한 특징들은 다음과 같다.

  • 가파름 정도 : 평평하거나 언덕이거나
  • 울퉁불퉁 정도 : 차 안에서 측정 가능

지도 학습을 이용해서 차가 빨리 가거나 천천히 가는 것을 결정하도록 도우면 된다. 

 

속도 산포도를 이용한 예측

위의 그림에서 ?? 부분이 새로운 데이터가 들어왔다고 하면, 파란 색과 가깝기 때문에 속도를 늦춰야 한다. 

반면 다음 그림과 같은 경우엔 어떻게 해야 할까?

위의 그림처럼 애매하게 위치한 경우를 위해 둘을 구분하는 뚜렷한 기준을 세워야 한다. 이러한 기준들을 decision surface라고 한다. 

 

A good linear decision surface

위의 그림과 같이 여러 decision surface가 있다면 가장 좋은 decision surface는 노란색으로 표시된 선이다. (보통은 직선이 아니라 구불구불하게 그려지는 경우가 많다)

 

이렇게 decision boundary를 그려두면 새로운 관측치가 들어왔을 때 예측이 매우 쉬워진다. 

 

이러한 나이브 베이즈를 위해서는 파이썬에서 Scikit-learn 라이브러리를 이용할 수 있다.

라이브러리를 사용한 코드는 여기에서 확인할 수 있다.

 

Training data and testing data

만약 training data와 testing data가 같다면, testing data를 이용하였을 때의 정확도는 100%일 것이다. 그렇게 되면 새로운 데이터를 발생시킬 근거가 없다. 새로운 데이터가 계속해서 생성되는 것이 아니고 수집하는 데에 시간이 걸린다는 것이다.  즉, 샘플 데이터만 가지고 학습을 한 결과, 샘플 데이터에 대해서는 100% 가까운 정확도를 보이지만 예상치 못한 새로운 데이터에 대해서는 정확도가 떨어진다. 

 

따라서 가지고 있는 모든 데이터를 이용하여 학습하기 보다는 약 10% 정도를 testing data로 save 해둬야 한다. (몇 퍼센트를 testing data로 빼둘지는 사람마다 다른 견해를 가지고 있다. 실제로 내가 듣는 머신 러닝 수업의 교수님 두분이서 서로 다른 견해를 보이셨다. 하지만 대략 10 ~ 30%는 빼두는 듯 하다)

 

Bayes 규칙

이는 목사인 Thomas Bayes가 약 400년 전에 신의 존재를 증명하고자 Bayes Rule을 개발한 것으로 오늘날 AI 등 통계에서 아주 중요한 역할을 하고 있다. 

기본 개념

  • 사전 확률(prior) : 관측자가 이미 알고 있는 사건 확률
  • 우도(likelihood) : 이미 알고 있는 사건이 발생했다는 조건 하에 다른 사건이 발생할 확률
  • 사후확률(posterior) : 사전확률과 우도를 통해 알게 되는 조건부 확률

 

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

(여기서 P(A)는 사전확률, P(B|A)는 우도, P(B)는 한정상수(normalizer))

 

예를 들면 암에 대한 실혐 결과가 있다고 하자. 

P(cancer) = 0.01 이고

테스트 결과의 정확성은 다음과 같다.

- 암이 실제로 있을 때, 암이라고 판단될 가능성 : 90%

- 암이 실제로 없을 때, 암이 아니라고 판단될 가능성 : 90%

Q. 검진을 받았을 때, 암이라고 진단 받았다고 하자. 이 경우에 내가 실제로 암일 확률은?

A. 사전확률 : P(cancer) = 0.01 = 1%

    사후확률 : P(canacer | Positive) = P(C) * P(Positive | C)

P(Positive | Cancer) = 0.9 = 90%

P(Not cancer) = 0.99 = 99%

P(Negative|^Cancer) = 0.9

사후확률 : P(Cancer | positive) = P(C) * P(Positive|C) = 0.009

               P(^Cancer | Positive) = P(^C) * P(Positive | ^C) = 0.099

 

 

Normalizing 

  • Normalizer : P(positive) = P(C | pos) + P(^C | pos) = 0.108
  • posterior 
    • P(Cancer, positive) = P(C) * P(positive | C) = 0.009
    • P(^Cancer, positive) = P(^C) * P(positive | ^C) = 0.099 

∴ P(C|pos) = 0.009 / 0.108 = 0.0833

 

나이브 베이즈 분류기는 이러한 베이즈 정리를 이용하여 텍스트 분류를 수행한다. 예를 들어 나이브 베이즈 분류기를 통해서 스팸 메일 필터를 만들어본다고 하자. 입력 텍스트(메일의 본문)이 주어졌을 때, 입력 텍스트가 정상 메일인지 스팸 메일인지 구분하기 위한 확률을 이와 같이 표현할 수 있다.

 

P(정상메일 | 입력텍스트) = 입력텍스트가 있을 때 정상 메일인 확률

P(스팸메일 | 입력텍스트) = 입력텍스트가 있을 때 스팸 메일인 확률

 

이를 베이즈 정리를 통해서 적어보면 다음과 같다.

P(정상메일 | 입력텍스트) = (P(입력텍스트|정상메일) x P(정상메일)) / P(입력텍스트)

P(스팸메일 | 입력텍스트) = (P(입력텍스트|정상메일) x P(스팸메일)) / P(입력텍스트)

 

입력 텍스트가 주어졌을 때, P(정상메일 | 입력텍스트)이 P(스팸메일 | 입력텍스트)보다 크다면 정상 메일이라고 볼 수 있다. 혹은 그 반대라면 스팸메일이라고 볼 수 있다. 두 확률 식은 모두 분모를 P(입력텍스트)로 갖고 있으므로 둘을 제거하여 식을 간소화 할 수 있다. 

P(정상메일 | 입력텍스트) = P(입력텍스트|정상메일) x P(정상메일)

P(스팸메일 | 입력텍스트) = P(입력텍스트|정상메일) x P(스팸메일)

 

나이브 베이즈는 모든 feature이 서로 독립적이라고 본다. 즉, 위의 스팸 메일 분류기 예시에서 본다면 각 단어가 독립적이라고 보는 것이다. 따라서 다음과 같은 경우에 둘 다 스팸이라고 판단할 수 있다.

  • 다이어트에 딱 좋은 이 약을 구매하세요
  • 나 어제부터 다이어트 시작했어

나이브 베이즈는 또한 순서를 고려하지 못하게 된다는 단점이 있다. 하지만 간단한 알고리즘이면서도 성능이 꽤 좋기 때문에 현재에 와서도 많이 사용된다. 


NB를 이용했던 사례

해리포터의 저자 J.K.Rowling이 Robert Galbraith라는 이름으로 책을 썼는데, 이 때 NB를 이용한 ML 기법으로 그 저자가 J.K.Rowling임을 밝혀 냈다. 

댓글