赞
踩
贝叶斯定理论:
P(特征):(测试集中)某特征出现的概率
P (L):(训练集中)L类标签所占比重,先验概率
P (特征 | L ):L类标签出现某特征的概率,似然函数(生成模型帮我们计算)
P (L | 特征 ):具有某特征的样本属于L类标签的概率,后验概率
每种标签设置生成模型是贝叶斯分类器训练过程的主要部分。
“朴素”,如果对每种标签的生成模型进行非常简单的假设,就能找到每种类型生成模型的近似解,然后就可以使用贝叶斯分布。
这个分类器假设每个标签的数据都服从简单的高斯分布。
from sklearn.datasets import make_blobs
X,y=make_blobs(n_samples=100,n_features=2, centers=2, random_state=2, cluster_std=1.5)
#选取了100个样本,2个特征,2个中心点
可视化
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='RdBu')
#X轴第1个特征,y轴第2个特征,按照y分颜色
from sklearn.naive_bayes import GaussianNB
model=GaussianNB()
model.fit(X,y)
import numpy as np
rng = np.random.RandomState(0)
Xnew = [-6, -14] + [14, 18] * rng.rand(2000, 2)
ynew = model.predict(Xnew)
可视化
plt.scatter(Xnew[:, 0], Xnew[:, 1], c=ynew, s=20, cmap='RdBu', alpha=0.2)
这个结果就是使用训练集训练出来的高斯朴素贝叶斯模型形成的分类,边界是一条弯曲的线,通常,高斯朴素贝叶斯的边界是二次方曲线。
我们可以用predict_proba 方法计算样本属于某个标签的概率:
yprob=model.predict_proba(Xnew)
yprob[-8:].round(3)
>>>
array([[0.895, 0.105],
[1. , 0. ],
[1. , 0. ],
[1. , 0. ],
[1. , 0. ],
[1. , 0. ],
[0. , 1. ],
[0.153, 0.847]])
测试集的最后一个数据,属于其中一个标签的概率是P (L1 | 特征 )=0.153,属于另一个标签的概率是P (L2 | 特征 )=0.847
这个分类器假设特征是有一个简单多项式分布生成的。
多项分布可以描述各种类型样本出现次数的概率,因此多项式朴素贝叶斯非常适合用于描述出现次数或者出现次数比例的特征。
from sklearn.datasets import fetch_20newsgroups
data=fetch_20newsgroups()
#data.target_names
该data为sklearn.utils.Bunch
data.keys()
>>>dict_keys(['data', 'filenames', 'target_names', 'target', 'DESCR', 'description'])
前4个key对应的value都是list。data.data的元素是文章字符串,data.taget是每篇文章对应的分类标签,data.target_names的元素是文章可以分成的20类别名称字符串。取训练集和测试集,标签(文章类别)只取4个。
from sklearn.feature_extraction.text import TfidfVectorizer#TF-IDF
from sklearn.naive_bayes import MultinomialNB#多项式朴素贝叶斯
from sklearn.pipeline import make_pipeline#管道
model = make_pipeline(TfidfVectorizer(), MultinomialNB())
TfidfVectorizer()传入一个字符串列表,就可以转化成矩阵
model.fit(train.data, train.target)
labels = model.predict(test.data)
fit传入的参数都是列表,因为这两个参数分别适应TfidfVectorizer(), MultinomialNB()
这里训练集里的数据都被模型预测出所属标签
将预测的标签和原来所属新闻类目标签用混淆矩阵对比
from sklearn.metrics import confusion_matrix
mat = confusion_matrix(test.target, labels)
画出热力图
sns.heatmap(mat.T, square=True, annot=True, fmt='d', cbar=False,cmap='binary',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('discussing islam vs atheism')
>>> 'soc.religion.christian'
由于朴素贝叶斯分类器对数据有严格的假设,因此它的训练效果通常比复杂模型的差。
优点:
• 训练和预测的速度非常快。
• 直接使用概率预测。
• 通常很容易解释。
• 可调参数(如果有的话)非常少。
这些优点使得朴素贝叶斯分类器通常很适合作为分类的初始解。
适用场景:
• 假设分布函数与数据匹配(实际中很少见)。
• 各种类型的区分度很高,模型复杂度不重要。
• 非常高维度的数据,模型复杂度不重要。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。