py
naiveBayes
#
Find similar titles
- (rev. 35)
- ecjang
Structured data
- Category
- Statistics
Table of Contents
나이브 베이즈 분류(Naive Bayesian classification) #
나이브 베이즈 분류란? #
나이브 베이즈(Naive Bayes)는 베이즈 이론(Bayes theorem)의 확률 모델을 기반으로 하는 강력한 분류기이지만 매우 단순하다. 기본적으로 각 속성값 확률을 기반으로 범주에 속한 인스턴스를 확률로 결정한다. 여기서 "나이브"란 용어는 각 속성은 다른 속성과 독립적이라는 의미로 즉, 속성값은 다른 속성값과 관계가 없다.
베이즈 정리 #
먼저 베이즈 정리를 살펴보면, 매개변수 x,y가 있을 때, 분류 1에 속할 확률이 p1(x,y)이고, 분류 2에 속할 확률이 p2(x,y)일때,
p1(x,y) > p2(x,y)이면, 이 값은 분류 1에 속한다
p1(x,y) < p2(x,y)이면, 이 값은 분류 2에 속한다.
1. 사전확률(prior probability)
: 관측자가 이미 알고 있는 사건으로부터 나온 확률로 P(A1), P(A2), ..., P(An)을 의미함
2. 우도(likelihood probability)
: 이미 알고있는 사건이 발생했다는 조건하에 다른 사건이 발생할 확률로, 위의 베이즈 정리에서는 P(B|A1), P(B|A2), ..., P(B|An)을 의미한다.
3. 사후확률(posterior probability)
: 사전확률과 우도를 통해서 알게되는 조건부 확률로 베이즈 정리에서는 P(Ak|B)를 의미한다.
이미지 출처 : http://j1w2k3.tistory.com/1009
나이브 베이즈 알고리즘은 이와 같이 베이즈 정리를 이용하여 분류하고자 하는 대상의 각 분류별 확률을 측정함으로써 그 확률이 더 큰 쪽으로 분류하는 방법을 취한다.
나이브 베이즈 정리 #
나이브 베이즈의 여러 애플리케이션 중 가장 성공적인 분야는 자연어 처리(NLP, Natural Language Processing)이다. 자연어 처리 분야의 많은 문제는 분류 태스크로 만들어낼 수 있으므로 기계학습과 매우 관련성이 높다.
예제를 통해 나이브 베이즈를 이용하여 텍스트 분류를 수행하도록 한다. 먼저 범주를 가진 텍스트 문서가 있고, 보지 못한 새로운 인스턴스의 범주를 예측하도록 나이브 베이즈 알고리즘을 훈련시킨다. 아마도 가장 잘 알려지고 널리 쓰이는 것이 스팸 필터이다. python의 scikit-learn을 이용하여 뉴스 그룹 메시지를 분류하는 예제를 수행한다. 이용하고자 하는 데이터 셋은 정치, 종교, 스포츠, 과학과 같은 20개의 다른 주제로 19,000개 뉴스 그룹 메시지를 포함한다.
데이터셋 불러오기 #
데이터셋은 sklearn.datasets 모듈의 fetch_20newgroups 함수를 이용하여 임포트한다. 데이터셋의 property를 확인하고자 할 때, data, target, target_names 등을 사용한다. 단, 다른 데이터 셋과의 다른 점은 data가 수치형이 아니라 텍스트 내용을 포함하고 있다는 것이다.
### sklearn.datasets 모듈의 fetch_20newgroups 함수 이용
>>> from sklearn.datasets import fetch_20newsgroups
>>> news = fetch_20newsgroups(subset = 'all')
전처리 #
기계학습 알고리즘은 오직 수치 데이터로 작동한다. 그렇기 때문에 텍스트 기반 데이터셋을 수치 데이터셋으로 변환하는 전처리 과정을 수행하여야 한다.
sklearn 에서는 sklearn.feature_extraction.text 모듈을 통해 텍스트 문서를 수치 속성의 벡터로 만들 수 있다. 해당 모듈에서는 텍스트에서 수치형으로 변환할 수 있는 세 개의 다른 클래스를 제공한다(CountVectorizer, HashingVectorizer, TfidfVectorizer). 세 클래스 모두 문서에서 특정 단어가 나타나는 횟수가 원소가 되는 수치속성의 벡터를 반환한다.
>>> from sklearn.naive_bayes import MultinomialNB
>>> from sklearn.pipeline import Pipeline
>>> from sklearn.feature_extraction.text import TfidVectorizer, HashingVectorizer, CountVectorizer
### 1. CountVectorizer
>>> clf_1 = Pipeline([
('vect', CountVectorizer()),
('clf', MultinomialNB()),
])
### 2. HashingVectorizer
>>> clf_2 = Pipeline([
('vect', HashingVectorizer(non_negative = True)),
('clf', MultinominalNB()),
])
### 3. TfidfVectorizer
>>> clf_3 = Pipeline([
('vect', TfidfVectorizer()),
('clf', MultinomialNB()),
])
성능 평가 #
전체 훈련 데이터로 모델을 훈련하고 훈련 데이터와 테스트 데이터로 정확도를 평가하는 함수를 만든다.
>>> from sklearn import metrics
>>> def train_and_evaluate(clf, X_train, X_test, y_train, y_test):
clf.fit(X_train, y_train)
print "Accuracy on training set:"
print clf.score(X_train, y_train)
print "Accuracy on testing set:"
print clf.score(X_test, y_test)
y_pred = clf.predict(X_test)
print "Classification Report"
print metrics.classification_report(y_test, y_pred)
print "Confusion Matrix:"
print metrics.confusion_matrix(y_test, y_pred)
참고 문헌 #
- scikit-learn을 활용한 파이썬과 기계학습(전철욱 옮김)
- 나이브 베이즈 분류(http://bcho.tistory.com/1010)
- 확률과 통계 이론 "베이즈 정리"(http://j1w2k3.tistory.com/1009)