目錄
1. 必看知識
貝葉斯分類的內容其實並不複雜,主要就是一個貝葉斯公式。相比它的擴展內容就比較多,主要是一些概率論的知識。
概率論大佬可以跳過,直接閱讀第二節內容。
1.1. 參數估計
參數估計:根據樣本統計量的數值對總體參數進行估計的過程。
根據參數估計的性質不同,可以分爲兩種類型:點估計和區間估計
1.1.1. 點估計
點估計:根據樣本統計量某一具體數值直接推斷未知的總體參數。
對總體參數進行點估計常用兩種方法:矩估計和最大似然估計,機器學習中常用的點估計是最大似然估計。
舉個例子:在大街上隨機抽取100個人,計算出他們的平均年齡是25歲,如果直接用25去代表所有人的平均年齡,這種估計方法就是點估計
但是很明顯,這種估計方式存在不足。從例子上來看,大街上隨便抽一個人的年齡是25歲,是有很大誤差的。從理論上來說,總體參數是一個常數值,而樣本統計量是一個隨機變量,用隨機變量去估計常數值時,誤差是不可避免的。
1.1.2. 區間估計
區間估計:根據樣本統計量的抽樣分佈特徵,估計總體參數的一個區間,並同時給出總體參數落在此區間的可能性大小。
還是上面那個例子:如果用區間估計去推斷用戶年齡,則會有如下結果:根據樣本數據,估計用戶的平均年齡在22~28之間,置信程度爲95%
1.2. 似然與概率
似然與概率在語義上似乎是一對同義詞,但是在統計學中卻是兩個不同的概念。對了,似然的英文是 likelihood
1.2.1. 概率
概率是在特徵環境下某件事情發生的可能性,也就是結果沒有產生之前,我們根據已知環境下的參數θ來預測某件事情發生的可能性。
別懵,我來舉例子:
就拿拋硬幣來說,拋之前我們並不確定應該是哪一面朝上,但是根據衆所周知的硬幣性質θ可以推測正面朝上的概率是50%(反面同)
注意,這個概率只有在拋硬幣之前纔有意義,拋完之後的結果是確定的(1或0)
1.2.2. 似然
似然卻剛好與概率相反,是在已經確定的結果下推測產生這個結果的可能參數θ。注意,是已經確定了結果的前提下。
還是拋硬幣的例子:
隨機拋一枚硬幣100次,結果出現60次數字朝上,那我們去判斷這枚硬幣的時候發現這並不是一枚標準的硬幣,因爲數字朝上的概率60%>人頭朝上的概率40%。
我們運用出現的結果去判斷事情本身的性質(參數),也就是似然。
1.2.3. 表示
如果用θ表示事物本身的性質(參數),x表示事件的結果,那麼概率可以表示爲 P(x|θ),理解成在θ的前提下,事件x發生的概率。
對應的似然可以表示爲£(θ|x),理解成已知事件結果x,求參數爲θ對應的概率
即:£是關於θ的函數,而P是關於x的函數,兩者從不同的角度描述一件事情
1.3. 最大似然估計
最大似然估計:MLE(maximum likelihood estimates)
先回到概率和似然的定義,概率描述的是在一定條件下某個事件發生的可能性,概率越大說明這件事情越有可能發生。
可是似然是針對已經發生的事情,取最大的意義在哪?
還是上面拋硬幣的例子:100次中60次數字朝上,40次人頭朝上,這時它的似然函數是:
此時拋硬幣(100次中60次數字朝上)這件事情已經發生,它的概率是1,但是它的似然函數並不能達到1,退而求其次我們取似然函數的最大值,讓它儘量的達到我們此時拋硬幣的的結果,這就是最大似然估計。
ok,沒懂的多讀幾遍這個例子,這個很重要。
1.4.最大後驗估計
最大後驗估計:MAP(maximum a posteriori estimation)
爲了保持連貫性,這部分我先寫出來,你們在看的時候可以先跳過這小節去看正文,回過頭來在看最大後驗估計。
上面的MLE其實是求一組能夠使似然函數最大的參數θ,但是如果這個參數有一個先驗概率呢?
就像在拋硬幣的例子中,從生活經驗中來看,硬幣一般都是均勻的,所以θ=0.5的概率最大,那麼這個時候應該怎麼去估計參數?
這個時候需要用到MAP,MAP的基礎是貝葉斯公式:
對於這個函數:P(x|θ)就是錢買你說到的似然函數,p(θ)是先驗概率,是指在沒有任何數據的情況下對θ的主觀判斷(硬幣是均勻的,所以θ=0.5)
p(x)是一個全概率公式,通常在數據中是一個已知結果,所以一般只計算分子。
1.5. 注意
再次來看拋硬幣的例子,如果拋一枚硬幣10次,有10次數字朝上,求正面朝上的概率θ
利用極大似然估計可以得到θ = 10/10=1.0,當樣本數據不足的時候,MLE會產生嚴重的偏差
2. 貝葉斯原理
貝葉斯原理的初衷是爲了解決一個逆向概率的問題。你可能要問了,什麼是逆向概率?
逆向概率你可能不懂,我們先看一下一個例子
emm,從年初開始,一共有20天是下雨天,20天裏面小一有15天是在家吃飯,其中有9頓是在家打火鍋,有5天是不在家吃飯,這5天有一天是去外面吃火鍋。剛好今天下雨了,小一在家吃飯的概率是多少呢?
答:當然是15/20=75%
小一今天吃火鍋的概率?
答:分兩種,一種是在家吃,一種是不在家吃
上面的問題就是正向概率,你可能還聽過一個詞:先驗概率,對,它兩一回事
對了,還有一個是條件概率,表示在家吃的時候吃火鍋
相應的逆向概率就是從反向推理事物發生的概率,也叫後驗概率
如果今天打火鍋,那今天在家的概率你能算對嗎?
先來一起理一下思路:
我們知道,在家吃飯的概率
在家吃火鍋的概率
另外還有,不在家吃飯的概率
不在家吃火鍋的概率
這裏,有兩點需要注意一下:
- 在家吃火鍋≠在家的時候吃火鍋
- 不在家吃火鍋≠不在家的時候吃火鍋
因爲後者是一個聯合概率,表示(不)在家的條件下吃火鍋
所以後者可以這樣表示:
那麼我們可以算出來,下雨天吃火鍋的概率:
回到我們的問題,今天吃火鍋的條件下,在家吃的概率是:
我們也可以反向驗證一下:
吃火鍋一共10次,在家吃9次,不在家吃1次,所以在家吃的概率是90%
如果上面的例子你已經看懂了,那麼今天的核心點你就已經掌握了
我們直接另 吃火鍋=B,在家吃=,不在家吃=,整理一下就是大名鼎鼎的貝葉斯公式:
因爲吃火鍋只有兩種情況,在家吃和在不在家吃,剛好對應了分母中的兩種情況。
於是貝葉斯公式經常這樣寫:
3. 樸素貝葉斯分類
你可能要問了,貝葉斯我知道了,那樸素貝葉斯?樸素在哪?
之所以稱爲樸素貝葉斯,是因爲它假設每個輸入變量是獨立的
就比如高富帥三個特徵之間互不影響,帥的不一定高,高的不一定富
於是,求一個人高富帥的概率
樸素貝葉斯我也懂了,那它能做什麼呢?
能做的事情就很多,我們只需要用數據訓練一個貝葉斯模型,其實也就是先驗概率和條件概率,然後貝葉斯就可以預測出後驗概率來。
就好比今天小一要不要吃火鍋呢?在家吃還是去外面吃呢?
你別看現在我們是用來做預測,其實貝葉斯最適合解決分類問題
舉幾個例子你就知道了:
垃圾郵件你應該有了解過,貝葉斯通過前期的系列訓練,可以將未來的郵件進行分類(正常or垃圾)
世界盃比賽球隊的輸贏預測,也是通過貝葉斯實現的
在實際分類過程中,貝葉斯分類主要包括兩種:離散數據的分類和連續數據的分類
離散數據的分類
離散數據的分類根據…
別急別急,你先告訴我什麼是離散數據?
離散數據是有明確邊界的數據,就像身高的高中低,成績的排名1234等,像1~100之間的任何數組組成的數據集就是連續數據。
離散數據的分類是根據貝葉斯定理實現,特別是樸素貝葉斯的應用
看個例子唄,如果說現在有一個人的特徵是:身高中、體重中、鞋碼大 ,這個人是男的還是女的?請你來分個類
ok,我們先確定一下屬性:
=身高中,=體重中,=鞋碼小,=男,=女
我們的目的是計算和,對應概率大的就是結果了
前面已知貝葉斯公式:
分母都一樣,那
我們直接比較分子就行了
又根據樸素貝葉斯
直接計算
第二個結果對應的是女孩子,那就是她了
連續數據的分類
連續型數據的進行分類一般有兩種方法,先看數據集:
一種方法是我們將連續型數據轉換爲離散型
比如說體重特徵我們設置幾個範圍T1(100-120),T2(120-140)…這樣子連續型數據映射在相應範圍,實現離散化
按照上面離散化的處理方式即可
另一種方式是我們假設身高、體重、鞋碼都是正態分佈,通過樣本計算出均值和方差
還記得正態分佈的密度函數嗎,我們把點的值帶進去,就能得到相應的概率值。
4. 實戰
在sklearn 中提供的貝葉斯分類算法有三種,分別是:高斯樸素貝葉斯(GaussianNB)、多項式樸素貝葉斯(MultinomialNB)和伯努利樸素貝葉斯(BernoulliNB)
先來看一下這三種算法的區別:
高斯分佈:
高斯分佈又叫正態分佈,我們把一個隨機變量 X服從數學期望爲μ,方差爲σ^2 的數據分佈稱爲正態分佈,當μ=0,σ=1是稱爲標準 正態分佈(對應紅色的線)
伯努利分佈:
又稱零一分佈,是多重伯努利實驗的概率分佈。
多項式分佈:
是二項分佈的推廣,二項分佈是隨機結果只有兩個取值,多項式分佈式指隨機結果有多個取值
多項式樸素貝葉斯和伯努利樸素貝葉斯常用在文本分類問題中,高斯樸素貝葉斯主要用於連續變量中,且假設連續變量是服從正態分佈的。
有關文本分類
今天的實戰項目是針對新聞數據進行分類,說更直白點,就是文本分類
在文本分類的過程中,有一個很重要的內容:如何將普通的文本轉換爲計算機可以識別的向量
這裏用到一個叫做TF-IDF的方法,先解釋一下這個內容
TF-IDF 是一個統計方法,用來評估某個詞語對於一個文件集或文檔庫中的其中一份文件的重要程度。
TF-IDF 由Term Frequency(詞頻)和Inverse Document Frequency(逆向文檔頻率)組成。即TF-IDF=TF*IDF
詞頻TF:
計算一個單詞在文檔中出現的次數,單詞的重要性和TF成正比
逆向文檔概率IDF:
指一個單詞在文檔中的區分度。如果一個單詞出現在的文檔數越少,就越能通過這個單詞把該文檔和其他文檔區分開。即IDF越大單詞的區分度越大
分母+1是因爲有些單詞不會存在在文檔中,爲了避免分母爲 0,統一給單詞出現的文檔數都加 1
所以,TF和IDF越高的單詞越適合分類,也就是在一個文檔中出現次數較多,同時又很少出現在其他文檔中的單詞,適合進行分類
4.1. 開始實戰
先來說說這次實戰項目的相關背景
目前我們有部分新浪新聞數據,其中包括財經、IT、健康等等新聞類別,每個類別有若干篇新聞報道
我們的任務是預測新聞的類別
爲了方便進行分詞,我們還有一個停用詞表
什麼是停用詞呢?
停用詞是指在分類中沒有用的詞,這類詞一般出現的頻率TF很高,但是並不能很好的區分不同的文章(IDF低),例如“你、我、他”、一些介詞、連接詞等
4.2. 讀取數據
讀取數據,將每一個新聞文本和其對應的新聞類別進行對應
爲了方便下一步進行分詞,這裏直接將數據存儲在字典中
最終結構化的數據是這樣的
4.3. 數據分詞
針對每個新聞,我們這裏直接使用結巴進行分詞
使用結巴分詞,需要提前安裝jieba 這個包,win下直接pip install 即可
分詞後的數據集是這樣的
一共88條新聞,好像看的不是很清楚,我們拎出來第一條新聞仔細看下是如何分詞的
4.4. 計算每個單詞的權重
在sklearn 中直接使用 TfidfVectorizer類可以用來計算詞的TF-IDF值
在這裏面,我們可以傳入停用詞表,並且設置參數max_df
max_df代表單詞在所有文檔中出現的概率,如果這個概率很大,就說明這個詞的區分度很小,一般不會用來作分詞統計
"""使用停用詞"""
list_stop_words = df_stop_words['stop_words'].to_list()
tfidf_vec = TfidfVectorizer(stop_words=list_stop_words, max_df=0.5)
因爲我們前面是對整個數據集進行操作,所在在這一步需要將數據集進行拆分,然後再計算詞的TF-IDF值
# 切分數據集
X_train, X_test, y_train, y_test = train_test_split(data['cut_content'], data['label'], test_size=0.2)
# 計算權重
X_train_features = tfidf_vec.fit_transform(X_train)
X_test_features = tfidf_vec.transform(X_test)
4.5. 建立模型
在文章的開始說到了三種樸素貝葉斯的分類算法,針對新聞數據集,很明顯是一個多分類問題,所有我們選用多項式樸素貝葉斯
多項式樸素貝葉斯假設特徵的先驗概率爲多項式分佈,即:
即第k 個類別的第j 維特徵的第l 個取值條件概率。mk是訓練集中輸出爲第k 類的樣本個數。
λ爲一個大於0的常數,當訓練樣本很大的時候,加1的概率變化可以忽略,也同時避免了零概率的問題
對了,三種算法,各自有其不同的參數
多項式樸素貝葉斯有一個參數需要特別注意:alpha
-
當 alpha=1 時,使用的是 Laplace 平滑
-
當 0<alpha<1 時,使用的是 Lidstone 平滑
對於 Lidstone 平滑來說,alpha 越小,迭代次數越多,精度越高
ok,那我們直接進行建模
"""建立模型並進行訓練"""
# 使用多項式樸素貝葉斯進行預測
clf = MultinomialNB(alpha=0.001).fit(X_train_features, y_train)
predict_label = clf.predict(X_test_features)
# 計算準確率
print('準確率爲:', accuracy_score(y_test, predict_label))
貝葉斯模型的方法和其他模型是一樣的
最終的計算結果是這樣的
總結一下
理解貝葉斯算法之前先了解貝葉斯定理,也就是後驗概率的計算;在此基礎上,通過了解樸素貝葉斯的特性,對離散和連續數據進行分類操作。
相比而言,樸素貝葉斯簡單很多,算法應用也很簡單
貝葉斯算法的優缺點
優點:
-
對待預測樣本進行預測,過程簡單速度快
-
對於多分類問題同樣有效,複雜度也並不會有大程度提升
-
在分佈獨立這個假設的情況下,貝葉斯分類器效果奇好
-
對於類別類的輸入特徵變量,效果奇好;對於連續型變量特徵,默認符合正態分佈
缺點:
-
測試集中的一個類別變量,訓練集中沒出現過,則概率爲0,預測就沒用了。
可以使用平滑操作(拉普拉斯平滑) -
樸素貝葉斯獨立分佈的假設,實際生活中很難完全獨立
-
樸素貝葉斯不存在bagging、boosting等模型融合的方法(因爲沒有variance可以減少)