(数据科学学习手札30)朴素贝叶斯分类器的原理详解Python与R实现
一、簡(jiǎn)介
要介紹樸素貝葉斯(naive bayes)分類器,就不得不先介紹貝葉斯決策論的相關(guān)理論:
貝葉斯決策論(bayesian decision theory)是概率框架下實(shí)施決策的基本方法。對(duì)分類任務(wù)來(lái)說(shuō),在所有相關(guān)概率都已知的理想情況下,貝葉斯決策論考慮如何基于這些概率和誤判損失來(lái)選擇最優(yōu)的類別標(biāo)記結(jié)果。
二、貝葉斯決策論的基本原理
我們以多分類任務(wù)為例:
假設(shè)有N種可能的類別標(biāo)記,即y={c1,c2,...,cN},λij是將一個(gè)真實(shí)類別為cj的樣本誤分類為ci的損失,基于后驗(yàn)概率P(ci|cj)可獲得將樣本x分類為ci所產(chǎn)生的期望損失(expected loss),即在樣本x上的“條件風(fēng)險(xiǎn)”(conditional risk)
我們的目的是尋得一個(gè)判定準(zhǔn)則h:X-->Y,以最小化總體風(fēng)險(xiǎn):
對(duì)每一個(gè)樣本x,若h能最小化條件風(fēng)險(xiǎn)
則總體風(fēng)險(xiǎn)R(h)也將被最小化,這就產(chǎn)生了貝葉斯判定準(zhǔn)則(Bayes decision rule):為最小化總體風(fēng)險(xiǎn),只需要在每個(gè)樣本上選擇能使條件風(fēng)險(xiǎn)R(c|x)最小的類別標(biāo)記,即
h*被稱作貝葉斯最優(yōu)分類器(Bayes optimal classifier),與之對(duì)應(yīng)的總體風(fēng)險(xiǎn)R(h*)稱為貝葉斯風(fēng)險(xiǎn)(Bayes risk)。1-R(h*)反映了分類器所能達(dá)到的最佳性能,即通過(guò)機(jī)器學(xué)習(xí)所能達(dá)到的模型精度的理論上限。
若目標(biāo)是最小化分類錯(cuò)誤率,則誤判損失λij可寫(xiě)作
此時(shí)的條件風(fēng)險(xiǎn)
于是,最小化分類錯(cuò)誤率的貝葉斯最優(yōu)分類器為:
即對(duì)每個(gè)樣本x,選擇使得后驗(yàn)概率P(c|x)最大的類別標(biāo)記,所以利用貝葉斯判定準(zhǔn)則來(lái)最小化決策風(fēng)險(xiǎn)的首要工作是求得后驗(yàn)概率P(c|x),這在現(xiàn)實(shí)任務(wù)中通常難以直接獲得,而機(jī)器學(xué)習(xí)所要實(shí)現(xiàn)的是基于有限的訓(xùn)練樣本集來(lái)盡可能準(zhǔn)確地估計(jì)后驗(yàn)概率,主要有兩種策略:
1、“判定式模型”(discriminative model)
給定x,通過(guò)直接對(duì)P(c|x)建模來(lái)預(yù)測(cè)c;
2、“生成式模型”(generative model)
對(duì)聯(lián)合概率分布P(x,c)建模,然后再由此獲得P(c|x);
貝葉斯分類器便是一種生成式模型,對(duì)生成式模型,考慮條件概率公式:
基于貝葉斯定理,P(c|x)可寫(xiě)為:
其中,P(c)是類先驗(yàn)概率(prior);P(x|c)是樣本x對(duì)應(yīng)類別c的類條件概率(class-condtional probability),或稱為“似然”(likelihood);P(x)是用于歸一化的“證據(jù)”(evidence)因子。對(duì)給定樣本x,證據(jù)因子P(x)與類別無(wú)關(guān),因此估計(jì)P(c|x)的問(wèn)題就轉(zhuǎn)化為如何基于訓(xùn)練數(shù)據(jù)D來(lái)估計(jì)P(c)和似然P(x|c),類先驗(yàn)概率P(c)表達(dá)了樣本空間中各類樣本所占的比例,根據(jù)大數(shù)定律,當(dāng)樣本數(shù)據(jù)規(guī)模足夠大時(shí),就可以用樣本數(shù)據(jù)的各類別出現(xiàn)的頻率來(lái)估計(jì)P(c)。
上述過(guò)程雖然看起來(lái)很簡(jiǎn)單,但是應(yīng)用到現(xiàn)實(shí)任務(wù)中就會(huì)遇到很多局限,對(duì)類條件概率P(x|c),由于它涉及所有關(guān)于x的屬性的聯(lián)合概率,直接根據(jù)樣本出現(xiàn)的頻率來(lái)估計(jì)將會(huì)遇到困難,因?yàn)閷?shí)際任務(wù)中的訓(xùn)練樣本集是有限的,而要估計(jì)聯(lián)合分布就需要獲得各種可能狀態(tài)的樣本,這顯然無(wú)法辦到,因?yàn)樽宰兞扛鱾€(gè)維度上的組合方式是指數(shù)式增長(zhǎng)的,遠(yuǎn)遠(yuǎn)大于樣本數(shù)量,導(dǎo)致很多可能的樣本取值從未在訓(xùn)練集中出現(xiàn)過(guò),所以直接用頻率來(lái)估計(jì)P(x|c)不可行,因?yàn)檫@樣會(huì)直接把未出現(xiàn)過(guò)與概率為0畫(huà)上等號(hào)。
為了克服貝葉斯分類器中的局限,我們基于更寬松的理論條件構(gòu)建出樸素貝葉斯分類器;
?
三、樸素貝葉斯分類器
為了避開(kāi)貝葉斯公式的訓(xùn)練障礙,樸素貝葉斯分類器采用了“屬性條件獨(dú)立性假設(shè)”(attribute conditional independence assumption),即對(duì)已知類別,假設(shè)所有屬性相互獨(dú)立,即每個(gè)屬性各自獨(dú)立地對(duì)分類結(jié)果產(chǎn)生影響,則我們前面提到的貝葉斯公式:
其中d表示屬性的個(gè)數(shù),xi表示x在第i個(gè)屬性上的取值,又因?yàn)镻(x)由樣本集唯一確定,即對(duì)所有類別P(x)都相同,于是樸素貝葉斯分類器的表達(dá)式:
樸素貝葉斯分類器的訓(xùn)練過(guò)程就是基于訓(xùn)練集D來(lái)估計(jì)類先驗(yàn)概率P(c),并為每個(gè)屬性估計(jì)條件概率P(xi|c),用Dc表示訓(xùn)練集D中第c類樣本組成的集合,若有充足的獨(dú)立同分布樣本,則可以容易地估計(jì)出類先驗(yàn)概率:
對(duì)離散屬性而言,令Dc,xi表示Dc中在第i個(gè)屬性上取值為xi的樣本組成的集合,則條件概率P(xi|c)為:
對(duì)連續(xù)型屬性,假定:
其中μc,i,σ2c,i分別為第c類樣本在屬性i上的均值與方差(這里要假設(shè)對(duì)應(yīng)的連續(xù)型變量服從正態(tài)分布),則:
下面以一個(gè)簡(jiǎn)單的例子來(lái)詳細(xì)說(shuō)明這個(gè)過(guò)程:
對(duì)給定的訓(xùn)練集D,以類別c{c=1/0}作為分類目標(biāo),對(duì)所有在訓(xùn)練集出現(xiàn)過(guò)的屬性xi屬于X,依此進(jìn)行下列計(jì)算(估計(jì)):
1、類先驗(yàn)概率P(c)
2、各屬性的條件概率
以x1為例:
?
若xi為連續(xù)型變量,則利用不同類別中該屬性的樣本均值與樣本方差來(lái)估計(jì)真實(shí)的不同類別中該屬性的正態(tài)分布對(duì)應(yīng)的參數(shù),求出對(duì)應(yīng)的密度函數(shù);計(jì)算出所有屬性對(duì)所有可能的類別的條件概率;
3、對(duì)樣本進(jìn)行分類
針對(duì)我們所舉的例子,有如下兩種情況:
取其中結(jié)果較大者對(duì)應(yīng)類別作為最終對(duì)樣本的分類結(jié)果。
修正情況:
有些時(shí)候,若某個(gè)屬性值在訓(xùn)練集中沒(méi)有與某個(gè)類同時(shí)出現(xiàn)過(guò),則直接使用上述過(guò)程估計(jì)后驗(yàn)概率會(huì)將整個(gè)結(jié)果拖累至0,因此這種情況下我們進(jìn)行如下處理:
平滑(smoothing)
為了避免上面描述的,樣本的其他屬性攜帶的信息被訓(xùn)練集中未出現(xiàn)過(guò)的屬性抹去,則在估計(jì)概率值的時(shí)候要進(jìn)行“平滑”處理,常用“拉普拉斯修正”(Laplacian correction),具體操作如下:
我們用N表示訓(xùn)練集D中可能的類別數(shù),Ni表示第i個(gè)屬性可能的取值個(gè)數(shù),則:
這種修正方法避免了因訓(xùn)練集樣本不充分而導(dǎo)致概率估值為0的問(wèn)題,并且在訓(xùn)練集變大時(shí),修正過(guò)程所引入的先驗(yàn)(prior)的影響也會(huì)逐漸變得可以忽略,使得估值漸漸趨向于實(shí)際概率值。
現(xiàn)實(shí)中的使用方式:
1、任務(wù)對(duì)預(yù)測(cè)速度要求較高時(shí)
可以事先將樣本中所有先驗(yàn)概率和類條件概率計(jì)算好并儲(chǔ)存起來(lái),等到需要預(yù)測(cè)新樣本類別時(shí)查表計(jì)算對(duì)應(yīng)的后驗(yàn)概率即可;
2、任務(wù)數(shù)據(jù)更替頻繁時(shí)
可采用“懶惰學(xué)習(xí)”(lazy learning)的方式,先不進(jìn)行任何事先訓(xùn)練,僅在有預(yù)測(cè)需求時(shí)才根據(jù)當(dāng)前樣本進(jìn)行概率估計(jì)與預(yù)測(cè);
3、數(shù)據(jù)不斷增加時(shí)
若數(shù)據(jù)不斷增加,則可在現(xiàn)有概率估值的基礎(chǔ)上,僅對(duì)新增樣本的屬性值所涉及的概率估值進(jìn)行修正即可實(shí)現(xiàn)增量學(xué)習(xí)(在線學(xué)習(xí));
?
四、Python實(shí)現(xiàn)
我們使用sklearn.naive_bayes中的GaussianNB()來(lái)進(jìn)行樸素貝葉斯分類,這種方法基于的就是我們前面提到的假設(shè)非類別型的連續(xù)數(shù)值變量服從正態(tài)分布即高斯分布,其參數(shù)非常簡(jiǎn)單(因?yàn)檎麄€(gè)建模過(guò)程沒(méi)有什么需要調(diào)參數(shù)的地方)如下:
priors:數(shù)組型,控制針對(duì)各類別比例的先驗(yàn)分布,若本參數(shù)有輸入,則接下來(lái)的先驗(yàn)分布將不再基于樣本集進(jìn)行計(jì)算;
函數(shù)輸出項(xiàng):
class_prior_:輸出基于樣本集計(jì)算出的各類別的先驗(yàn)分布
class_count_:輸出訓(xùn)練集中各個(gè)類別的樣本數(shù)量
theta_:輸出計(jì)算出的對(duì)應(yīng)各連續(xù)型特征各類別的樣本均值
sigma_:輸出計(jì)算出的對(duì)應(yīng)各連續(xù)型特征各類別的樣本方差
下面以我們喜聞樂(lè)見(jiàn)的鳶尾花數(shù)據(jù)進(jìn)行演示:
from sklearn.naive_bayes import GaussianNB from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix'''載入數(shù)據(jù)''' X,y = datasets.load_iris(return_X_y=True)'''分割訓(xùn)練集與驗(yàn)證集,這里采用分層抽樣的方法控制類別的先驗(yàn)概率''' X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,stratify=y)'''初始化高斯樸素貝葉斯分類器''' clf = GaussianNB()'''訓(xùn)練分類器''' clf = clf.fit(X_train,y_train)'''打印分類器在驗(yàn)證集上的混淆矩陣''' print('混淆矩陣:') print(confusion_matrix(y_test,clf.predict(X_test)))'''打印測(cè)試集上的正確率''' print('測(cè)試集正確率:'+str(clf.score(X_test,y_test)))'''打印分類器訓(xùn)練后的各返回項(xiàng)''' print('類別的先驗(yàn)分布:',clf.class_prior_)print('各類別樣本數(shù)量:',clf.class_count_)print('各類別對(duì)應(yīng)各連續(xù)屬性的正態(tài)分布的均值:','\n',clf.theta_)print('各類別對(duì)應(yīng)各連續(xù)屬性的正態(tài)分布的方差:','\n',clf.sigma_)運(yùn)行結(jié)果:
?
?
五、R實(shí)現(xiàn)
在R中有很多包支持樸素貝葉斯分類(事實(shí)上自己寫(xiě)自編函數(shù)實(shí)現(xiàn)也不是件難事),這里選用比較有代表性的e1071包中的naiveBayes()來(lái)完成相應(yīng)功能,其主要參數(shù)如下:
formula:這時(shí)R中常見(jiàn)的一種格式,類別標(biāo)簽~自變量 的輸入形式
data:指定訓(xùn)練數(shù)據(jù)所在的數(shù)據(jù)框
laplace:控制前面提到的平滑處理中的拉普拉斯修正,默認(rèn)值為0,即不進(jìn)行平滑,若需要進(jìn)行拉普拉斯修正,這里建議值為1
下面是一個(gè)簡(jiǎn)單的演示:
> rm(list=ls()) > library(e1071) > data(iris) > > #留出法分割訓(xùn)練集與驗(yàn)證集 > sam <- sample(1:dim(iris)[1],dim(iris)[1]*0.8) > X_train <- iris[sam,1:4] > y_train <- iris[sam,5] > X_test <- iris[-sam,1:4] > y_test <- iris[-sam,5] > train <- cbind(y_train,X_train) > > #利用訓(xùn)練集訓(xùn)練樸素貝葉斯分類器 > clf <- naiveBayes(y_train~.,data=train) > > #混淆矩陣 > table(y_test,predict(clf,X_test))y_test setosa versicolor virginicasetosa 9 0 0versicolor 0 7 1virginica 0 0 13 > > #測(cè)試正確率 > sum(diag(prop.table(table(y_test,predict(clf,X_test))))) [1] 0.9666667?
以上就是關(guān)于樸素貝葉斯的基本內(nèi)容,其實(shí)樸素貝葉斯方法運(yùn)用最多的是文本分類問(wèn)題,接下來(lái)的幾篇博客我將圍繞樸素貝葉斯的文本分類方法進(jìn)行詳細(xì)介紹(包含網(wǎng)絡(luò)文本數(shù)據(jù)采集的過(guò)程)
?
轉(zhuǎn)載于:https://www.cnblogs.com/feffery/p/8954959.html
總結(jié)
以上是生活随笔為你收集整理的(数据科学学习手札30)朴素贝叶斯分类器的原理详解Python与R实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 国内常用镜像网站
- 下一篇: Mahout 系列之--canopy 算