Machine Learning/Coding

[실습] 다항분포 나이브 베이즈(Multinomial Naive Bayes)

ju_young 2021. 6. 13. 11:34
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