樸素貝葉斯算法

1、樸素貝葉斯原理簡介

樸素貝葉斯是基於貝葉斯定理和特徵條件獨立假設的分類方法。對於給定的訓練數據集,首先基於特徵條件獨立假設學習輸入和輸出的聯合機率分佈;而後基於該模型,對於給定的輸入x,利用貝葉斯定理求出後驗機率最大的輸出y。
通俗來講,假如你在街上看到一個黑人,我問你這我的來自哪裏,你大機率會猜非洲。爲何呢?由於黑人中非洲人的比例最高,固然也多是美洲人或亞洲人,但在沒有其它可用信息下,咱們會選擇條件機率最大的類別,這就是樸素貝葉斯的思想基礎。
貝葉斯定理:已知某條件機率,如何獲得兩個事件交換後的機率,也就是在已知p(x|y)的狀況下如何求得p(y|x)。即:算法

樸素貝葉斯算法
條件獨立假設數學表達式爲:
樸素貝葉斯算法
使用樸素貝葉斯法分類時,對給定的輸入x,經過學習到的模型計算後驗機率分佈p(y=ck|X=x).將後驗機率最大的類做爲x的類輸出,後驗機率計算根據貝葉斯定理進行:
樸素貝葉斯算法app

將公式(2)帶入公式(3),即得:
樸素貝葉斯算法ide

這就是樸素貝葉斯分類器的基本公式,又因爲公式(4)的分母是相同的,所以能夠將樸素貝葉斯分類器表示爲:
樸素貝葉斯算法函數

2、樸素貝葉斯參數估計

從樸素貝葉斯的分類器的公式(5)來看,須要估計兩個參數,即:p(y=ck)和p(X(j)=x(j)|y=ck)。其中:
(1)p(y=ck)的極大似然函數估計爲:
樸素貝葉斯算法學習

(2)假設第j個特徵x(j)的可能取值集合爲 (aj,1,aj,2,……,aj,D),條件機率p(X(j)=aj,d)|Y=ck)的極大似然估計是:
樸素貝葉斯算法
其中:
●i=1,...,M 表示樣本個數;
●j=1,...,n 表示特徵個數;
●k=1,...,K 表示標籤的類別個數;
●Xi(j)表示第i個樣本的第j個特徵;
●aj,d表示第j個特徵的第d類取值;
●I是指示函數。測試

3、實踐樸素貝葉斯算法

下面使用樸素貝葉斯模型,對郵件進行分類,識別郵件是否是垃圾郵件。
數據下載地址:
連接:https://pan.baidu.com/s/1er-AjWm-inaWPf-r0qxnLA
提取碼:ohscspa

import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB

# 預處理數據
def text_parse(big_string):
    token_list = big_string.split()
    return [tok.lower() for tok in token_list if len(tok)>2]

# 去除列表中重複元素,並以列表形式返回
def create_vocab_list(data_set):
    vocab_set = set({})
    for d in data_set:
        vocab_set = vocab_set | set(d)

    return list(vocab_set)

# 統計每一文檔(或郵件)在單詞表中出現的次數,並以列表形式返回
def words_to_vec(vocab_list, input_set):
    return_vec = [0] * len(vocab_list)

    for word in input_set:
        if word in vocab_list:
            return_vec[vocab_list.index(word)] += 1

    return return_vec

# 樸素貝葉斯主程序

doc_list, class_list, x = [], [], []

for i in range(1, 26):
    # 讀取第i篇垃圾文件,並以列表形式返回
    word_list = text_parse(open('email/spam/{0}.txt'.format(i), encoding='ISO-8859-1').read())
    doc_list.append(word_list)
    class_list.append(1)

    # 讀取第i篇非垃圾文件,並以列表形式返回 
    word_list = text_parse(open('email/ham/{0}.txt'.format(i), encoding='ISO-8859-1').read())
    doc_list.append(word_list)
    class_list.append(0)

# 將數據向量化
vocab_list = create_vocab_list(doc_list)

for word_list in doc_list:
    x.append(words_to_vec(vocab_list, word_list))

# 分割數據爲訓練集和測試集
x_train, x_test, y_train, y_test = train_test_split(x, class_list, test_size=0.25)
x_train, x_test, y_train, y_test = np.array(x_train), np.array(x_test),\
    np.array(y_train), np.array(y_test)

print("x_train: ")
print(x_train[:5])
print("\n")
print("y_train: ")
print(y_train[:5])
print("\n")

# 訓練模型
nb_model = MultinomialNB()
nb_model.fit(x_train, y_train)

# 測試模型效果
y_pred = nb_model.predict(x_test)

# 輸出預測狀況
print("正確值:{0}".format(y_test))
print("預測值:{0}".format(y_pred))
print("準確率:%f%%" % (accuracy_score(y_test, y_pred)*100))

結果以下所示,識別正確率爲92.3%,效果還算能夠哦。
x_train: 
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]

y_train: 
[1 0 0 0 1]

正確值:[1 1 1 1 1 1 1 1 1 1 1 0 0]
預測值:[1 1 1 0 1 1 1 1 1 1 1 0 0]
準確率:92.307692%

樸素貝葉斯算法
一個數據人的自留地是一個助力數據人成長的你們庭,幫助對數據感興趣的夥伴們明確學習方向、精準提高技能。
掃碼關注我,帶你探索數據的神奇奧祕3d

相關文章
相關標籤/搜索