1,前言
公司主營(yíng)業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出代縣免費(fèi)做網(wǎng)站回饋大家。
很久不發(fā)文章,主要是Copy別人的總感覺(jué)有些不爽,所以整理些干貨,希望相互學(xué)習(xí)吧。不啰嗦,進(jìn)入主題吧,本文主要時(shí)說(shuō)的為樸素貝葉斯分類算法。與邏輯回歸,決策樹(shù)一樣,是較為廣泛使用的有監(jiān)督分類算法,簡(jiǎn)單且易于理解(號(hào)稱十大數(shù)據(jù)挖掘算法中最簡(jiǎn)單的算法)。但其在處理文本分類,郵件分類,拼寫(xiě)糾錯(cuò),中文分詞,統(tǒng)計(jì)機(jī)器翻譯等自然語(yǔ)言處理范疇較為廣泛使用,或許主要得益于基于概率理論,本文主要為小編從理論理解到實(shí)踐的過(guò)程記錄。
2,公式推斷
一些貝葉斯定理預(yù)習(xí)知識(shí):我們知道當(dāng)事件A和事件B獨(dú)立時(shí),P(AB)=P(A)(B),但如果事件不獨(dú)立,則P(AB)=P(A)P(B|A)。為兩件事件同時(shí)發(fā)生時(shí)的一般公式,即無(wú)論事件A和B是否獨(dú)立。當(dāng)然也可以寫(xiě)成P(AB)=P(B)P(A|B),表示若要兩件事同事發(fā)生,則需要事件B發(fā)生后,事件A也要發(fā)生。
由上可知,P(A)P(B|A)= P(B)P(A|B)
推出P(B|A)=
其中P(B)為先驗(yàn)概率,P(B|A)為B的后驗(yàn)概率,P(A|B)為A的后驗(yàn)概率(在這里也為似然值),P(A)為A的先驗(yàn)概率(在這也為歸一化常量)。
由上推導(dǎo)可知,其實(shí)樸素貝葉斯法就是在貝葉斯定理基礎(chǔ)上,加上特征條件獨(dú)立假設(shè),對(duì)特定輸入的X(樣本,包含N個(gè)特征),求出后驗(yàn)概率最大值時(shí)的類標(biāo)簽Y(如是否為垃圾郵件),理解起來(lái)比邏輯回歸要簡(jiǎn)單多,有木有,這也是本算法優(yōu)點(diǎn)之一,當(dāng)然運(yùn)行起來(lái)由于得益于特征獨(dú)立假設(shè),運(yùn)行速度也更快。
. 參數(shù)估計(jì)
3,參數(shù)估計(jì)
由上面推斷出的公式,我們知道其實(shí)樸素貝葉斯方法的學(xué)習(xí)就是對(duì)概率P(Y=ck)和P(X(j)=x(j)|Y=ck)的估計(jì)。我們可以用極大似然估計(jì)法估計(jì)上述先驗(yàn)概率和條件概率。
其中I(x)為指示函數(shù),若括號(hào)內(nèi)成立,則計(jì)1,否則為0。李航的課本直接給出了用極大似然(MLE)估計(jì)求出的結(jié)果,并沒(méi)給推導(dǎo)過(guò)程,
我們知道,貝葉斯較為常見(jiàn)的問(wèn)題為0概率問(wèn)題。為此,需要平滑處理,主要使用拉普拉斯平滑,如下所示:
K是類的個(gè)數(shù),Sj是第j維特征的最大取值。實(shí)際上平滑因子λ=0即為最大似然估計(jì),這時(shí)會(huì)出現(xiàn)提到的0概率問(wèn)題;而λ=1則避免了0概率問(wèn)題,這種方法被稱為拉普拉斯平滑。
4,算法流程
5,樸素貝葉斯算法優(yōu)缺點(diǎn)
優(yōu)點(diǎn):樸素貝葉斯模型發(fā)源于古典數(shù)學(xué)理論,有著堅(jiān)實(shí)的數(shù)學(xué)基礎(chǔ),以及穩(wěn)定的分類效率
需調(diào)參較少,簡(jiǎn)單高效,尤其是在文本分類/垃圾文本過(guò)濾/情感判別等自然語(yǔ)言處理有廣泛應(yīng)用。
在樣本量較少情況下,也能獲得較好效果,計(jì)算復(fù)雜度較小,即使在多分類問(wèn)題。
無(wú)論是類別類輸入還是數(shù)值型輸入(默認(rèn)符合正態(tài)分布)都有相應(yīng)模型可以運(yùn)用。
缺點(diǎn):0概率問(wèn)題,需要平滑處理,通常為拉普拉斯平滑,但加一平滑不一定為效果最好,
樸素貝葉斯有分布獨(dú)立的假設(shè)前提,生活中較少完全獨(dú)立,在屬性個(gè)數(shù)比較多或者屬性之間相關(guān)性較大時(shí),NBC模型的分類效率比不上決策樹(shù)模型。而在屬性相關(guān)性較小時(shí),NBC模型的性能最為良好。
模型注意點(diǎn):
1, 大家也知道,很多特征是連續(xù)數(shù)值型的,一般選擇使用樸素貝葉斯高斯模型。
2, 為避免0概率事件,記得平滑,簡(jiǎn)單一點(diǎn)可以用『拉普拉斯平滑』。先處理處理特征,把相關(guān)特征去掉,
3, 樸素貝葉斯分類器一般可調(diào)參數(shù)比較少,需集中精力進(jìn)行數(shù)據(jù)的預(yù)處理等特征工程工作。
6,Scikit-learn三大樸素貝葉斯模型
Scikit-learn里面有3種不同類型的樸素貝葉斯(:
1, 高斯分布型模型:用于classification問(wèn)題,假定屬性/特征是服從正態(tài)分布的,一般用在數(shù)值型特征。,
2, 多項(xiàng)式型模型:用于離散值模型里。比如文本分類問(wèn)題里面我們提到過(guò),我們不光看詞語(yǔ)是否在文本中出現(xiàn),也得看出現(xiàn)的次數(shù)。如果總詞數(shù)為n,出現(xiàn)詞數(shù)為m的話,說(shuō)起來(lái)有點(diǎn)像擲骰子n次出現(xiàn)m次這個(gè)詞的場(chǎng)景。
3, 伯努利模型:這種情況下,就如提到的bag ofwords處理方式一樣,最后得到的特征只有0(沒(méi)出現(xiàn))和1(出現(xiàn)過(guò))。
7. Scikit-learn算法實(shí)踐
小編通過(guò)實(shí)現(xiàn)樸素貝葉斯三種模型以及主要分類算法,對(duì)比發(fā)現(xiàn)跟SVM,隨機(jī)森林,融合算法相比,貝葉斯差距明顯,但其時(shí)間消耗要遠(yuǎn)低于上述算法,以下為主要算法主要評(píng)估指標(biāo))。
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("\n調(diào)用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("\n調(diào)用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("\n調(diào)用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("\n調(diào)用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("\n調(diào)用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("\n調(diào)用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("\n調(diào)用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("\n調(diào)用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("\n調(diào)用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))
"""
# 預(yù)處理代碼集錦
importpandas as pd
df=pd.DataFrame(dataset)
print(df.head(3))
print(df.describe())##描述性分析
print(df.corr())##各特征相關(guān)性分析
##計(jì)算每行每列數(shù)據(jù)的缺失值個(gè)數(shù)
defnum_missing(x):
return sum(x.isnull())
print("Missing values per column:")
print(df.apply(num_missing, axis=0)) #axis=0代表函數(shù)應(yīng)用于每一列
print("\nMissing values per row:")
print(df.apply(num_missing, axis=1).head()) #axis=1代表函數(shù)應(yīng)用于每一行"""
mle的意思是最大似然估計(jì),英文為maximum likelihood estimation,簡(jiǎn)稱MLE。最大似然估計(jì)一種重要而普遍的求估計(jì)量的方法。最大似然法明確地使用概率模型,其目標(biāo)是尋找能夠以較高概率產(chǎn)生觀察數(shù)據(jù)的系統(tǒng)發(fā)生樹(shù)。最大似然法是一類完全基于統(tǒng)計(jì)的系統(tǒng)發(fā)生樹(shù)重建方法的代表。
最大似然估計(jì)是一種統(tǒng)計(jì)方法,它用來(lái)求一個(gè)樣本集的相關(guān)概率密度函數(shù)的參數(shù)。這個(gè)方法最早是遺傳學(xué)家以及統(tǒng)計(jì)學(xué)家羅納德·費(fèi)雪爵士在1912年至1922年間開(kāi)始使用的?!八迫弧笔菍?duì)likelihood的一種較為貼近文言文的翻譯,“似然”用現(xiàn)代的中文來(lái)說(shuō)即“可能性”。故而,若稱之為“最大可能性估計(jì)”則更加通俗易懂。
最大后驗(yàn)概率MAP
統(tǒng)計(jì)學(xué)中,MAP為最大后驗(yàn)概率(Maximum a posteriori)的縮寫(xiě)。估計(jì)方法根據(jù)經(jīng)驗(yàn)數(shù)據(jù)獲得對(duì)難以觀察的量的點(diǎn)估計(jì)。它與最大似然估計(jì)中的Fisher方法有密切關(guān)系,但是它使用了一個(gè)增大的優(yōu)化目標(biāo),這種方法將被估計(jì)量的先驗(yàn)分布融合到其中。所以最大后驗(yàn)估計(jì)可以看作是規(guī)則化的最大似然估計(jì)。
matlab中有函數(shù)mle(最大似然估計(jì))可以估計(jì)常用分布的參數(shù)
下面是一段測(cè)試程序,用geornd生成服從幾何分布的一組數(shù)據(jù)
p = 0.01;
x = geornd(p,[1 100]);
[PEstimate,PCI] = mle(x,'distribution','geometric')
PEstimate 是估計(jì)出來(lái)的參數(shù)值
PCI 是置信度為95%區(qū)間
你把你的數(shù)據(jù)導(dǎo)進(jìn)x里就可以了得到估計(jì)的參數(shù)了
極大似然估計(jì)(Maximum Likelihood Estimation,MLE),也稱最大似然估計(jì)。統(tǒng)計(jì)學(xué)中,極大似然估計(jì)是重要的參數(shù)估計(jì)方法;機(jī)器學(xué)習(xí)領(lǐng)域,也經(jīng)??吹街苯邮褂脴O大似然估計(jì)以及使用極大似然思想的方法。
在這篇筆記里,主要涉及極大似然的思想和非參數(shù)極大似然估計(jì)NPMLE。
在參數(shù)估計(jì)[1]任務(wù)中,極大似然估計(jì)在 給定樣本 且 已知概率分布(密度) 條件下,估計(jì)分布參數(shù)的重要方法。
(在機(jī)器學(xué)習(xí)中,會(huì)用到未知概率分布(密度)的極大似然估計(jì),見(jiàn)下文)
極大似然估計(jì)的核心思想,就是估計(jì)出使樣本出現(xiàn)概率最大的參數(shù)作為分布(密度)參數(shù);從另一個(gè)角度,極大似然估計(jì)認(rèn)為已經(jīng)發(fā)生的(這些樣本出現(xiàn))就是是概率最大的,從而求出分布(密度)參數(shù)。
極大似然估計(jì)在絕大多數(shù)概率論或統(tǒng)計(jì)課程中都有詳細(xì)的介紹,我這里就不贅述了,具體參見(jiàn)課本和網(wǎng)上資料。
這里貼幾個(gè)還不錯(cuò)的網(wǎng)上資料:
維基百科 《極大似然估計(jì)》 [2]
《最大似然估計(jì)》 [3]
筆者在參考李航博士《統(tǒng)計(jì)學(xué)習(xí)方法》[4]學(xué)習(xí)最大熵模型,遇到條件概率P(Y|X)的對(duì)數(shù)似然函數(shù)(6.2.4節(jié))時(shí),真的是一頭霧水。如下圖
一直接觸的極大似然估計(jì)都是已知模型,通過(guò)樣本求參數(shù)。而這個(gè)似然函數(shù),模型未知,參數(shù)未知,更不知道是怎么來(lái)的,懵圈了。。。
為了搞清楚這個(gè)問(wèn)題,查閱了《統(tǒng)計(jì)學(xué)習(xí)方法》的參考文獻(xiàn)《A Maximum Entropy Approach to Natural Language Processing》[5],也沒(méi)有搞清楚這個(gè)問(wèn)題。
后來(lái)各種關(guān)鍵字在google上搜,終于搜到了比較靠譜的信息,大概如下:
[6]
[7]
[8]
這大概是一個(gè)經(jīng)驗(yàn)似然(Empirical Likelihood)問(wèn)題,但是有點(diǎn)艱深,筆者并不打算深入挖掘下去,只是從機(jī)器學(xué)習(xí)數(shù)學(xué)基礎(chǔ)的角度搞清楚上述公式的由來(lái)。筆者看到了[4]的第一個(gè)公式,終于明白了李航博士書(shū)中公式的由來(lái),如下。
非參數(shù)極大似然估計(jì)(Non-Parametric Maximum Likelihood Estimation,NPMLE),在大多數(shù)初級(jí)的概率論課本里是沒(méi)有的。
這里根據(jù)常規(guī)MLE的假設(shè)和建模過(guò)程,來(lái)簡(jiǎn)略推導(dǎo)NPMLE的似然函數(shù)。下圖[3]為常規(guī)MLE的假設(shè)和似然函數(shù)建模過(guò)程。
參考常規(guī)MLE,假設(shè)非參數(shù)的分布有相同的采樣,但沒(méi)有參數(shù)。
[1]、百度百科 《參數(shù)估計(jì)》
[2]、維基百科 《極大似然估計(jì)》
[3]、 《最大似然估計(jì)》
[4]、李航《統(tǒng)計(jì)學(xué)習(xí)方法》
[5]、Adam L. Berger, Stephen A. Della Pietra《A Maximum Entropy Approach to Natural Language Processing》
[6]、
[7]、
[8]、