機器學習之貝葉斯

2021-09-25 11:51:08 字數 3711 閱讀 8772

scikit-learn 樸素貝葉斯類庫使用小結

demo

貝葉斯定理是18世紀英國數學家托馬斯·貝葉斯(thomas bayes)提出得重要概率論理論。以下摘一段 wikipedia 上的簡介:

所謂的貝葉斯定理源於他生前為解決乙個「逆概」問題寫的一篇文章,而這篇文章是在他死後才由他的一位朋友發表出來的。在貝葉斯寫這篇文章之前,人們已經能夠計算「正向概率」,如「假設袋子裡面有 n 個白球,m 個黑球,你伸手進去摸一把,摸出黑球的概率是多大」。而乙個自然而然的問題是反過來:「如果我們事先並不知道袋子裡面黑白球的比例,而是閉著眼睛摸出乙個(或好幾個)球,觀察這些取出來的球的顏色之後,那麼我們可以就此對袋子裡面的黑白球的比例作出什麼樣的推測」。這個問題,就是所謂的逆向概率問題。

貝葉斯定理是關於隨機事件 a 和 b 的條件概率:

其中p(a|b)是在 b 發生的情況下 a 發生的可能性。

在貝葉斯定理中,每個名詞都有約定俗成的名稱:

p(a)是 a 的先驗概率,之所以稱為「先驗」是因為它不考慮任何 b 方面的因素。

p(a|b)是已知 b 發生後 a 的條件概率,也由於得自 b 的取值而被稱作 a 的後驗概率。

p(b|a)是已知 a 發生後 b 的條件概率,也由於得自 a 的取值而被稱作 b 的後驗概率。

p(b)是 b 的先驗概率,也作標淮化常量(normalizing constant)。

機器學習的乙個重要應用就是文件的自動分類。

在文件分類中,整個文件(如一封電子郵件)是例項,而電子郵件中的某些元素則構成特徵。我們可以觀察文件**現的詞,並把每個詞作為乙個特徵,而每個詞的出現或者不出現作為該特徵的值,這樣得到的特徵數目就會跟詞彙表中的詞的數目一樣多。

樸素貝葉斯是上面介紹的貝葉斯分類器的乙個擴充套件,是用於文件分類的常用演算法。下面我們會進行一些樸素貝葉斯分類的實踐專案。

提取所有文件中的詞條並進行去重

獲取文件的所有類別

計算每個類別中的文件數目

對每篇訓練文件:

對每個類別:

如果詞條出現在文件中–>增加該詞條的計數值(for迴圈或者矩陣相加)

增加所有詞條的計數值(此類別下詞條總數)

對每個類別:

對每個詞條:

將該詞條的數目除以總詞條數目得到的條件概率(p(詞條|類別))

返回該文件屬於每個類別的條件概率(p(類別|文件的所有詞條))

優點: 在資料較少的情況下仍然有效,可以處理多類別問題。

缺點: 對於輸入資料的準備方式較為敏感。

適用資料型別: 標稱型資料。

樸素貝葉斯是一模擬較簡單的演算法,scikit-learn中樸素貝葉斯類庫的使用也比較簡單。相對於決策樹,knn之類的演算法,樸素貝葉斯需要關注的引數是比較少的,這樣也比較容易掌握。在scikit-learn中,一共有3個樸素貝葉斯的分類演算法類。分別是gaussiannb,multinomialnb和bernoullinb。其中gaussiannb就是先驗為高斯分布的樸素貝葉斯,multinomialnb就是先驗為多項式分布的樸素貝葉斯,而bernoullinb就是先驗為伯努利分布的樸素貝葉斯。

這三個類適用的分類場景各不相同,一般來說,如果樣本特徵的分布大部分是連續值,使用gaussiannb會比較好。如果如果樣本特徵的分大部分是多元離散值,使用multinomialnb比較合適。而如果樣本特徵是二元離散值或者很稀疏的多元離散值,應該使用bernoullinb。

基於高斯分布的

import numpy as np

x = np.array([[

-1,-

1],[

-2,-

1],[

-3,-

2],[

1,1]

,[2,

1],[

3,2]

])y = np.array([1

,1,1

,2,2

,2])

from sklearn.*****_bayes import gaussiannb

clf = gaussiannb(

)#擬合資料

此外,gaussiannb乙個重要的功能是有 partial_fit方法,這個方法的一般用在如果訓練集資料量非常大,一次不能全部載入記憶體的時候。這時我們可以把訓練集分成若干等分,重複呼叫partial_fit來一步步的學習訓練集,非常方便。後面講到的multinomialnb和bernoullinb也有類似的功能。

def

multinormalcls()

:"""

樸素貝葉斯對20類新聞進行分類

:return:

"""news = fetch_20newsgroups(subset=

'all'

)# 1、分割資料集

x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=

0.3)

# 2、進行文字特徵抽取(演算法能夠知道特徵值)

tfidf = tfidfvectorizer(

)# 對訓練集特徵值進行特徵抽取

x_train = tfidf.fit_transform(x_train)

# a = tfidf.get_feature_names()

# print(a)

# print(x_train.toarray())

# 對測試集的特徵值進行抽取

# x_test = tfidf.fit_transform(x_test)

# b = tfidf.get_feature_names()

# print(b)

## print(a==b)

x_test = tfidf.transform(x_test)

# 進行樸素貝葉斯演算法**

mlb = multinomialnb(alpha=

1.0)

mlb.fit(x_train, y_train)

# **,準確率

print

("**測試集當中的文件類別是:"

, mlb.predict(x_test)[:

50])print

("測試集當中的文件真實類別是:"

, y_test[:50

])# 得出準確率

print

("文件分類的準確率為:"

, mlb.score(x_test, y_test)

)return

none

機器學習 貝葉斯

bayes.py包含了所有函式的實現,需要做的是,明白各個函式的功能作用及輸入輸出,在指令碼中完成函式的呼叫,給出要求的格式的結果。from numpy import import csv import random random.seed 21860251 def loaddataset post...

機器學習之樸素貝葉斯

寫在前面 本文寫自初學時,若後續學習過程中有新的理解,將不定期進行更新 若文中敘述有誤,望不吝賜教,也將及時修改 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。在理解樸素貝葉斯之前,需要對兩個數...

機器學習之樸素貝葉斯

樸素貝葉斯 1 樸素貝葉斯 2 一 高斯樸素貝葉斯 gaussiannb實現了高斯樸素貝葉斯分類演算法,設假設特徵的可能性是高斯的 p x i y 12 y 2exp xi y 22 y 2 p x i y frac exp frac p xi y 2 y2 exp 2 y2 xi y 2 1 引數...