본문 바로가기
데이터사이언스/머신러닝

나이브 베이즈 (Naive Bayes)

by 짱바람 2023. 4. 19.

나이브 베이즈(Naive Bayes) 분류는 베이즈 정리에 기반한 분류기법이다. 베이즈 정리는 기본적으로 확률적 알고리즘이고 나이브 베이즈의 기본 전제 조건은 feature들이 모두 독립이라는 가정이 있다. 현실 세계에서 모두 독립은 드물지만 그럼에도 불구하고 나이브 베이즈를 쓰는 이유는 성능이 좋기 때문이다. 정확히 얘기하면 확률을 기반으로 하지만 결과는 확률이 아니다. 이진분류를 만든다고 했을 때 A냐 B냐를 구한다고 했을 때 나이브 베이즈는 각각의 확률을 더하면 1이 나오지 않는다. 확률 기반이기는 하지만 뭔가 하나를 뺏다. 그래서 Naive이다. 단순하지만 덜 떨어진다는 뜻이다. Simple 이란 의미가 더 좋을 듯하다. 확률을 기반으로 하긴 하지만 값이 확률이 아니기 때문이다. Text 분석에서 많이 쓰인다. 

Tomas Bayes는 통계파트에서 정리했던 베이즈 정리를 고안했다. B가 주어졌을 때 A 가 나올 확률, 즉 베이즈 정리는 사후  확률을 추정하는 알고리즘이다. Event가 순서대로 다 끝났는데 이걸 역으로 물어보는 것이다. 주머니에서 상자를 결정하고 상자에서 공을 결정한다고 할 때 주머니 선택 -> 공 선택 이벤트 발생순이 순방향으로 가는데 역방향 확률이 사후 확률이다. 이벤트가 끝나고 내 손에 공이 하나 있을 경우 그러면 공을 보고 이 공이 A에서 나왔는지 B에서 나왔는지 역으로 알아보는 것이다. 베이즈 정리는 사후 확률을 추정하는 개념이다. 사후 확률은 데이터를 가지고 있는 조건부 확률, 사전 확률을 가지고 푼다. 그리고 분모에는 주변 확률, 전확률 공식을 넣는다. 그래서 베이즈정리는 엄청 많이 쓰인다. 질병 관련해서 병명 진단할 때 많이 쓰인다. 이 사람이 질병 중 어느 카테고리에 들어갈 것인가를 판단한다.

사전 확률과 조건부 A에서 나올 확률과 B에서 나올 확률을 구해서 큰 것을 구하면 되는데 2번 계산을 해야 한다. 확률이 큰 쪽으로 가면 되는데 가만히 보니 분모가 같다. 여기서의 아이디어는 분류 문제를 풀 때 개별 확률을 구할 필요가 없고 A인지 B인지 분류만 할 수 있으면 되는데, 분모를 지우면 이제부터 진짜 확률은 아니다. 대신에 확률은 아니지만 확률적으로 숫자가 큰 쪽으로 결정하면 되므로 분자는 큰 거는 큰 거, 작은 것은 작은 거로 유지되기 때문에 숫자의 크고 작음은 그대로 유지된다. 베이즈 정리에서 분모를 지우고 조건부 확률과 사전 확률로 계산하는 것이 나이브 베이즈이다.


확률 문제이기 때문에 몇가지 고려할 사항이 있다. 확률을 구할 때 샘플의 개수가 너무 작을 경우이다. 분류를 할 때 A 카테고리에 별 별 동그라미일 경우 새로운 것이 들어왔을 때 별이라고 할 수 있고 별일 확률을 2/3(0.67)이다라고 얘기할 수 있다. 그런데 만약 데이터를 좀 더 넣어 똑같은 알고리즘으로 돌렸더니 별 별 별 동그라미일 경우 새로운 데이터가 들어갈 경우 별이라고 할 수 있고 별일 확률은 3/4 (0.75)으로 바뀐다. 확률이 0.65에서 0.75로 상황이 바뀌면서 데이터의 개수는 1 증가했다. 확률은 0.1 정도 상승, 정확도가 10% 증가한다. 이 문제가 생기는 문제는 이 영역에 들어가는 샘플의 개수가 작을 때는 확률이 크게 움직인다. 그래서 샘플 데이터가 좀 작아서 확률을 적기가 민망할 경우 보정해서 써야 한다. 라플라스가 정리한 라플라스 정리(Laplace Smoothing)에 따라 샘플의 개수가 작을 경우 간단하게 분모 2 더하고 분자에 1 더하여 확률을 계산하면 라플라스 정리로 확률을 정리한 것이 된다. 샘플의 개수가 조금씩 증가할 때 빠르게 진짜 확률에 달라붙는 특성이 있다. 이것은 수학적으로 증명되어 있다. 샘플의 개수가 작을 때 라플라스 스무딩으로 확률을 보정할 수 있다.

다음은 Underflow이다. 0.1과 0.2 사이의 실수 개수는 무한개이다. 예를 들어 프로그래밍 언어 중 자바는 실수를 커버할 때 사용하는 double은 8바이트이다. 8바이트라고 적는 순간 그 범위는 유한하게 된다. 무한한 크기를 유한한 크기로 넣으면 데이터는 잘리게 된다. 컴퓨터마다 정밀도가 있다. 소수점 몇 자리까지는 맞는데 그 이상은 못 맞춘다는 정밀도의 개념이 언더플로우이다. 실제로 확률이 너무 낮게 나오면 컴퓨터는 0으로 본다. 너무 작은 확률이 나올 경우 지수승으로 올리던가 아니면 log를 씌운다. feature 개수가 많아지면 많아질수록 봐야 할 기하급수적으로 데이터가 많아지므로 나이브 베이즈에서는 서로 독립을 가정한다.

나이브 베이즈의 장점과 단점은 다음과 같다.

 

  • 장점
      . 가장 단순한 지도학습 방법중 하나로 빠르고 정확한 모델
      . computational cost가 작은 기법
      . 적은 량의 데이터로 상당한 정확도를 보여줄 수 있음 (잡음, 누락에 강함)
      . 대량 데이터 보다는 이산형 데이터에서 높은 성능
      . 멀티클래스에도 사용 가능
  • 단점
      . 각 Feature 끼리 서로 독립이라는 조건을 가정하나 현실적으로 독립성 가정을 대부분 위배하게 됨
      . 모든 특징이 동등하게 중요하다고 간주
      . 연속형 수치 데이터가 많은 경우 이상적이지 않음 -> 이산화 필요
      . 조건부 확률이 0이 되는 문제 존재 (방지하기 위해 상수항 사용)
      . 데이터 사이즈가 작으면 overfitting 가능성

< 예제 >
샘플 데이터가 10개 있다. 자동차의 색깔, 타입, 국산/수입이 입력변수이고 target value는 차를 훔치는 여부이다. 예를 들어 차량색이 빨간색이며, 스포츠카이고 국산차이면 이 차는 훔칠 가능성이 높다. Supervised Learning이다. 질문은 색깔이 빨란 색이고 SUV이고 국산차일 경우 훔친 차냐? 아니냐? 이것을 물어본다.

질문은 다음과 같은 경우에 도난 차량일까?

나이브 베이즈에서는 사후 확률을 추정하는 것으로 차를 던져주고 훔친 차냐 아니냐를 물어보는 것이다. 조건부 확률 * 사전확률을 곱하는 것으로 계산한다. 빨간색일 때 훔친 차, SUV일 때 훔친 차, 국산차일 때 훔친 자, 훔친 차의 확률을 구하여 모두 곱하고, 빨간색일 때 훔치지 않은 차, SUV 일대 훔치지 않은 차, 국산차일 때 훔치지 않은 차, 훔치지 않은 차의 확률을 모두 곱한다.

0.024, 0.072  두 결과중 숫자가 큰 쪽으로 결정하면 0.072를 선택하면 No라고 예측할 수 있다. 즉 도단차량이 아닐 것이다라고 예측한다. 

아! 베이즈 정리에서 분모를 지우고 숫자가 큰 것으로 결정하는 것이 나이브 베이즈이구나~

댓글