Python 數(shù)據(jù)科學(xué)手冊 5.5 樸素貝葉斯分類

5.5 樸素貝葉斯分類

原文:In Depth: Naive Bayes Classification

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

譯文沒有得到原作者授權(quán)柑晒,不保證與原文的意思嚴格一致。

前四節(jié)對機器學(xué)習(xí)概念進行了總體概述营袜。 在本節(jié)和隨后的一節(jié)中秧耗,我們將仔細研究幾種具體的監(jiān)督和無監(jiān)督學(xué)習(xí)算法,從這里以樸素貝葉斯分類開始。

樸素貝葉斯模型是一組非撑穸洌快速和簡單的分類算法,通常適用于非常高維的數(shù)據(jù)集。 因為它們非成快笔链,并且具有如此少的可調(diào)參數(shù),所以它們最終適合作為分類問題的快速而粗略的基準腮猖。 本節(jié)專注于直觀的說明鉴扫,關(guān)于貝葉斯分類器的工作原理,其次是一些數(shù)據(jù)集上的實例澈缺。

貝葉斯分類

樸素貝葉斯分類器建立在貝葉斯分類方法上坪创。 它們依賴于貝葉斯定理,一個描述統(tǒng)計量條件概率關(guān)系的方程式姐赡。 在貝葉斯分類中莱预,給定一些觀察特征,我們的興趣是求出的標簽的概率项滑,我們可以將其寫為P(L | features)依沮。 貝葉斯定理告訴我們,如何用更直接的計算量來表達這一點:

如果我們試圖在兩個標簽之間作出決定 - 讓我們稱之為L1L2枪狂,那么作出這一決定的一個方法是危喉,計算每個標簽的后驗概率的比率:

我們現(xiàn)在需要一些模型,我們可以通過它來計算每個標簽的P(features | Li)州疾。 這種模型稱為生成模型辜限,因為它指定了生成數(shù)據(jù)的假設(shè)隨機過程。 為每個標簽指定這個生成模型是這種貝葉斯分類器的訓(xùn)練的主要部分孝治。 這種訓(xùn)練步驟的一般版本是一項非常困難的任務(wù)列粪,但是我們可以通過使用關(guān)于該模型形式的一些簡化假設(shè)來使其更簡單。

這就是“樸素貝葉斯”中的“樸素”:如果我們對每個標簽的生成模型做出非常樸素的假設(shè)谈飒,我們可以找到每個分類的生成模型的粗略近似岂座,然后進行貝葉斯分類。 不同類型的樸素貝葉斯分類器依賴于數(shù)據(jù)的不同樸素假設(shè)杭措,我們將在以下部分中對其中的幾個進行研究费什。

我們以標準導(dǎo)入來開始:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()

高斯樸素貝葉斯

也許最簡單的樸素貝葉斯分類器,是高斯樸素貝葉斯手素。 在這個分類器中鸳址,假設(shè)來自每個標簽的數(shù)據(jù),是從簡單的高斯分布中得出的泉懦。 假設(shè)您有以下數(shù)據(jù):

from sklearn.datasets import make_blobs
X, y = make_blobs(100, 2, centers=2, random_state=2, cluster_std=1.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='RdBu');

創(chuàng)建簡單模型的一個非掣迨颍快捷的方法是,假設(shè)數(shù)據(jù)服從維度之間沒有協(xié)方差(獨立)的高斯分布崩哩。 通過簡單地找出每個標簽內(nèi)的點的平均值和標準差巡球,可以得到該模型言沐,這就是您需要定義的分布。 這個樸素高斯假設(shè)的結(jié)果如下圖所示:

這里的橢圓形代表每個標簽的高斯生成模型酣栈,橢圓的中心具有較大的概率险胰。 對于每個分類,通過這個生成模型矿筝,我們有一個簡單的秘籍起便,用于計算任何數(shù)據(jù)點的可能性P(features | L1),因此我們可以快速計算后驗比率窖维,并確定對于給定點榆综,哪個標簽是最可能的。

Sklearn 的sklearn.naive_bayes.GaussianNB實現(xiàn)了這個過程铸史。

from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X, y);

現(xiàn)在讓我們生成一些新的數(shù)據(jù)奖年,并預(yù)測標簽。

rng = np.random.RandomState(0)
Xnew = [-6, -14] + [14, 18] * rng.rand(2000, 2)
ynew = model.predict(Xnew)

現(xiàn)在我們可以繪制新的數(shù)據(jù)沛贪,來了解決策邊界在哪里。

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='RdBu')
lim = plt.axis()
plt.scatter(Xnew[:, 0], Xnew[:, 1], c=ynew, s=20, cmap='RdBu', alpha=0.1)
plt.axis(lim);

我們在分類中看到一個略微彎曲的邊界 - 一般來說震贵,高斯樸素貝葉斯的邊界是二次的利赋。

這個貝葉斯形式的一個好處是,它自然支持概率分類猩系,我們可以使用predict_proba方法計算:

yprob = model.predict_proba(Xnew)
yprob[-8:].round(2)
array([[ 0.89,  0.11],
       [ 1.  ,  0.  ],
       [ 1.  ,  0.  ],
       [ 1.  ,  0.  ],
       [ 1.  ,  0.  ],
       [ 1.  ,  0.  ],
       [ 0.  ,  1.  ],
       [ 0.15,  0.85]])

這些列分別提供了第一個和第二個標簽的后驗概率媚送。 如果您正在尋找分類中的不確定性估計,這樣的貝葉斯方法可能是有用的方法寇甸。

當(dāng)然塘偎,最終的分類只會與產(chǎn)生它的模型假設(shè)一樣好,這就是高斯樸素的貝葉斯經(jīng)常不會產(chǎn)生優(yōu)秀結(jié)果的原因拿霉。 然而吟秩,在許多情況下,特別是隨著特征數(shù)量的增加绽淘,這一假設(shè)并不足以阻止高斯樸素貝葉斯成為有用的方法涵防。

多項式樸素貝葉斯

剛剛描述的高斯假設(shè),絕不是唯一的簡單假設(shè)沪铭,可以用于指定每個標簽的生成分布壮池。 另一個有用的例子是多項式樸素貝葉斯,其中假設(shè)特征從簡單的多項式分布生成杀怠。 多項式分布描述了在多個類別中觀察計數(shù)的概率椰憋,因此多項樸素貝葉斯最適合于表示計數(shù)或計數(shù)率的特征。

這個想法與以前一樣赔退,除了我們不用最佳擬合高斯模型橙依,而用最合適的多項式分布,對數(shù)據(jù)分布建模。

示例:文本分類

經(jīng)常使用多項樸素貝葉斯的一個地方是文本分類票编,其特征與要分類的文檔中的字數(shù)或頻率有關(guān)褪储。 我們在特征工程中討論了這些特征的提取; 在這里,我們將使用 20 個新聞組語料庫中的稀疏字數(shù)特征慧域,來展示我們?nèi)绾螌⑦@些簡短文檔分類鲤竹。

讓我們下載數(shù)據(jù)并查看目標名稱:

from sklearn.datasets import fetch_20newsgroups

data = fetch_20newsgroups()
data.target_names
['alt.atheism',
 'comp.graphics',
 'comp.os.ms-windows.misc',
 'comp.sys.ibm.pc.hardware',
 'comp.sys.mac.hardware',
 'comp.windows.x',
 'misc.forsale',
 'rec.autos',
 'rec.motorcycles',
 'rec.sport.baseball',
 'rec.sport.hockey',
 'sci.crypt',
 'sci.electronics',
 'sci.med',
 'sci.space',
 'soc.religion.christian',
 'talk.politics.guns',
 'talk.politics.mideast',
 'talk.politics.misc',
 'talk.religion.misc']

為了簡化,我們選擇這些分類中的一些昔榴,之后下載測試集辛藻。

categories = ['talk.religion.misc', 'soc.religion.christian',
              'sci.space', 'comp.graphics']
train = fetch_20newsgroups(subset='train', categories=categories)
test = fetch_20newsgroups(subset='test', categories=categories)

這里是數(shù)據(jù)的一個簡單展示:

print(train.data[5])
From: dmcgee@uluhe.soest.hawaii.edu (Don McGee)
Subject: Federal Hearing
Originator: dmcgee@uluhe
Organization: School of Ocean and Earth Science and Technology
Distribution: usa
Lines: 10


Fact or rumor....?  Madalyn Murray O'Hare an atheist who eliminated the
use of the bible reading and prayer in public schools 15 years ago is now
going to appear before the FCC with a petition to stop the reading of the
Gospel on the airways of America.  And she is also campaigning to remove
Christmas programs, songs, etc from the public schools.  If it is true
then mail to Federal Communications Commission 1919 H Street Washington DC
20054 expressing your opposition to her request.  Reference Petition number

2493.

為了將這些數(shù)據(jù)用于機器學(xué)習(xí),我們需要將每個字符串的內(nèi)容轉(zhuǎn)換為數(shù)值向量互订。 為此吱肌,我們將使用 TF-IDF 向量化器(在特征工程中討論),并創(chuàng)建一個流水線仰禽,將其附加到多項樸素貝葉斯分類器:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline

model = make_pipeline(TfidfVectorizer(), MultinomialNB())

使用這個流水簽氮墨,我們可以將模型用于訓(xùn)練數(shù)據(jù),并測試數(shù)據(jù)的預(yù)測標簽吐葵。

model.fit(train.data, train.target)
labels = model.predict(test.data)

現(xiàn)在我們已經(jīng)預(yù)測了測試數(shù)據(jù)的標簽规揪,我們可以評估它們來了解估計器的性能。 例如温峭,這里是測試數(shù)據(jù)的真實和預(yù)測標簽之間的混淆矩陣:

from sklearn.metrics import confusion_matrix
mat = confusion_matrix(test.target, labels)
sns.heatmap(mat.T, square=True, annot=True, fmt='d', cbar=False,
            xticklabels=train.target_names, yticklabels=train.target_names)
plt.xlabel('true label')
plt.ylabel('predicted label');

顯然猛铅,即使這個非常簡單的分類器,也可以成功將空間話題與電腦話題分開凤藏,但是在宗教話題和基督教話題之間會混淆奸忽。 這是預(yù)期的混亂。

這里非骋咀酷栗菜,我們現(xiàn)在有了工具,用于確定任何字符串的分類蹄梢,使用這個流水線的predict()方法苛萎。 這是一個簡便的工具函數(shù),它返回單個字符串的預(yù)測:

def predict_category(s, train=train, model=model):
    pred = model.predict([s])
    return train.target_names[pred[0]]

讓我們試試看:

predict_category('sending a payload to the ISS')
'sci.space'
predict_category('discussing islam vs atheism')
'soc.religion.christian'
predict_category('determining the screen resolution')
'comp.graphics'

記住检号,這并不比字符串中每個單詞的(加權(quán))頻率的簡單概率模型復(fù)雜得多; 然而腌歉,結(jié)果是驚人的。 即使是非常匍匐的算法齐苛,當(dāng)仔細使用并對大量高維數(shù)據(jù)進行訓(xùn)練時翘盖,會有效得令人驚奇。

何時使用樸素貝葉斯

因為樸素的貝葉斯分類器對數(shù)據(jù)做出了如此嚴格的假設(shè)凹蜂,所以它們通常不會和更復(fù)雜的模型一樣好馍驯。 也就是說阁危,它們有幾個優(yōu)點:

  • 訓(xùn)練和預(yù)測都非常快
  • 提供簡單的概率預(yù)測
  • 經(jīng)常很容易解釋
  • 具有很少的(如果存在)可調(diào)參數(shù)

這些優(yōu)點意味著汰瘫,樸素的貝葉斯分類器通常是初始基本分類的不錯選擇狂打。 如果適當(dāng)使用,那么恭喜:對于你的問題混弥,你有一個非撑肯纾快速,可解釋的分類器蝗拿。 如果表現(xiàn)不佳晾捏,那么您可以開始探索更復(fù)雜的模型,使用一些基本知識哀托,了解應(yīng)該如何進行惦辛。

樸素貝葉斯分類器在以下情況之一中往往表現(xiàn)得特別好:

  • 樸素的假設(shè)實際匹配數(shù)據(jù)時(在實踐中非常罕見)
  • 對于分隔良好的分類,當(dāng)模型復(fù)雜性不太重要時
  • 對于非常高維的數(shù)據(jù)仓手,當(dāng)模型復(fù)雜度不太重要時

最后兩點看起來是截然不同的胖齐,但它們實際上是相關(guān)的:隨著數(shù)據(jù)集的維度越來越大,任何兩點不可能更接近(畢竟嗽冒,它們必須在每一個維度上都接近)市怎。 這意味著,如果新維度添加了實際的信息辛慰,平均來講,高維度的簇比低維度更加分散干像。 因此帅腌,隨著維度增加,像樸素貝葉斯這樣的簡單分類器麻汰,往往比復(fù)雜分類器有效:一旦你擁有足夠的數(shù)據(jù)速客,即使一個簡單的模型也是非常強大的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末五鲫,一起剝皮案震驚了整個濱河市溺职,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌位喂,老刑警劉巖浪耘,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塑崖,居然都是意外死亡七冲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門规婆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澜躺,“玉大人蝉稳,你說我怎么就攤上這事【虮桑” “怎么了耘戚?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長操漠。 經(jīng)常有香客問我收津,道長,這世上最難降的妖魔是什么颅夺? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任朋截,我火速辦了婚禮,結(jié)果婚禮上吧黄,老公的妹妹穿的比我還像新娘部服。我一直安慰自己,他們只是感情好拗慨,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布廓八。 她就那樣靜靜地躺著,像睡著了一般赵抢。 火紅的嫁衣襯著肌膚如雪剧蹂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天烦却,我揣著相機與錄音宠叼,去河邊找鬼。 笑死其爵,一個胖子當(dāng)著我的面吹牛冒冬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摩渺,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼简烤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摇幻?” 一聲冷哼從身側(cè)響起横侦,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绰姻,沒想到半個月后枉侧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡狂芋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年棵逊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片银酗。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辆影,死狀恐怖徒像,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛙讥,我是刑警寧澤锯蛀,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站次慢,受9級特大地震影響旁涤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迫像,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一劈愚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闻妓,春花似錦菌羽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至均唉,卻和暖如春是晨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舔箭。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工罩缴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人层扶。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓箫章,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怒医。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容