上次說到 Naive Bayes 是以貝氏定理來解決機器學習上的分類問題。
下方會透過一個簡單的郵件分類來說明 Naive Bayes Classifier 的實做方式。
目前 sklearn
有提供以下種類的 Naive Bayes 套件:
這裡使用的是 Spam email Dataset
這裡會使用 CountVectorizer 將文本轉換為標記計數矩陣。
from sklearn.feature_extraction.text import CountVectorizer
vectorizer=CountVectorizer()
spamham_countVectorizer=vectorizer.fit_transform(spam_dataframe['text'])
由於是屬於離散型分類,這裡是用的是 MultinomialNB
from sklearn.naive_bayes import MultinomialNB
NB_classifier=MultinomialNB()
NB_classifier.fit(X_train,y_train)
y_predict_test=NB_classifier.predict(X_test)
y_predict_test
透過 classification_report
我們可以計算出分類預測的準確率
from sklearn.metrics import classification_report
print(classification_report(y_test,y_predict_test))
在 From Scratch 的部分僅使用 numpy
由於預處理的結果是標記計數矩陣和詞彙列表,所以我們必須實做以下函式。
該函數用於對文本進行預處理。 它將刪除標點符號、停用詞,並將文本轉換為小寫。
def preprocess_text(text):
text = text.lower()
text = re.sub(r'[^\w\s]', '', text)
tokens = text.split()
return ' '.join(tokens)
該函數用於從文本中構建詞彙。 它將返回詞彙詞典。
def build_vocabulary(texts):
vocabulary = set()
for text in texts:
tokens = text.split()
vocabulary.update(tokens)
return list(vocabulary)
該函數用於將文本轉換為向量。 它將返回一個文本向量。
def create_bow(texts, vocabulary):
bow_matrix = []
for text in texts:
tokens = text.split()
bow_vector = [tokens.count(word) for word in vocabulary]
bow_matrix.append(bow_vector)
return bow_matrix
class CustomMultinomialNB:
def __init__(self, alpha=1):
self.alpha = alpha
def fit(self, X, y):
self.X = X
self.y = y
self.classes = np.unique(y)
self.parameters = {}
for i, c in enumerate(self.classes):
X_c = X[np.where(y == c)]
self.parameters["phi_" + str(c)] = len(X_c) / len(X)
self.parameters["theta_" + str(c)] = (X_c.sum(axis=0) + self.alpha) / (np.sum(X_c.sum(axis=0) + self.alpha))
def predict(self, X):
predictions = []
for x in X:
phi_list = []
for i, c in enumerate(self.classes):
phi = np.log(self.parameters["phi_" + str(c)])
theta = np.sum(np.log(self.parameters["theta_" + str(c)]) * x)
phi_list.append(phi + theta)
predictions.append(self.classes[np.argmax(phi_list)])
return predictions
訓練朴素貝葉斯分類器。它將返回一個概率字典。
數學上,概率計算如下:
用於預測數據的類別。它將返回一個預測列表。
數學上,概率計算如下:
透過 Naive Bayes Classifier 我們所得到分類器的準確率可高達百分比 99 的準確率。
詳細的內容可以觀看 Notebook
明天會透過 Kaggle competition 中的來演練 Digit Recognizer