728x90
다항분포 나이브 베이즈는 앞서 실습한 베르누이 나이브 베이즈와 비슷하다. 하지만 베르누이는 데이터의 특징이 0 또는 1로 표현되고 다항분포는 데이터의 특징이 출현 횟수로 표현된다.
Import
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
데이터 생성
영화 감상평을 데이터로 생성하여 실습해보았다.
review_list = [
{'movie_review' : 'this is great great movie. I will watch again', 'type':'positive'},
{'movie_review' : 'I like this movie', 'type':'positive'},
{'movie_review' : 'amazing movie in this year', 'type':'positive'},
{'movie_review' : 'cool my boyfriend also said the movie is cool', 'type':'positive'},
{'movie_review' : 'awesome of the awesome movie ever', 'type':'positive'},
{'movie_review' : 'shame I wasted money and time', 'type':'negative'},
{'movie_review' : 'regret on this move. I will never never what movie from this director', 'type':'negative'},
{'movie_review' : 'I do not like this movie', 'type':'negative'},
{'movie_review' : 'I do not like actors in this movie', 'type':'negative'},
{'movie_review' : 'boring boring sleeping movie', 'type':'negative'}]
df = pd.DataFrame(review_list)
df
[출력]
데이터 전처리
다항분포 나이브 베이즈의 입력 데이터는 베르누이 나이브 베이즈와 같이 고정된 크기의 벡터로 나타내야한다. 또한 숫자만 다루기 때문에 positive, negative를 1과 0으로 치환해주어야 한다.
# positive와 negative를 1과 0으로 치환
df['label'] = df['type'].map({"positive":1, "negative":0})
df_x = df["movie_review"] # 학습 데이터
df_y = df["label"] #label
#고정된 크기의 벡터로 변환
cv = CountVectorizer()
x_traincv = cv.fit_transform(df_x)
encoded_input = x_traincv.toarray()
encoded_input
[출력]
CountVectorizer()의 파라미터 값 binary를 지정해주지 않으면 binary = False이므로 0과 1이 나타나는 것이 아닌 출현 횟수가 나타난다.
벡터로 인코딩된 영화 감상평에 어떤 단어가 포함돼 있는지 보면 다음과 같다.
#단어 확인
print(cv.inverse_transform(encoded_input[0]))
print(cv.get_feature_names())
[출력]
모델 학습
mnb = MultinomialNB()
mnb.fit(x_traincv, df_y)
[출력]
테스트 데이터 생성
test_feedback_list = [
{'movie_review' : 'great great great movie ever', 'type':'positive'},
{'movie_review' : 'I like this amazing movie', 'type':'positive'},
{'movie_review' : 'my boyfriend said great movie ever', 'type':'positive'},
{'movie_review' : 'cool cool cool', 'type':'positive'},
{'movie_review' : 'awesome boyfriend said cool movie ever', 'type':'positive'},
{'movie_review' : 'shame shame shame', 'type':'negative'},
{'movie_review' : 'awesome director shame movie boring movie', 'type':'negative'},
{'movie_review' : 'do not like this movie', 'type':'negative'},
{'movie_review' : 'I do not like this boring movie', 'type':'negative'},
{'movie_review' : 'aweful terrible boring movie', 'type':'negative'}]
test_df = pd.DataFrame(test_feedback_list)
test_df['label'] = test_df['type'].map({'positive':1, 'negative':0})
test_x = test_df["movie_review"]
test_y = test_df["label"]
테스트
x_testcv = cv.transform(test_x)
predictions = mnb.predict(x_testcv)
accuracy_score(test_y, predictions)
[출력]
정확도가 1.0이 나오는 것을 확인할 수 있다.
728x90
'Machine Learning > Coding' 카테고리의 다른 글
[실습] KMeans (K 평균 군집화) (0) | 2021.06.23 |
---|---|
[실습] 랜덤 포레스트(Random Forest)와 앙상블(Ensemble) (0) | 2021.06.20 |
[실습]Bernoulli Naive Bayes(베르누이 나이브 베이즈) (0) | 2021.06.10 |
[실습] Gaussian Naive Bayes(가우시안 나이브 베이즈) (0) | 2021.06.07 |
[실습]의사결정 트리(Decision Tree) (3) | 2021.06.01 |