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 引數...