5.5 樸素貝葉斯分類
譯者:飛龍
協(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)
依沮。 貝葉斯定理告訴我們,如何用更直接的計算量來表達這一點:
如果我們試圖在兩個標簽之間作出決定 - 讓我們稱之為L1
和L2
枪狂,那么作出這一決定的一個方法是危喉,計算每個標簽的后驗概率的比率:
我們現(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ù)速客,即使一個簡單的模型也是非常強大的。