朴素贝叶斯(naive Bayes classifiers)是一组非常简单快速的分类算法。
- 通常适用于维度非常高的数据集
- 运行速度快
- 可调参数少
- 快速+粗糙
希望确定一个具有某些特征的样本属于某类标签的概率,即 ,根据贝叶斯定理,
或者两个标签和的后验概率比值:
现在需要一种模型,帮我们计算每个标签的 P ( 特征 | Li)。这种模型被称为生成模型,因为它可以训练出生成输入数据的假设随机过程(或称为概率分布)。为每种标签设置生成模型是贝叶斯分类器训练过程的主要部分。
这句话的意思是,生成模型能够通过训练来模拟生成输入数据的过程,这个过程可以被看作是一个假设的随机过程,也可以被称为概率分布。
具体来说,生成模型通过对大量已有数据的学习,尝试理解数据的特征和规律,并据此推断出一种概率分布,用于描述输入数据的生成过程。例如,在图像生成任务中,生成模型可能学习到图像中各个像素的概率分布,从而能够生成具有类似特征的新图像。
在贝叶斯分类器的训练过程中,为每个标签设置生成模型的目的是为了根据输入数据的特征,计算每个标签的概率,以便确定输入数据最可能属于哪个标签。 这样,生成模型就成为了贝叶斯分类器进行分类决策的重要依据。
朴素贝叶斯是对生成模型进行简单的假设,例如:
- 高斯朴素贝叶斯:每个标签的数据都服从高斯分布
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
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');
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X,y);
rng = np.random.RandomState(0)
Xnew = [-6,-14] + [14,18]*rng.rand(2000,2)
ynew = model.predict(Xnew)
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)
yprob = model.predict_proba(Xnew)
yprob[-8:].round(2)
- 多项式朴素贝叶斯:多项式分布,可以描述各种类型样本出现的概率(出现次数或者出现次数比例)。多项分布可以描述各种类型样本出现的概率。
from sklearn.datasets import fetch_20newsgroups
data = fetch_20newsgroups()
data.target_names
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)
print(train.data[5])
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
model = make_pipeline(TfidfVectorizer(), MultinomialNB())
model.fit(train.data, train.target)
labels = model.predict(test.data)
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');
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'), predict_category('discussing islam vs atheism') ,predict_category('determining the screen resolution'),predict_category('stars war')
分类的最终效果只能依赖于一开始的模型假设。朴素贝叶斯分类器适用于模型复杂度比较简单的情况,假设分布函数与数据匹配(多数不现实),数据的、类型区分度很高,非常高维度的数据。
参考:
[1]美 万托布拉斯 (VanderPlas, Jake).Python数据科学手册[M].人民邮电出版社,2018.