Notice
Recent Posts
Recent Comments
관리 메뉴

GIS & Spatial Analysis in KOREA

Naïve Bayes Classification - Code 본문

Machine Learning/Machine Learning Basic

Naïve Bayes Classification - Code

Borin78 2018. 8. 31. 08:00

[Machine Learning]

#Data Analysis #Data Science #Data Scientist #Spatial Data Analysis #Big Data #Data Visualization

#AI #Machine Learning #Supervised Learning #Naive Bayes #Bayesian Machine Learning

#Python #Coding #sklearn #Library #파이썬 #코딩 #싸이킷런 라이브러리

#데이터 분석 #데이터 과학 #데이터 과학자 #공간데이터 분석 #빅데이터 #데이터 시각화

#인공지능 #기계학습 #머신러닝 #지도학습 #나이브 베이즈 #베이지안 머신러닝 



[ Naïve Bayes Classification - Code ]


 Note!!

   우선 Naïve Bayes 에 대해 이론적인 내용을 잘모르신다면, 부족하지만 이전에 작성한 글을 꼭 읽어보길 권하며, 

   파이썬이 설치되어 있지 않다면 아래 글들을 읽고 꼭 설치하길 바란다.


   이번 글에서는 파이썬의 sklearn(싸이킷런) 라이브러리를 이용해 Naïve Bayes 알고리즘을 적용해 볼 생각이다. 물론 sklearn은 SVM(Support Vector Machine)과 같은 알고리즘도 포함하고 있다. sklearn을 이용하면 Naïve Bayses를 직접 코딩하지 않아도 되는 장점이 있다.



[ The Coding Exercise ]

   텍스트 마이닝의 전형적인 예제인 이메일 세트를 분석해 스팸 메일인지 아닌지 분류하는 연습을 해보려고한다. 702개의 이메일은 스팸 메일인 것과 스팸 메일이 아닌 것으로 똑같이 분류된다. 그리고, 260개의 다른 이메일을 이용해 테스트 할 것이다. 260개의 이메일이 어느 카테고리(스팸 메일/비 스팸 메일)에 속하는지 예측하고 이미 알고있는 분류와 정확도를 비교할 것 이다.


[ 선행조건 ]

   우선 파이썬이 기본적으로 설치되어 있어야하며, numpy, Scipy, Sklearn 라이브러리가 설치되어 있어야한다. 만약,  Anaconda를 이용해 파이썬을 설치했다면 Anaconda Navigator에서 각 라이브러리의 설치 유무를 확인하고 없다면 설치까지 가능하다.(Anaconda 설치 및 이용 글은 글 첫머리 리스트 참조)


 

첨부한 파일을 다운로드 받아 바탕화면에 폴더(영문 권장)를 만들고 다운로드 받은 데이터를 옮겨 놓는다. 파일은 test-mailstrain-mails 두 개 세트로 되어있다. 

test-mails.zip

train-mails.zip


0. Import Library

우선 필요한 라이브러리를 불러와야한다.



  1. os 라이브러리로 파이썬을 이용해 파일을 복사하거나 디렉터리를 생성하고 특정 디렉터리 내의 파일 목록을 구하고자 할 때 사용한다.

  2. numpy 라이브러리로 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리 할 수 있게 해준다.

  3. collection 라이브러리의 Counter를 사용해 리스트에 있는 각 항목들을 셀 예정이다.

  4. sklearn 라이브러리의 Naïve Bayes 알고리즘을 불러온다. (추후 설명함)

  5. sklearn 라이브러리의 matric을 이용해 모델의 정확도를 검증할 예정이다.


1. Cleaning and Preparing the data

   다운로드 받은 파일은 각각 텍스트 파일 형태로 되어 있으며, train-mails의 데이터를 이용해 모델은 만들 계획이다. 받은 파일을 열어보면 다음과 같은 형태로 데이터 셋이 구축되어 있다.


 


   이메일 첫번째 줄은 제목이고 내용은 세번째 줄부터 시작한다. Train-mails나 test-mails의 파일은 열어서 살펴보면 다음과 같은 패턴을 볼 수 있다.


    • 숫자 - 숫자 msg [숫자] . txt : 예) 3-1msg1.txt (비 스팸 메일)

    • Spmsg [a or b or c] [숫자] . txt : 예) spmsga162.txt (스팸 메일)

   텍스트 데이터 마이닝 작업의 첫 번째 단계는 모델의 데이터를 Cleaning해야 한다. 한다. 우선 이메일 텍스트에서 필수가 아닌 단어, 표현식 및 기호를 제거한다.


예를들어,

“Hi, this is Alice. Hope you are doing well and enjoying your vacation.”


   여기서 this, are 등의 단어는 분석에 전혀 도움을 주지 못한다. 이런 단어를 Stop Word (가끔 문서에 나타나지만 아무 의미가 없을 경우도 있는 접속사, 전치사, 관사 및 그 밖의 단어)라고 불린다. 따라서 이 예제에서는 이메일에서 가장 자주나오는 3,000 단어 사전만 고려할 예정이다. 


   Cleaning 이후에 해야할 일은 이메일 전부에 대해 단어 빈도수 매트릭스를 만드는 것이다. 


예를들어,

“Hi, this is Alice. Happy Birthday Alice.”


라고 씌어 있다면 다음과 같이 매트릭스를 정리해야한다.


 


   이메일 전부에 대해 정리하려면 반복적 작업으로 코드를 이용하면 편리하다. 코드는 다음과 같다.



   train-mails 전부 Cleaning 후 메트릭스를 만들고 덜쓰는 단어를 제거해야 한다. 다음으로 make_Dictionary를 정의한 후 폴더에서 전자 메일 파일을 읽고, 단어 사전을 만든다. 그리고, 길이가 1 인 단어를 삭제한 후 3,000 개의 가장 일반적인 단어만 추출해야한다.



2. Extracting features and corresponding label matrix

다음으로 작성한 단어 사전을 이용해 라벨을 생성하고 단어 빈도수 매트릭스를 만든다.

 



3. Training and predicting with sklearn Naïve Bayes

   Naive Bayes Classifier를 이용하면 x들의 조합이 주어졌을 때 특정 y가 나올 확률을 구할 수 있고, 이를 이용해서 가장 확률이 높은 y를 계산할 수 있다. Naive Bayes는 비교적 단순하게 feature들을 봄에도 불구하고, 꽤 좋은 성능을 나타내는 Classfier로 알려져있다.  Sklearn(싸이킷런) 라이브러리의 Naïve Bayes에 관한 설명은 다음 사이트에 잘 나와있다. 


Naive Bayes의 문제점 

        • Multicollinearity (다중공선성) - 회귀분석에서 독립변수들 간에 강한 상관관계가 나타나는 문제

        • Incorrect probability Estimation - 잘못된 학률 추정 문제

Naive Bayes의 종류

      1. Gaussian Naive Bayes : 연속적인 값을 지닌 데이터를 처리할 때 각 class의 연속적인 값들이 가우시안 분포(정규분포)를 따른다고 가정한다. 즉, feature가 연속적인 값일때(continuous variable) 이용한다.

      2. Multinomial Naive Bayes : feature가 이산적인 값이면서 어떠한 이벤트의 빈도수일 때 이용한다.

      3. Bernoulli Naive Bayes : feature가 이산적인 값이면서 독립적인 binary variable일 때 이용한다.

여기서는 Gaussian을 이용할 예정이다. 코드는 다음과 같다.

 



4. Accuracy Score

   다음으로 예측 정확도를 파악해보자. 정확도 점수는 예측을 맞춘 것을 백분위로 나타낸다. sklearn에서 예측 정확도 분석용 알고리즘도 제공한다. 코드는 다음과 같다.


 


전 과정을 합친 전체 코드는 아래 첨부한 파일과 같다.

classifier.py


파이썬 Runnig 결과는 다음과 같다.

reading and processing emails from file.

Training model.

FINISHED classifying. accuracy score : 

1.0


** 추가로 다른 Naïve Bayes의 다른 알고리즘를 적용해 정확도가 얼마나 다른지 비교해보거나, 단어사전의 단어 개수를 3,000개에서 늘리거나 줄여서 정확도를 비교해 보길 권한다.


[ 결론 ]

   Naive Bayes는 feature들의 기능이 독립적이라고 간주한다. 즉,예제 이메일 속 단어의 출현이 다른 단어들로부터 독립적이라고 가정한다. 그러나, 실생활에서는 그렇지 않을 수도 있다. 예를들어, Good이라는 단어 출현 이 후에 Morning의 출현 빈도가 클 수 있다. 따라서, 데이터의 특징에 따라 적절한 알고리즘을 선택하는 것이 매우 중요하다.


- 끝 -



Comments