Multinomial Naive Bayes áp dụng trong classification
Bài này mình xin giới thiệu về một kĩ thuật khá cơ bản về classification là Multinomial Naive Bayes. Đây là kĩ thuật thuộc họ phân loại theo xác xuất dựa trên định lí Bayes định lí Bayes Đây là model phân hoạch xác xuất của nó: Còn đây là model tính của Multinomial Naive Bayes: Giải ...
Bài này mình xin giới thiệu về một kĩ thuật khá cơ bản về classification là Multinomial Naive Bayes. Đây là kĩ thuật thuộc họ phân loại theo xác xuất dựa trên định lí Bayes định lí Bayes
Đây là model phân hoạch xác xuất của nó: Còn đây là model tính của Multinomial Naive Bayes: Giải thích cục đó hơi dài, mà Viblo hình như không gõ được công thức toán học, nên nếu muốn tìm hiểu sâu hơn, bạn cứ lên wiki nhé :v
Mình xin mô tả kĩ thuật tính dựa trên một simple example như sau:
Giả sử mình có 5 tài liệu và có những từ như dưới, 4 tài liệu đầu đã được phân loại (c hoặc j), tài liệu thứ 5 là cái mình cần tìm ra loại của nó (c hay là j ?)
Doc | Word | Class | |
---|---|---|---|
Tranning | 1 | Chinese Bejing Chinese | c |
2 | Chinese Chinese Shanghai | c | |
3 | Chinese Macao | c | |
4 | Tokyo Japan Chinese | j | |
Test | 5 | Chinese Chinese Chinese Tokyo Japan | ? |
Prior: P(c) = 3/4 P(j) = 1/4
Conditional Probabilities: P(Chinese/c) = (5+1)/(8+6) = 6/14 = 3/7 (5 là số term Chinese trong cụm class c, 8 là số lượng term trong phân cụm class c, 6 là số term khác nhau cũng trong c) P(Tokyo/c) = (0+1)/(8+6) = 1/14 P(Japan/c) = (0+1)/(8+6) = 1/14 P(Chinese/j) = (1+1)/(3+6) = 2/9 P(Tokyo/j) = (1+1)/(3+6) = 2/9 P(Japan/j) = (1+1)/(3+6) = 2/9
Cuối cùng chúng ta tính ra được xác xuất để chọn class:
-
P(c|d5) = 3/4 * (3/7)^3 * 1/14 * 1/14 = 0.0003
-
P(j|d5) = 1/4 * (2/9)^3 * 2/9 * 2/9 = 0.0001
Vậy là chúng ta chọn loại c cho Doc5
Tiếp theo mình có một ví dụ khác sử dụng scikit learn để áp dụng cho nhanh việc phân loại này: File data ở đây là một file csv:
tweet_text,emotion_in_tweet_is_directed_at,is_there_an_emotion_directed_at_a_brand_or_product ".@wesley83 I have a 3G iPhone. After 3 hrs tweeting at #RISE_Austin, it was dead! I need to upgrade. Plugin stations at #SXSW.",iPhone,Negative emotion "@jessedee Know about @fludapp ? Awesome iPad/iPhone app that you'll likely appreciate for its design. Also, they're giving free Ts at #SXSW",iPad or iPhone App,Positive emotion @swonderlin Can not wait for #iPad 2 also. They should sale them down at #SXSW.,iPad,Positive emotion @sxsw I hope this year's festival isn't as crashy as this year's iPhone app. #sxsw,iPad or iPhone App,Negative emotion "@sxtxstate great stuff on Fri #SXSW: Marissa Mayer (Google), Tim O'Reilly (tech books/conferences) & Matt Mullenweg (Wordpress)",Google,Positive emotion @teachntech00 New iPad Apps For #SpeechTherapy And Communication Are Showcased At The #SXSW Conference http://ht.ly/49n4M #iear #edchat #asd,,No emotion toward brand or product ,,No emotion toward brand or product "#SXSW is just starting, #CTIA is around the corner and #googleio is only a hop skip and a jump from there, good time to be an #android fan",Android,Positive emotion
column tweet_text chứa các text và column is_there_an_emotion_directed_at_a_brand_or_product chứa phân loại Negative emotion or Positive emotion. Dựa vào dữ liệu này chúng ta sẽ tìm xem cụm từ "I love my iphone!!!" là Negative emotion or Positive emotion.
import pandas as pd import numpy as np from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB df = pd.read_csv('temp/tweets.csv') target = df['is_there_an_emotion_directed_at_a_brand_or_product'] text = df['tweet_text'].values.astype('U').tolist() count_vect = CountVectorizer() count_vect.fit(text) transformed = count_vect.transform(["I love my iphone!!!"]) counts = count_vect.transform(text) # print(counts.A, counts.toarray()) nb = MultinomialNB() nb.fit(counts, target) print(nb.predict(transformed))
Output: "Positive emotion"
Dĩ nhiên là nó đưa ra kết quả dựa trên xác xuất mà nó đã được train từ dữ liệu trên.
Hy vọng mọi người sẽ hiểu hơn về kĩ thuật này.