일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- deep learning
- A Neural Algorithm of Artistic Style
- 역전파법
- 소수
- Python
- 역전파
- Gram matrix
- CNN
- Autoencoder
- bayesian
- 비샤몬당
- 베이지안
- 히토요시
- 소인수분해
- project euler
- SQL
- 신경망
- backpropagation
- 수달
- mnist
- 오일러 프로젝트
- 합성곱 신경망
- c#
- 전처리
- 딥러닝
- 자전거 여행
- 냥코 센세
- 오토인코더
- neural network
- Convolutional Neural Network
- Today
- Total
통계, IT, AI
[머신러닝] 나이브 베이즈 분류 Naive Bayes Classification에 대하여 본문
1. 개요
나이브 베이즈는 베이즈 정리를 사용하는 확률 분류기의 일종으로 특성들 사이에 독립을 가정한다. 이론이 어렵지 않고 구현이 간단하며 "나이브"한 가정에도 불구하고 여러 복잡한 상황에서 잘 작동하기 때문에 다양한 분야에서 사용되고 있다. 1
독립변수에 따라 여러가지 모습을 가지지만 이번 포스팅에서는 어떤 메시지가 스팸(spam)인지 또는 정상(ham)인지 분류하는 문제만 고려한다. 2장에서는 나이브 베이즈 분류를 이해하기 위한 배경 지식을 간단하게 훑어보고 3장에서 나이브 베이즈가 어떤 식으로 작동하는지 살펴본다. 4장에서는 나이브 베이즈를 실제 데이터에 적용하여 텍스트 메시지를 분류해본다.
2. 배경 지식
2.1. 베이지안 통계
베이지안 통계에서는 모수
한편, 어떤 우도 함수에 대하여 적절한 사전 분포를 정하면 사후, 사전 분포를 서로 같게 할 수 있는데, 이 사전 분포를 공액 사전 분포 conjugate prior distribution이라고 부른다. 예를 들어, 우도 함수가 정규 분포일때 사전 분포를 정규 분포로 하면 사후 분포도 정규 분포가 된다.
지금까지의 내용은 모수
이때
만약
MAP으로 사후 예측 분포를 추정하는 방식을 사후 분포의 분산과 관련지어 생각해 볼 수 있다. 만약 표본의 수
2.2. 여러가지 분포
나이브 베이즈에서 사용되는 몇가지 확률 분포와 그 성질을 소개한다.
2.2.1. 다항분포 Multinomial distribution
다항 분포 Multinomial distribution은
2.2.2. 디리클레 분포 Dirichlet distribution
디리클레 분포 Dirichlet distribution은 벡터
디리클레 분포의 주변 확률 분포 marginal probability distribution은 베타 분포가 된다. 즉,
이 사후 분포의 MAP
이제
그리고
따라서
2.2.3. Dirichlet-Multinomial distribution
Dirichlet-Multinomial distribution은 다항 분포와 디리클레 분포가 결합된 형태이다. 양수 벡터
3. Naive Bayes Classification
그림 1. 귀여운 아기 수달
한 문장 안의 여러 단어들은 그 사용 빈도에 있어 서로 밀접한 관련이 있다. 그림 1을 보자. 어떤 문장에 수달이라는 단어가 있다면, 그 문장에 "귀엽다"라는 단어도 등장할 가능성이 크다. 반면 입자 가속기라는 단어가 있는 문장에서 "귀엽다"라는 단어를 찾기는 어려울 것이다.
그리고 한 문장 내 단어들은 등장 순서에도 서로 상관이 있다. 일반적으로 한국어 문장에서는 주어가 가장 처음에 나오고 동사가 가장 나중에 나오기 때문이다. 이러한 관계를 4
하지만 나이브 베이즈에서는 이러한 사실들을 무시한다. 즉, 문장에 어떤 단어가 등장할 확률은 다른 단어의 존재 여부 및 순서와 무관하다라고 "나이브"하게 가정한다. 즉 식
이제 나이브 베이즈가 어떻게 동작하는지 보자. 표 1과 같이 나이브 베이즈의 가정에 맞추어 5개의 메시지에서 단어를 순서없이 추출하였다. 그리고 어떤 메시지로부터 추출한 단어가 (call, happy, fine, otter)이라고 할 때 이 메시지가 정상(ham)인지 스팸(spam)인지 분류해보자.
메세지 ID |
메시지로부터 추출한 단어 |
분류 |
1 |
fine, hope, fine, care |
ham |
2 |
happy, year, hope, good, semester |
ham |
3 |
premium, phone, service, call |
spam |
4 |
fine, give, call, question |
ham |
5 |
call, immediately, urgent, message, waiting |
spam |
먼저 단어장
사후 예측 분포
식
식
식
식
이 사후 분포를 통하여 사후 예측 분포를 쉽게 구할 수 있다.
즉, 사후 예측 분포는 Categorical Distribution과 Dirichlet-Multinomial Distribution의 곱으로 나타난다는 것을 알 수 있다. Dirichlet-Multinomial Distribution이 다항 분포로 근사한다는 것을 이용하면 사후 예측 분포를 다음과 같이 쓸 수도 있다.
한편, MAP을 사후 분포에 대입하여 사후 예측 분포를 근사할 수도 있다.
사후 예측 분포를 직접 구한 결과와 MAP을 대입하여 추정한 결과가 유사하다. 식
사후 예측 분포를 사용한 예측
MAP을 사용한 예측
이제 키워드 call, happy, fine, otter가 있는 메시지를 분류해보자. 식
|
Label |
|
ham |
spam |
|
5 |
2 |
|
1 |
0 |
|
|
1 |
2 |
|
3 |
0 |
0 |
0 |
이때 고려해야 할 문제가 한가지 있는데,
하지만 균등 분포를 사전 분포로 하는 것은 MAP을 이용한 예측 시 문제가 된다. otter와 같이 학습 데이터에 없는 단어가 테스트에 등장할 시
식
위의 내용을 바탕으로 키워드 call, happy, fine, otter가 있는 메시지는, 사후 예측 분포를 사용한 경우 86.695%, MAP을 사용한 경우 86.857%의 확률로 ham으로 분류된다. 두 방법이 차이가 거의 없음을 알 수 있는데, 이는 Dirichlet-Multinomial distribution이 다항 분포에 잘 근사하기 때문이다. 이 값을 확인하기 위해서는 이 링크의 코드를 실행하면 된다.
4. Naive Bayes를 이용한 메시지 분류
4.1. 데이터 소개 및 메시지 분류
SMS Spam Cellection은 5,574개의 영어 메시지를 담은 데이터셋으로 4,827개의 정상(ham) 메시지와 747개의 스팸(spam) 메시지가 있다. 이 데이터에 대한 자세한 설명은 여기에 있으며 메시지의 일부는 다음과 같다.
분류 |
내용 |
ham |
What you doing? how are you? |
ham |
Ok lar... Joking wif u oni... |
spam |
Sunshine Quiz! Win a super Sony DVD recorder if you canname the capital of Australia? Text MQUIZ to 82277. |
spam |
URGENT! Your Mobile No 07808726822 was awarded a L2,000 Bonus Caller Prize on 02/09/03! This is our 2nd attempt to contact YOU! Call 0871-872-9758 BOX95QU |
ham |
Cos i was out shopping wif darren jus now n i called him 2 ask wat present he wan lor. Then he started guessing who i was wif n he finally guessed darren lor. |
이 데이터 셋은 학습 데이터와 테스트 데이터가 따로 구분되어 있지 않으므로 학습용/테스트용 데이터를 약 4:1 비율로 나눈다. 본 포스팅에서는 난수를 생성하여 각각 4,465개 1,109개로 나누었다. 사전에 seed를 주었기 때문에 결과를 재연할 수 있을 것이다. 구현에는 Python 3.5.2(Anaconda 4.1.1)를 사용하였다.
학습 데이터에서 메시지를 띄어쓰기 단위로 분리하여 단어를 추출하자.
4.2. 데이터 전처리를 통한 성능 향상
데이터 전처리를 통하여 이 분류기의 성능을 높일 수 있다. 먼저 생각할 수 있는 것은 영문자를 모두 소문자 또는 대문자로 통일하는 것이다. 이 작업을 하기 전에는 Cat과 cat이 서로 다른 단어로 취급되기 때문에 그 단어에 대한 과소 추정이 일어나게 된다. 물론 영문장의 특성상 Cat과 cat은 다른 위치에 있을 가능성이 높다. 하지만 나이브 베이즈의 가정을 고려해볼 때, 단어를 모두 대문자 또는 소문자로 변환하는 것이 합리적이다.
그 다음으로 생각할 수 있는 것은 숫자를 제거하는 것이다. 일반적으로 숫자는 단어로서의 기능을 갖지 않기 때문이다. 하지만 특정한 상황에서 숫자도 문장을 분류하는데 도움을 줄 수 있다. "대한민국이 16강에 진출하였다.", "루나틱하이가 오버워치 APEX 시즌 3에서 2연패를 달성하였다.", "100% 당첨!"과 같은 문장이 그러한 예이다. 이와 같은 문장에 사용되는 숫자는 제거하지 않는 것이 좋을 수도 있다.
구두점 punctuation을 제거하는 것도 좋은 방법이다. "수달... 넘나 귀여운 것"과 "수달, 넘나 귀여운 것"는 다른 뉘앙스를 전달하지만 같은 뜻을 지니고 있다. 하지만 "수달..."과 "수달,"이 다른 단어로 취급되어 "수달"에 대한 과소 추정이 일어나게 된다. 구두점을 제거하게 되면 모두 같은 단어가 되어 정확한 계측을 할 수 있다.
일반적인 문장에서 자주 사용되는 단어들이 있다. 영어에서는 the, be, you, 한국어에서는 ~다, 나, 그리고 등이 있다. 이러한 단어들을 불용어 Stopwords 라고 부른다. 불용어는 문장을 분류하늗네 큰 도움이 되지 못할 뿐만 아니라 그 단어가 포함되지 않은 경우 추정을 왜곡하기도 한다. 따라서 이들을 단어장에서 제거하는 것이 좋다. 본 포스팅에서는 MySQL의 영어 정지어를 사용하여 전처리를 진행한다.
이밖에도 너무 짧은 문자 제거하기, 활용형을 원형으로 바꾸기 등이 있다. 지금까지 소개한 전처리 방법을 이용하여 본 데이터를 가공한 결과, 7
5. 마치며
얼마전 어떤 시험 문제로 나이브 베이즈를 구현하라는 것이 나왔다. 나이브 베이즈는 보통 머신 러닝 책의 초반에 짧게 소개되는 경우가 많고 크게 어렵지 않은 방법론으로 알려져 있다. 그래서 나는 나는 그것을 쉽게 할 수 있으리라 생각했다. 하지만 책상 앞에 앉으니 내가 그것을 제대로 이해하지 못하고 있다는 의문이 들었다. 사실 그때 작성한 코드를 보면 의문이 아니라 사실임이 분명해 보인다. 시험이 끝나고 나서도 불편한 마음이 끊이질 않아 이 포스팅을 작성하게 되었다. 나이브 베이즈에 대한 몇가지 의문이 해소되어 좋다.
- 출처: 위키피디아, https://en.wikipedia.org/wiki/Naive_Bayes_classifier [본문으로]
- 출처: Kevin P. Murphy, Machine Learning, 2012 [본문으로]
- 감마 함수 비의 근사에 대해서는 다음을 참고하라. F Tricomi, 1951, The asymptotic expansion of a ratio of gamma functions [본문으로]
- 한국어는 조사가 있어 문장 순서의 엄격함이 다른 종류의 언어보다 덜 하지만 일반적인 어순은 존재한다. [본문으로]
- 하지만 이러한 작업은 일반적으로 권장되지 않는다. 출처: Jason D.M. Rennie, 2001, Improving Multi-class Text Classification with Naive Bayes [본문으로]
- 물론 log 변환도 되지 않는다. [본문으로]
- 예: went-> go, 갔다 -> 가다 [본문으로]
'머신러닝' 카테고리의 다른 글
딥러닝: 화풍을 모방하기 (12) - 연습: CNN 구현 (0) | 2017.12.12 |
---|---|
딥러닝: 화풍을 모방하기 (11) - 책요약: 6. CNN (0) | 2017.11.30 |
딥러닝: 화풍을 모방하기 (10) - 연습: 자기부호화기(Autoencoder) (0) | 2017.04.30 |
딥러닝: 화풍을 모방하기 (9) - 책 요약: 5. 자기부호화기 (0) | 2017.04.17 |
딥러닝: 화풍을 모방하기 (8) - 연습: 역전파법 (0) | 2017.03.01 |