㈠ 貝葉斯網路,看完這篇我終於理解了(附代碼)!
概率圖模型是用圖來表示變數概率依賴關系的理論,結合概率論與圖論的知識,利用圖來表示與模型有關的變數的聯合概率分布。由圖靈獎獲得者Pearl開發出來。
如果用一個詞來形容概率圖模型(Probabilistic Graphical Model)的話,那就是「優雅」。對於一個實際問題,我們希望能夠挖掘隱含在數據中的知識。概率圖模型構建了這樣一幅圖,用觀測結點表示觀測到的數據,用隱含結點表示潛在的知識,用邊來描述知識與數據的相互關系, 最後基於這樣的關系圖獲得一個概率分布 ,非常「優雅」地解決了問題。
概率圖中的節點分為隱含節點和觀測節點,邊分為有向邊和無向邊。從概率論的角度,節點對應於隨機變數,邊對應於隨機變數的依賴或相關關系,其中 有向邊表示單向的依賴,無向邊表示相互依賴關系 。
概率圖模型分為 貝葉斯網路(Bayesian Network)和馬爾可夫網路(Markov Network) 兩大類。貝葉斯網路可以用一個有向圖結構表示,馬爾可夫網路可以表 示成一個無向圖的網路結構。更詳細地說,概率圖模型包括了樸素貝葉斯模型、最大熵模型、隱馬爾可夫模型、條件隨機場、主題模型等,在機器學習的諸多場景中都有著廣泛的應用。
長久以來,人們對一件事情發生或不發生的概率,只有固定的0和1,即要麼發生,要麼不發生,從來不會去考慮某件事情發生的概率有多大,不發生的概率又是多大。而且概率雖然未知,但最起碼是一個確定的值。比如如果問那時的人們一個問題:「有一個袋子,裡面裝著若干個白球和黑球,請問從袋子中取得白球的概率是多少?」他們會想都不用想,會立馬告訴你,取出白球的概率就是1/2,要麼取到白球,要麼取不到白球,即θ只能有一個值,而且不論你取了多少次,取得白球的 概率θ始終都是1/2 ,即不隨觀察結果X 的變化而變化。
這種 頻率派 的觀點長期統治著人們的觀念,直到後來一個名叫Thomas Bayes的人物出現。
托馬斯·貝葉斯Thomas Bayes(1702-1763)在世時,並不為當時的人們所熟知,很少發表論文或出版著作,與當時學術界的人溝通交流也很少,用現在的話來說,貝葉斯就是活生生一民間學術「屌絲」,可這個「屌絲」最終發表了一篇名為「An essay towards solving a problem in the doctrine of chances」,翻譯過來則是:機遇理論中一個問題的解。你可能覺得我要說:這篇論文的發表隨機產生轟動效應,從而奠定貝葉斯在學術史上的地位。
這篇論文可以用上面的例子來說明,「有一個袋子,裡面裝著若干個白球和黑球,請問從袋子中取得白球的概率θ是多少?」貝葉斯認為取得白球的概率是個不確定的值,因為其中含有機遇的成分。比如,一個朋友創業,你明明知道創業的結果就兩種,即要麼成功要麼失敗,但你依然會忍不住去估計他創業成功的幾率有多大?你如果對他為人比較了解,而且有方法、思路清晰、有毅力、且能團結周圍的人,你會不由自主的估計他創業成功的幾率可能在80%以上。這種不同於最開始的「非黑即白、非0即1」的思考方式,便是 貝葉斯式的思考方式。
先簡單總結下頻率派與貝葉斯派各自不同的思考方式:
貝葉斯派既然把看做是一個隨機變數,所以要計算的分布,便得事先知道的無條件分布,即在有樣本之前(或觀察到X之前),有著怎樣的分布呢?
比如往檯球桌上扔一個球,這個球落會落在何處呢?如果是不偏不倚的把球拋出去,那麼此球落在檯球桌上的任一位置都有著相同的機會,即球落在檯球桌上某一位置的概率服從均勻分布。這種在實驗之前定下的屬於基本前提性質的分布稱為 先驗分布,或著無條件分布 。
其中,先驗信息一般來源於經驗跟歷史資料。比如林丹跟某選手對決,解說一般會根據林丹歷次比賽的成績對此次比賽的勝負做個大致的判斷。再比如,某工廠每天都要對產品進行質檢,以評估產品的不合格率θ,經過一段時間後便會積累大量的歷史資料,這些歷史資料便是先驗知識,有了這些先驗知識,便在決定對一個產品是否需要每天質檢時便有了依據,如果以往的歷史資料顯示,某產品的不合格率只有0.01%,便可視為信得過產品或免檢產品,只每月抽檢一兩次,從而省去大量的人力物力。
而 後驗分布 π(θ|X)一般也認為是在給定樣本X的情況下的θ條件分布,而使π(θ|X)達到最大的值θMD稱為 最大後驗估計 ,類似於經典統計學中的 極大似然估計 。
綜合起來看,則好比是人類剛開始時對大自然只有少得可憐的先驗知識,但隨著不斷觀察、實驗獲得更多的樣本、結果,使得人們對自然界的規律摸得越來越透徹。所以,貝葉斯方法既符合人們日常生活的思考方式,也符合人們認識自然的規律,經過不斷的發展,最終占據統計學領域的半壁江山,與經典統計學分庭抗禮。
條件概率 (又稱後驗概率)就是事件A在另外一個事件B已經發生條件下的發生概率。條件概率表示為P(A|B),讀作「在B條件下A的概率」。
比如上圖,在同一個樣本空間Ω中的事件或者子集A與B,如果隨機從Ω中選出的一個元素屬於B,那麼這個隨機選擇的元素還屬於A的概率就定義為在B的前提下A的條件概率:
聯合概率:
邊緣概率(先驗概率):P(A)或者P(B)
貝葉斯網路(Bayesian network),又稱信念網路(Belief Network),或有向無環圖模型(directed acyclic graphical model),是一種概率圖模型,於1985年由Judea Pearl首先提出。它是一種模擬人類推理過程中因果關系的不確定性處理模型,其網路拓樸結構是一個有向無環圖(DAG)。
貝葉斯網路的有向無環圖中的節點表示隨機變數
它們可以是可觀察到的變數,或隱變數、未知參數等。認為有因果關系(或非條件獨立)的變數或命題則用箭頭來連接。若兩個節點間以一個單箭頭連接在一起,表示其中一個節點是「因(parents)」,另一個是「果(children)」,兩節點就會產生一個條件概率值。
例如,假設節點E直接影響到節點H,即E→H,則用從E指向H的箭頭建立結點E到結點H的有向弧(E,H),權值(即連接強度)用條件概率P(H|E)來表示,如下圖所示:
簡言之,把某個研究系統中涉及的隨機變數,根據是否條件獨立繪制在一個有向圖中,就形成了貝葉斯網路。其主要用來描述隨機變數之間的條件依賴,用圈表示隨機變數(random variables),用箭頭表示條件依賴(conditional dependencies)。
此外,對於任意的隨機變數,其聯合概率可由各自的局部條件概率分布相乘而得出:
1. head-to-head
依上圖,所以有:P(a,b,c) = P(a) P(b) P(c|a,b)成立,即在c未知的條件下,a、b被阻斷(blocked),是獨立的,稱之為head-to-head條件獨立。
2. tail-to-tail
考慮c未知,跟c已知這兩種情況:
3. head-to-tail
還是分c未知跟c已知這兩種情況:
wikipedia上是這樣定義因子圖的:將一個具有多變數的全局函數因子分解,得到幾個局部函數的乘積,以此為基礎得到的一個雙向圖叫做因子圖(Factor Graph)。
通俗來講,所謂因子圖就是對函數進行因子分解得到的 一種概率圖 。一般內含兩種節點:變數節點和函數節點。我們知道,一個全局函數通過因式分解能夠分解為多個局部函數的乘積,這些局部函數和對應的變數關系就體現在因子圖上。
舉個例子,現在有一個全局函數,其因式分解方程為:
其中fA,fB,fC,fD,fE為各函數,表示變數之間的關系,可以是條件概率也可以是其他關系。其對應的因子圖為:
在概率圖中,求某個變數的邊緣分布是常見的問題。這問題有很多求解方法,其中之一就是把貝葉斯網路或馬爾科夫隨機場轉換成因子圖,然後用sum-proct演算法求解。換言之,基於因子圖可以用 sum-proct 演算法 高效的求各個變數的邊緣分布。
詳細的sum-proct演算法過程,請查看博文: 從貝葉斯方法談到貝葉斯網路
樸素貝葉斯(Naive Bayesian)是經典的機器學習演算法之一,也是為數不多的基於概率論的分類演算法。樸素貝葉斯原理簡單,也很容易實現,多用於文本分類,比如垃圾郵件過濾。**樸素貝葉斯可以看做是貝葉斯網路的特殊情況:即該網路中無邊,各個節點都是獨立的。 **
樸素貝葉斯樸素在哪裡呢? —— 兩個假設 :
貝葉斯公式如下:
下面以一個例子來解釋樸素貝葉斯,給定數據如下:
現在給我們的問題是,如果一對男女朋友,男生想女生求婚,男生的四個特點分別是不帥,性格不好,身高矮,不上進,請你判斷一下女生是嫁還是不嫁?
這是一個典型的分類問題,轉為數學問題就是比較p(嫁|(不帥、性格不好、身高矮、不上進))與p(不嫁|(不帥、性格不好、身高矮、不上進))的概率,誰的概率大,我就能給出嫁或者不嫁的答案!這里我們聯繫到樸素貝葉斯公式:
我們需要求p(嫁|(不帥、性格不好、身高矮、不上進),這是我們不知道的,但是通過樸素貝葉斯公式可以轉化為好求的三個量,這三個變數都能通過統計的方法求得。
等等,為什麼這個成立呢?學過概率論的同學可能有感覺了,這個等式成立的條件需要特徵之間相互獨立吧!對的!這也就是為什麼樸素貝葉斯分類有樸素一詞的來源,樸素貝葉斯演算法是假設各個特徵之間相互獨立,那麼這個等式就成立了!
但是為什麼需要假設特徵之間相互獨立呢?
根據上面倆個原因,樸素貝葉斯法對條件概率分布做了條件獨立性的假設,由於這是一個較強的假設,樸素貝葉斯也由此得名!這一假設使得樸素貝葉斯法變得簡單,但有時會犧牲一定的分類准確率。
樸素貝葉斯優點 :
樸素貝葉斯缺點 :
理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因為樸素貝葉斯模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。
樸素貝葉斯模型(Naive Bayesian Model)的 樸素(Naive)的含義是"很簡單很天真" 地假設樣本特徵彼此獨立. 這個假設現實中基本上不存在, 但特徵相關性很小的實際情況還是很多的, 所以這個模型仍然能夠工作得很好。
新聞分類 GitHub: 點擊進入
【 機器學習通俗易懂系列文章 】
從貝葉斯方法談到貝葉斯網路
㈡ 樸素貝葉斯的理解
樸素貝葉斯是基於貝葉斯定理與特徵條件獨立假設的分類方法。對於給定的訓練數據集,首先基於特徵條件獨立假設學習輸入輸出的聯合概率分布,然後基於模型,對給定的輸入x,利用貝葉斯定理求出後驗概率的最大的輸出y。
具體的推導可以參考網上的博文,這里不再進行敘述。
其中P(A)稱之為先驗概率,我們希望求得的P(A|B)稱之為後驗概率。
單純的看這個公式很難理解貝葉斯的含義,這里用周志華西瓜書中例子來進行更好的理解。
假設我們手裡有了一個西瓜,它有一系列的特徵,那麼我們現在需要根據這些特徵來判斷這個是好瓜還是壞瓜呢?這也就變成了一個數理統計裡面稱為條件概率的東西,也就是在某個條件存在的基礎上,我們來求某一個事件發生的概率,比如事件B發生的條件下求事件A發生的概率,我們可以寫成P(A|B).
那我們西瓜的例子來說,事件B是什麼?當我是我們可以觀察到的一系列的這個瓜的特徵值了。假設我們用加粗的 X 來表示,因為特徵很多,加粗表示這是一個特徵向量, X = x1,x2,...,Xn 。那麼我們要求的就是基於這個條件下這個瓜是好瓜或者是壞瓜的事件的概率。就是求P("好瓜"|X)或者P("壞瓜"|X)。那這個怎麼求呢?當然是使用上面的貝葉斯公式了。
最終我們可以寫出
來比較這兩個哪個的概率大,那麼我們就認為我們的這個瓜是好瓜還是壞瓜。
既然已經有了可以求概率的公式,那我們可以著手進行計算了,首先是先驗概率P(Ci)(這里換成字母C表示類別以及下標i表示第i類,當然在西瓜的例子裡面只有兩個類別,那就是「好瓜」和「壞瓜」),這個很好計算,只用統計出「好瓜」和「壞瓜」各有多少個,然後除以全部的個數就可以得出相應的概率了。
這邊先看分母,因為在計算中我們用到的特徵數據都是一樣的,所以分母完全可以當成一個常數,也就是我們的公式可以簡化成:
P(Ci)可以容易求出,但是P(X/Ci)就很困難了。因為把這個展開後為:
理論上這個可以利用我們的數據集來進行估計的,但是現實情況是,n的值往往非常大(屬性非常多),而我們的數據集往往不能保證我們的樣本包含了屬性值的所有可能組合。那麼很多p(X|ci)我們估計得到的值就是0。然而這些樣本很可能僅僅是我們的數據集中沒包含到,即「未被觀測到」,但不代表它們現實中「出現概率為0」。
樸素貝葉斯對條件概率分布作了條件獨立性的假設,由於這是一個較強的假設,樸素貝葉斯由此得名。有了這個假設,我們就可以這樣計算P(X/Ci):
P(x1/ci)P(x2/ci)...P(xn/ci)
沒錯,就是把每個特徵獨立的拆出來寫成連乘的形式來計算這個概率。
引入連乘操作後可能導致一個問題,那就是數據量大了之後,進行多次的連乘操作可能導致結果下溢,也就是最後算出的概率為0了,所以把連乘操作改為取對數操作,即logP(X/ci),展開後把每個概率取對數後進行相加。
由於我們驗證的西瓜中有些特徵屬性可能數據集中不會出現,導致最終算出的概率為0,但現實中這種瓜是存在的,所以引入拉普拉斯平滑來進行處理。也就是計算公式是修改為:
N表示訓練集D中可能的類別樹,Ni表示第i個屬性可能的取值數
對於離散數據只需要把對應特徵的屬性個數加起來除以總數即可,而連續型數據則需要藉助概率密度函數,此處假設數據服從高斯分布,用高斯密度函數來計算連續型數據的概率。
此處用python實現西瓜書上151頁的例子,數據集是西瓜數據集3.0。
整體的思路:使用兩個全局變數來存儲好瓜和壞瓜在數據集中的索引,遍歷待分類數據的數據,拿出待分類的特徵屬性來進行概率計算,,每次計算都需要算出特徵屬性值在所有好瓜或者壞瓜上的概率,計算概率時要區分離散數據以及連續型數據,加入拉普拉斯平滑和取對數運算,最終比較各自大小,得出分類結果。
㈢ 樸素貝葉斯分類演算法預測具有屬性的人是否買電腦python
它是一種基於貝葉斯定理的分類技術,具有預測者之間的獨立性假設。簡單地說,樸素貝葉斯分類器假定類中的特定特徵的存在與任何其他特徵的存在無關。例如,水果如果是紅色的、圓的、直徑約3英寸的,那麼久可以被認為是一個蘋果。即使這些特徵彼此依賴或存在其他特徵,樸素貝葉斯分類器將考慮所有這些屬性來獨立地區分這種水果是蘋果的概率。
樸素貝葉斯模型易於建立,特別適用於非常大的數據集。雖然簡單,但樸素貝葉斯是已知的高性能甚至高度復雜的分類方法。
Bayes定理為P(C)、P(X)和P(X,C)的後驗概率p(C* x)的計算提供了一種途徑。請看下面的方程式:
機器學習演算法:樸素貝葉斯|python與r語言代碼實現
在這里,
P(C x)是給定(屬性)的類(目標)的後驗概率。
P(C)是類的先驗概率。
P(x,c)是預測給定類的概率。
P(x)是預測器的先驗概率。
例子:讓我們用一個例子來理解它。下面我有一個訓練數據集的天氣和相應的目標變數「玩」。現在,我們需要根據天氣情況來判斷玩家是否想玩。讓我們按照下面的步驟來執行它。
步驟1:將數據集轉換為頻率表
步驟二:通過發現陰暗概率=0.29和概率為0.64的概率來創建似然表。
機器學習演算法:樸素貝葉斯|python與r語言代碼實現
步驟三:使用樸素貝葉斯方程計算每個類的後驗概率。具有最高後驗概率的類是預測的結果。
問題:如果天氣晴朗,玩家會想玩,這個說法是正確的嗎?
我們可以用上面討論的方法求解它,所以P(Yes | Sunny) = P( Sunny | Yes) * P(Yes) / P (Sunny)
這里我們有P (Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P( Yes)= 9/14 = 0.64 得出, P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60,具有較高的概率。
樸素貝葉斯使用類似的方法來預測基於不同屬性的不同類別的概率。該演算法主要用於文本分類,存在多類問題。
㈣ python scikit-learn 有什麼演算法
1,前言
很久不發文章,主要是Copy別人的總感覺有些不爽,所以整理些干貨,希望相互學習吧。不啰嗦,進入主題吧,本文主要時說的為樸素貝葉斯分類演算法。與邏輯回歸,決策樹一樣,是較為廣泛使用的有監督分類演算法,簡單且易於理解(號稱十大數據挖掘演算法中最簡單的演算法)。但其在處理文本分類,郵件分類,拼寫糾錯,中文分詞,統計機器翻譯等自然語言處理范疇較為廣泛使用,或許主要得益於基於概率理論,本文主要為小編從理論理解到實踐的過程記錄。
2,公式推斷
一些貝葉斯定理預習知識:我們知道當事件A和事件B獨立時,P(AB)=P(A)(B),但如果事件不獨立,則P(AB)=P(A)P(B|A)。為兩件事件同時發生時的一般公式,即無論事件A和B是否獨立。當然也可以寫成P(AB)=P(B)P(A|B),表示若要兩件事同事發生,則需要事件B發生後,事件A也要發生。
由上可知,P(A)P(B|A)= P(B)P(A|B)
推出P(B|A)=
其中P(B)為先驗概率,P(B|A)為B的後驗概率,P(A|B)為A的後驗概率(在這里也為似然值),P(A)為A的先驗概率(在這也為歸一化常量)。
由上推導可知,其實樸素貝葉斯法就是在貝葉斯定理基礎上,加上特徵條件獨立假設,對特定輸入的X(樣本,包含N個特徵),求出後驗概率最大值時的類標簽Y(如是否為垃圾郵件),理解起來比邏輯回歸要簡單多,有木有,這也是本演算法優點之一,當然運行起來由於得益於特徵獨立假設,運行速度也更快。
8. Python代碼
# -*-coding: utf-8 -*-
importtime
fromsklearn import metrics
fromsklearn.naive_bayes import GaussianNB
fromsklearn.naive_bayes import MultinomialNB
fromsklearn.naive_bayes import BernoulliNB
fromsklearn.neighbors import KNeighborsClassifier
fromsklearn.linear_model import LogisticRegression
fromsklearn.ensemble import RandomForestClassifier
fromsklearn import tree
fromsklearn.ensemble import GradientBoostingClassifier
fromsklearn.svm import SVC
importnumpy as np
importurllib
# urlwith dataset
url ="-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
#download the file
raw_data= urllib.request.urlopen(url)
#load the CSV file as a numpy matrix
dataset= np.loadtxt(raw_data, delimiter=",")
#separate the data from the target attributes
X =dataset[:,0:7]
#X=preprocessing.MinMaxScaler().fit_transform(x)
#print(X)
y =dataset[:,8]
print(" 調用scikit的樸素貝葉斯演算法包GaussianNB ")
model= GaussianNB()
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的樸素貝葉斯演算法包MultinomialNB ")
model= MultinomialNB(alpha=1)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的樸素貝葉斯演算法包BernoulliNB ")
model= BernoulliNB(alpha=1,binarize=0.0)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的KNeighborsClassifier ")
model= KNeighborsClassifier()
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的LogisticRegression(penalty='l2')")
model= LogisticRegression(penalty='l2')
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的RandomForestClassifier(n_estimators=8) ")
model= RandomForestClassifier(n_estimators=8)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的tree.DecisionTreeClassifier()")
model= tree.DecisionTreeClassifier()
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的GradientBoostingClassifier(n_estimators=200) ")
model= GradientBoostingClassifier(n_estimators=200)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的SVC(kernel='rbf', probability=True) ")
model= SVC(kernel='rbf', probability=True)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
"""
# 預處理代碼集錦
importpandas as pd
df=pd.DataFrame(dataset)
print(df.head(3))
print(df.describe())##描述性分析
print(df.corr())##各特徵相關性分析
##計算每行每列數據的缺失值個數
defnum_missing(x):
return sum(x.isnull())
print("Missing values per column:")
print(df.apply(num_missing, axis=0)) #axis=0代表函數應用於每一列
print(" Missing values per row:")
print(df.apply(num_missing, axis=1).head()) #axis=1代表函數應用於每一行"""
㈤ Python數據分析(5)樸素貝葉斯模型
時間:2021/08/09
系統環境:Windows 10
所用工具:Jupyter NotebookPython 3.0
涉及的庫:pandas rain_test_splitGaussianNBaccuracy_score
蛋肥想法: 通過測試集數據,檢驗預測准確度,測得准確度為94.74%。
㈥ 樸素貝葉斯分類演算法的sklearn實現
1、背景
《機器學習實戰》當中,用python根據貝葉斯公式實現了基本的分類演算法。現在來看看用sklearn,如何實現。還拿之前的例子,對帖子的分類。數據如下:
補充:題目的值左邊是幾個人的評論,右邊是評論屬於侮辱類(1)、正常類(0),需要進行文本分類,且再有新的文本過來時能自動劃分至0或1。
2、分類
(1)演算法的准備
通過查看sklearn的訓練模型函數,fit(X, Y),發現只需要准備兩個參數。一個是數據的矩陣,另一個是數據的分類數組。首先就是將以上的文本轉化成矩陣。
在前一章其實已經講解過如何將文本轉化成矩陣。這里將示意的再補充下。
a.首先選取所有的單詞,形成列,也可理解為屬性。例如:
b.其次將遍歷每個文本,填滿上述列的值。文本出現過列的次,填一。沒有出現過填0。比如第一句就是:my dog has flea problems help please,可表示為:
同理所有的文本都可如此表示,所以就形成了一個數字的矩陣。
(2)beyes模型的選擇
在完成數據的准備以後,就可以直接調用sklearn的模型和函數完成模型的訓練啦。但在beyes模型的選擇的時候發現,beyes下有多個模型可選擇,所以這個會讓人糾結。接下來共同了解下這些模型:
a.高斯模型(GaussianNB)
高斯模型是對於每個屬性的值是連續的,且服從高斯分布時可使用:
比如人的身高,比如花的高度等等。當然你也可將這些數據離散化,比如按等距劃分、等頻劃分成離散的值,但可能效果都沒有直接用高斯模型來計算的好。
用法:class sklearn.naive_bayes.GaussianNB
參數:無
b.多項式模型(MultinominalNB)
如果大部分是多元離散值,則採用多項式模型要好些。多項式模型,通常就是構造參數向量,然後通過極大似然估計來尋求參數的最有值。
這里只簡單的略列一些公式,具體可查詢更多資料。從這個計算過程中可得出,這里引入啦一個平滑先驗值alpha,這個值在模型訓練的時候也會用到。通常alpha>0,可引入不在訓練集的特徵,尤其當alpha=1,成為拉普拉絲平滑。具體alpha取值對模型的影響可附件的圖。
用法:class sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None)
參數:
alpha:浮點數,就是上述說的引入平滑的值;
fit_prior:bool值,如果為Ture,則不用去學習P(y=ck),以均勻分布替代,否則則去學習P(y=ck)(不懂)
class_prior:一個數組。它指定了每個分類的先驗概率P(y=c1),P(y=c2)…..,若指定了該參數
則每個分類的先驗概率無需學習 (不懂)
c.伯努利模型(BernoulliNB)
如果特徵值為二元離散值或是稀疏的多元離散值,則可採用伯努利模型。
公式:class sklearn.naive_bayes.BernoulliNB(alpha=1.0,binarize=0.0,fit_prior=Ture,
class_prior=None)
參數:
binarize:一個浮點數或者None,如果為浮點數則以該數值為界,特徵值大於它的取1,小於的為0 。如果為None,假定原始數據已經二值化
其它參數同上。
通過以上的模型對比和分析,由於文本分析轉化後是很多二項取值的稀疏矩陣,因此選取伯努利模型效果會更佳。
補充:alpha、binarize值對模型效果的影響
㈦ python 樸素貝葉斯怎樣獲得 概率結果
樸素:特徵條件獨立 貝葉斯:基於貝葉斯定理 根據貝葉斯定理,對一個分類問題,給定樣本特徵x,樣本屬於類別y的概率是 p(y|x)=p(x|y)p(y)p(x) 在這里,x是一個特徵向量,將設x維度為M。
㈧ 第10天:NLP補充——樸素貝葉斯(Naive-Bayes)
1、引言
貝葉斯方法是一個歷史悠久,樸素貝葉斯中的樸素一詞的來源就是假設各特徵之間相互獨立。這一假設使得樸素貝葉斯演算法變得簡單,但有時會犧牲一定的分類准確率。當然有著堅實的理論基礎的方法,同時處理很多問題時直接而又高效,很多高級自然語言處理模型也可以從它演化而來。因此,學習貝葉斯方法,是研究自然語言處理問題的一個非常好的切入口。
2、貝葉斯公式
貝葉斯公式其實很簡單,但是很常用,就一行:
而我們二分類問題的最終目的就是要判斷 P(「屬於某類」|「具有某特徵」) 是否大於1/2就夠了。貝葉斯方法把計算「具有某特徵的條件下屬於某類」的概率轉換成需要計算「屬於某類的條件下具有某特徵」的概率,而後者獲取方法就簡單多了,我們只需要找到一些包含已知特徵標簽的樣本,即可進行訓練。而樣本的類別標簽都是明確的,所以貝葉斯方法在機器學習里屬於有監督學習方法。
這里再補充一下,一般『先驗概率』、『後驗概率』是相對出現的,比如 P(Y)與 P(Y|X) 是關於 Y的先驗概率與後驗概率, P(X)與 P(X|Y)是關於 X的先驗概率與後驗概率。
4、垃圾郵件識別
我們可以通過一個例子來對郵件進行分類,識別垃圾郵件和普通郵件,如果我們選擇使用樸素貝葉斯分類器,那目標就是判斷 P(「垃圾郵件」|「具有某特徵」) 是否大於1/2。現在假設我們有垃圾郵件和正常郵件各1萬封作為訓練集。需要判斷以下這個郵件是否屬於垃圾郵件:
也就是判斷概率 P(「垃圾郵件」|「我司可辦理正規發票(保真)17%增值稅發票點數優惠!」)是否大於1/2。我們不難發現:通過上述的理解,也就是將其轉換成的這個概率,計算的方法:就是寫個計數器,然後+1 +1 +1統計出所有垃圾郵件和正常郵件中出現這句話的次數啊。也就是:
於是當我們接觸到了中文NLP中,其中最為重要的技術之一:分詞!!!也就是把一整句話拆分成更細粒度的詞語來進行表示。另外,分詞之後去除標點符號、數字甚至無關成分(停用詞)是特徵預處理中的一項技術。我們觀察(「我」,「司」,「可」,「辦理」,「正規發票」,「保真」,「增值稅」,「發票」,「點數」,「優惠」),這可以理解成一個向量:向量的每一維度都表示著該特徵詞在文本中的特定位置存在。這種將特徵拆分成更小的單元,依據這些更靈活、更細粒度的特徵進行判斷的思維方式,在自然語言處理與機器學習中都是非常常見又有效的。因此貝葉斯公式就變成了:
1、樸素貝葉斯(Naive Bayes),「Naive」在何處?
加上條件獨立假設的貝葉斯方法就是樸素貝葉斯方法(Naive Bayes)。將句子(「我」,「司」,「可」,「辦理」,「正規發票」) 中的 (「我」,「司」)與(「正規發票」)調換一下順序,就變成了一個新的句子(「正規發票」,「可」,「辦理」, 「我」, 「司」)。新句子與舊句子的意思完全不同。但由於乘法交換律,樸素貝葉斯方法中算出來二者的條件概率完全一樣!計算過程如下:
其中「發票」重復了三次。
3、處理重復詞語的三種方式
(1)、多項式模型:
如果我們考慮重復詞語的情況,也就是說,重復的詞語我們視為其出現多次,直接按條件獨立假設的方式推導,則有:
統計計算 P(「詞語」|S)時也是如此。
我們掃描一下訓練集,發現「正規發票」這個詞從出現過!!! ,於是 P(「正規發票」|S)=0 …問題嚴重了,整個概率都變成0了!!!樸素貝葉斯方法面對一堆0,很凄慘地失效了…更殘酷的是這種情況其實很常見,因為哪怕訓練集再大,也可能有覆蓋不到的詞語。本質上還是樣本數量太少,不滿足大數定律,計算出來的概率失真 *。為了解決這樣的問題,一種分析思路就是直接不考慮這樣的詞語,但這種方法就相當於默認給P(「正規發票」|S)賦值為1。其實效果不太好,大量的統計信息給浪費掉了。我們進一步分析,既然可以默認賦值為1,為什麼不能默認賦值為一個很小的數?這就是平滑技術的基本思路,依舊保持著一貫的作風,朴實/土但是直接而有效。對於伯努利模型,P(「正規發票」|S)的一種平滑演算法是:
接下來的核心問題就是訓練出一個靠譜的分類器。首先需要有打好標簽的文本。這個好找,豆瓣影評上就有大量網友對之前電影的評價,並且對電影進行1星到5星的評價。我們可以認為3星以上的評論都是好評,3星以下的評論都是差評。這樣就分別得到了好評差評兩類的語料樣本。剩下就可以用樸素貝葉斯方法進行訓練了。基本思路如下:
但是由於自然語言的特點,在提取特徵的過程當中,有一些tricks需要注意:
當然經過以上的處理,情感分析還是會有一部分誤判。這里涉及到許多問題,都是情感分析的難點:
(2)、拼寫糾錯
拼寫糾錯本質上也是一個分類問題。但按照錯誤類型不同,又分為兩種情況:
真詞錯誤復雜一些,我們將在接下來的文章中進行探討。而對於非詞錯誤,就可以直接採用貝葉斯方法,其基本思路如下:
訓練樣本1:該場景下的正常用詞語料庫,用於計算 P(候選詞i)。
訓練樣本2:該場景下錯誤詞與正確詞對應關系的語料庫,用於計算 P(錯誤詞|候選詞i)
當然,樸素貝葉斯也是有缺陷的。比如我們知道樸素貝葉斯的局限性來源於其條件獨立假設,它將文本看成是詞袋子模型,不考慮詞語之間的順序信息,例如:樸素貝葉斯會把「武松打死了老虎」與「老虎打死了武松」認作是一個意思。那麼有沒有一種方法提高其對詞語順序的識別能力呢?當然有,就是這里要提到的N-gram語言模型。接下來詳細給大家介紹N-gram語言模型。
1、從假設性獨立到聯合概率鏈規則
與我們之前我們垃圾郵件識別中的條件獨立假設是一樣的:
4、N-gram實際應用舉例
(1)、詞性標注
詞性標注是一個典型的多分類問題。常見的詞性包括名詞、動詞、形容詞、副詞等。而一個詞可能屬於多種詞性。如「愛」,可能是動詞,可能是形容詞,也可能是名詞。但是一般來說,「愛」作為動詞還是比較常見的。所以統一給「愛」分配為動詞准確率也還足夠高。這種最簡單粗暴的思想非常好實現,如果准確率要求不高則也比較常用。它只需要基於詞性標注語料庫做一個統計就夠了,連貝葉斯方法、最大似然法都不要用。詞性標注語料庫一般是由專業人員搜集好了的,長下面這個樣子。其中斜線後面的字母表示一種詞性,詞性越多說明語料庫分得越細;需要比較以下各概率的大小,選擇概率最大的詞性即可:
將公式進行以下改造,比較各概率的大小,選擇概率最大的詞性:
N-gram分類器是結合貝葉斯方法和語言模型的分類器。這里用 Y1,Y2分別表示這垃圾郵件和正常郵件,用 X表示被判斷的郵件的句子。根據貝葉斯公式有:
比較這些概率的大小,找出使得 P(Yi|X)最大的 Yi即可得到 X 所屬的分類(分詞方案)了。Yi作為分詞方案,其實就是個詞串,比如(「我司」,「可」,「辦理」,「正規發票」)(「我」,「司可辦」,「理正規」,「發票」),也就是一個向量了。而上面貝葉斯公式中 P(X|Yi)項的意思就是在分類方案 Yi的前提下,其對應句子為 X的概率。而無論分詞方案是(「我司」,「可」,「辦理」,「正規發票」)還是(「我」,「司可辦」,「理正規」,「發票」),或者其他什麼方案,其對應的句子都是「我司可辦理正規發票」。也就是說任意假想的一種分詞方式之下生成的句子總是唯一的(只需把分詞之間的分界符號扔掉剩下的內容都一樣)。於是可以將 P(X|Yi)看作是恆等於1的。這樣貝葉斯公式又進一步化簡成為:
也就是說我們
㈨ 數據挖掘十大經典演算法(1)——樸素貝葉斯(Naive Bayes)
在此推出一個演算法系列的科普文章。我們大家在平時埋頭工程類工作之餘,也可以抽身對一些常見演算法進行了解,這不僅可以幫助我們拓寬思路,從另一個維度加深對計算機技術領域的理解,做到觸類旁通,同時也可以讓我們搞清楚一些既熟悉又陌生的領域——比如數據挖掘、大數據、機器學習——的基本原理,揭開它們的神秘面紗,了解到其實很多看似高深的領域,其實背後依據的基礎和原理也並不復雜。而且,掌握各類演算法的特點、優劣和適用場景,是真正從事數據挖掘工作的重中之重。只有熟悉演算法,才可能對紛繁復雜的現實問題合理建模,達到最佳預期效果。
本系列文章的目的是力求用最干練而生動的講述方式,為大家講解由國際權威的學術組織the IEEE International Conference on Data Mining (ICDM) 於2006年12月評選出的數據挖掘領域的十大經典演算法。它們包括:
本文作為本系列的第一篇,在介紹具體演算法之前,先簡單為大家鋪墊幾個數據挖掘領域的常見概念:
在數據挖掘領域,按照演算法本身的行為模式和使用目的,主要可以分為分類(classification),聚類(clustering)和回歸(regression)幾種,其中:
打幾個不恰當的比方 :
另外,還有一個經常有人問起的問題,就是 數據挖掘 和 機器學習 這兩個概念的區別,這里一句話闡明我自己的認識:機器學習是基礎,數據挖掘是應用。機器學習研製出各種各樣的演算法,數據挖掘根據應用場景把這些演算法合理運用起來,目的是達到最好的挖掘效果。
當然,以上的簡單總結一定不夠准確和嚴謹,更多的是為了方便大家理解打的比方。如果大家有更精當的理解,歡迎補充和交流。
好了,鋪墊了這么多,現在終於進入正題!
作為本系列入門的第一篇,先為大家介紹一個容易理解又很有趣的演算法—— 樸素貝葉斯 。
先站好隊,樸素貝葉斯是一個典型的 有監督的分類演算法 。
光從名字也可以想到,要想了解樸素貝葉斯,先要從 貝葉斯定理 說起。
貝葉斯定理是我們高中時代學過的一條概率學基礎定理,它描述了條件概率的計算方式。不要怕已經把這些知識還給了體育老師,相信你一看公式就能想起來。
P(A|B)表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率。其基本求解公式為:
其中,P(AB)表示A和B同時發生的概率,P(B)標識B事件本身的概率。
貝葉斯定理之所以有用,是因為我們在生活中經常遇到這種情況:我們可以很容易直接得出P(A|B),P(B|A)則很難直接得出,但我們更關心P(B|A)。
而貝葉斯定理就為我們打通從P(A|B)獲得P(B|A)的道路。
下面不加證明地直接給出貝葉斯定理:
有了貝葉斯定理這個基礎,下面來看看樸素貝葉斯演算法的基本思路。
你看,其思想就是這么的樸素。那麼,屬於每個分類的概率該怎麼計算呢?下面我們先祭出形式化語言!
那麼現在的關鍵就是如何計算第3步中的各個條件概率。我們可以這么做:
因為分母對於所有類別為常數,因為我們只要將分子最大化皆可。又因為各特徵屬性是條件獨立的,所以有:
如果你也跟我一樣,對形式化語言有嚴重生理反應,不要怕,直接跳過前面這一坨,我們通過一個鮮活的例子,用人類的語言再解釋一遍這個過程。
某個醫院早上收了六個門診病人,如下表。
現在又來了第七個病人,是一個打噴嚏的建築工人。請問他最有可能患有何種疾病?
本質上,這就是一個典型的分類問題, 症狀 和 職業 是特徵屬性, 疾病種類 是目標類別
根據 貝葉斯定理
可得
假定"打噴嚏"和"建築工人"這兩個特徵是獨立的,因此,上面的等式就變成了
這是可以計算的。
因此,這個打噴嚏的建築工人,有66%的概率是得了感冒。同理,可以計算這個病人患上過敏或腦震盪的概率。比較這幾個概率,就可以知道他最可能得什麼病。
接下來,我們再舉一個樸素貝葉斯演算法在實際中經常被使用的場景的例子—— 文本分類器 ,通常會用來識別垃圾郵件。
首先,我們可以把一封郵件的內容抽象為由若干關鍵片語成的集合,這樣是否包含每種關鍵詞就成了一封郵件的特徵值,而目標類別就是 屬於垃圾郵件 或 不屬於垃圾郵件
假設每個關鍵詞在一封郵件里出現與否的概率相互之間是獨立的,那麼只要我們有若干已經標記為垃圾郵件和非垃圾郵件的樣本作為訓練集,那麼就可以得出,在全部垃圾郵件(記為Trash)出現某個關鍵詞Wi的概率,即 P(Wi|Trash)
而我們最重要回答的問題是,給定一封郵件內容M,它屬於垃圾郵件的概率是多大,即 P(Trash|M)
根據貝葉斯定理,有
我們先來看分子:
P(M|Trash) 可以理解為在垃圾郵件這個范疇中遇見郵件M的概率,而一封郵件M是由若干單詞Wi獨立匯聚組成的,只要我們所掌握的單詞樣本足夠多,因此就可以得到
這些值我們之前已經可以得到了。
再來看分子里的另一部分 P(Trash) ,這個值也就是垃圾郵件的總體概率,這個值顯然很容易得到,用訓練集中垃圾郵件數除以總數即可。
而對於分母來說,我們雖然也可以去計算它,但實際上已經沒有必要了,因為我們要比較的 P(Trash|M) 和 P(non-Trash|M) 的分母都是一樣的,因此只需要比較分子大小即可。
這樣一來,我們就可以通過簡單的計算,比較郵件M屬於垃圾還是非垃圾二者誰的概率更大了。
樸素貝葉斯的英文叫做 Naive Bayes ,直譯過來其實是 天真的貝葉斯 ,那麼他到底天真在哪了呢?
這主要是因為樸素貝葉斯的基本假設是所有特徵值之間都是相互獨立的,這才使得概率直接相乘這種簡單計算方式得以實現。然而在現實生活中,各個特徵值之間往往存在一些關聯,比如上面的例子,一篇文章中不同單詞之間一定是有關聯的,比如有些詞總是容易同時出現。
因此,在經典樸素貝葉斯的基礎上,還有更為靈活的建模方式—— 貝葉斯網路(Bayesian Belief Networks, BBN) ,可以單獨指定特徵值之間的是否獨立。這里就不展開了,有興趣的同學們可以做進一步了解。
最後我們來對這個經典演算法做個點評:
優點:
缺點:
好了,對於 樸素貝葉斯 的介紹就到這里,不知道各位看完之後是否會對數據挖掘這個領域產生了一點興趣了呢?