機器學(xué)習(xí)之樸素貝葉斯
前四節(jié)對機器學(xué)習(xí)概念進行了總體概述。 在本節(jié)和隨后的一節(jié)中,我們將仔細(xì)研究幾種具體的監(jiān)督和無監(jiān)督學(xué)習(xí)算法,從這里以樸素貝葉斯分類開始。
樸素貝葉斯模型是一組非常快速和簡單的分類算法,通常適用于非常高維的數(shù)據(jù)集。 因為它們非??欤⑶揖哂腥绱松俚目烧{(diào)參數(shù),所以它們最終適合作為分類問題的快速而粗略的基準(zhǔn)。 本節(jié)專注于直觀的說明,關(guān)于貝葉斯分類器的工作原理,其次是一些數(shù)據(jù)集上的實例。
貝葉斯分類
樸素貝葉斯分類器建立在貝葉斯分類方法上。 它們依賴于貝葉斯定理,一個描述統(tǒng)計量條件概率關(guān)系的方程式。 在貝葉斯分類中,給定一些觀察特征,我們的興趣是求出的標(biāo)簽的概率,我們可以將其寫為P(L | features)。 貝葉斯定理告訴我們,如何用更直接的計算量來表達(dá)這一點:

如果我們試圖在兩個標(biāo)簽之間作出決定 - 讓我們稱之為L1和L2,那么作出這一決定的一個方法是,計算每個標(biāo)簽的后驗概率的比率:

我們現(xiàn)在需要一些模型,我們可以通過它來計算每個標(biāo)簽的P(features | Li)。 這種模型稱為生成模型,因為它指定了生成數(shù)據(jù)的假設(shè)隨機過程。 為每個標(biāo)簽指定這個生成模型是這種貝葉斯分類器的訓(xùn)練的主要部分。 這種訓(xùn)練步驟的一般版本是一項非常困難的任務(wù),但是我們可以通過使用關(guān)于該模型形式的一些簡化假設(shè)來使其更簡單。
這就是“樸素貝葉斯”中的“樸素”:如果我們對每個標(biāo)簽的生成模型做出非常樸素的假設(shè),我們可以找到每個分類的生成模型的粗略近似,然后進行貝葉斯分類。 不同類型的樸素貝葉斯分類器依賴于數(shù)據(jù)的不同樸素假設(shè),我們將在以下部分中對其中的幾個進行研究。
我們以標(biāo)準(zhǔn)導(dǎo)入來開始:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()1234
高斯樸素貝葉斯
也許最簡單的樸素貝葉斯分類器,是高斯樸素貝葉斯。 在這個分類器中,假設(shè)來自每個標(biāo)簽的數(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');123

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

這里的橢圓形代表每個標(biāo)簽的高斯生成模型,橢圓的中心具有較大的概率。 對于每個分類,通過這個生成模型,我們有一個簡單的秘籍,用于計算任何數(shù)據(jù)點的可能性P(features | L1),因此我們可以快速計算后驗比率,并確定對于給定點,哪個標(biāo)簽是最可能的。
Sklearn 的sklearn.naive_bayes.GaussianNB實現(xiàn)了這個過程。
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X, y);123
現(xiàn)在讓我們生成一些新的數(shù)據(jù),并預(yù)測標(biāo)簽。
rng = np.random.RandomState(0)
Xnew = [-6, -14] + [14, 18] * rng.rand(2000, 2)
ynew = model.predict(Xnew)123
現(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);1234

我們在分類中看到一個略微彎曲的邊界 - 一般來說,高斯樸素貝葉斯的邊界是二次的。
這個貝葉斯形式的一個好處是,它自然支持概率分類,我們可以使用predict_proba方法計算:
yprob = model.predict_proba(Xnew)
yprob[-8:].round(2)12
array([[ 0.89, 0.11],
[ 1. , 0. ],
[ 1. , 0. ],
[ 1. , 0. ],
[ 1. , 0. ],
[ 1. , 0. ],
[ 0. , 1. ],
[ 0.15, 0.85]])12345678
這些列分別提供了第一個和第二個標(biāo)簽的后驗概率。 如果您正在尋找分類中的不確定性估計,這樣的貝葉斯方法可能是有用的方法。
當(dāng)然,最終的分類只會與產(chǎn)生它的模型假設(shè)一樣好,這就是高斯樸素的貝葉斯經(jīng)常不會產(chǎn)生優(yōu)秀結(jié)果的原因。 然而,在許多情況下,特別是隨著特征數(shù)量的增加,這一假設(shè)并不足以阻止高斯樸素貝葉斯成為有用的方法。
多項式樸素貝葉斯
剛剛描述的高斯假設(shè),絕不是唯一的簡單假設(shè),可以用于指定每個標(biāo)簽的生成分布。 另一個有用的例子是多項式樸素貝葉斯,其中假設(shè)特征從簡單的多項式分布生成。 多項式分布描述了在多個類別中觀察計數(shù)的概率,因此多項樸素貝葉斯最適合于表示計數(shù)或計數(shù)率的特征。
這個想法與以前一樣,除了我們不用最佳擬合高斯模型,而用最合適的多項式分布,對數(shù)據(jù)分布建模。
示例:文本分類
經(jīng)常使用多項樸素貝葉斯的一個地方是文本分類,其特征與要分類的文檔中的字?jǐn)?shù)或頻率有關(guān)。 我們在特征工程中討論了這些特征的提取; 在這里,我們將使用 20 個新聞組語料庫中的稀疏字?jǐn)?shù)特征,來展示我們?nèi)绾螌⑦@些簡短文檔分類。
讓我們下載數(shù)據(jù)并查看目標(biāo)名稱:
from sklearn.datasets import fetch_20newsgroups
data = fetch_20newsgroups()
data.target_names1234
['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']1234567891011121314151617181920
為了簡化,我們選擇這些分類中的一些,之后下載測試集。
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)1234
這里是數(shù)據(jù)的一個簡單展示:
print(train.data[5])1
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.1234567891011121314151617
為了將這些數(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())12345
使用這個流水簽,我們可以將模型用于訓(xùn)練數(shù)據(jù),并測試數(shù)據(jù)的預(yù)測標(biāo)簽。
model.fit(train.data, train.target)
labels = model.predict(test.data)12
現(xiàn)在我們已經(jīng)預(yù)測了測試數(shù)據(jù)的標(biāo)簽,我們可以評估它們來了解估計器的性能。 例如,這里是測試數(shù)據(jù)的真實和預(yù)測標(biāo)簽之間的混淆矩陣:
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');123456

顯然,即使這個非常簡單的分類器,也可以成功將空間話題與電腦話題分開,但是在宗教話題和基督教話題之間會混淆。 這是預(yù)期的混亂。
這里非??幔覀儸F(xiàn)在有了工具,用于確定任何字符串的分類,使用這個流水線的predict()方法。 這是一個簡便的工具函數(shù),它返回單個字符串的預(yù)測:
def predict_category(s, train=train, model=model):
pred = model.predict([s])
return train.target_names[pred[0]]123
讓我們試試看:
predict_category('sending a payload to the ISS')1
'sci.space'1
predict_category('discussing islam vs atheism')1
'soc.religion.christian'1
predict_category('determining the screen resolution')1
'comp.graphics'1
記住,這并不比字符串中每個單詞的(加權(quán))頻率的簡單概率模型復(fù)雜得多; 然而,結(jié)果是驚人的。 即使是非常匍匐的算法,當(dāng)仔細(xì)使用并對大量高維數(shù)據(jù)進行訓(xùn)練時,會有效得令人驚奇。
何時使用樸素貝葉斯
因為樸素的貝葉斯分類器對數(shù)據(jù)做出了如此嚴(yán)格的假設(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ù),即使一個簡單的模型也是非常強大的。
鏈接: http://blog.csdn.net/wizardforcel/article/details/73910511