当前位置:   article > 正文

朴素贝叶斯分类_贝叶斯测试集

贝叶斯测试集


朴素贝叶斯模型是一组非常简单快速的分类算法,通常适用于维度非常高的数据集。因为运行速度快,而且可调参数少,因此非常适合分类问题提供快速粗糙的基本方案。

一、贝叶斯分类

贝叶斯定理论:在这里插入图片描述
P(特征):(测试集中)某特征出现的概率
P (L):(训练集中)L类标签所占比重,先验概率
P (特征 | L ):L类标签出现某特征的概率,似然函数(生成模型帮我们计算)
P (L | 特征 ):具有某特征的样本属于L类标签的概率,后验概率

每种标签设置生成模型是贝叶斯分类器训练过程的主要部分。

“朴素”,如果对每种标签的生成模型进行非常简单的假设,就能找到每种类型生成模型的近似解,然后就可以使用贝叶斯分布。

二、高斯朴素贝叶斯sklearn.naive_bayes–GaussianNB

这个分类器假设每个标签的数据都服从简单的高斯分布。

  • 训练集数据
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个中心点
  • 1
  • 2
  • 3

可视化

%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分颜色
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

  • 模型选择、生成和训练
from sklearn.naive_bayes import GaussianNB
model=GaussianNB()
model.fit(X,y)
  • 1
  • 2
  • 3
  • 测试集数据
import numpy as np
rng = np.random.RandomState(0)
Xnew = [-6, -14] + [14, 18] * rng.rand(2000, 2)
  • 1
  • 2
  • 3
'
运行
  • 模型预测
ynew = model.predict(Xnew)
  • 1

可视化

plt.scatter(Xnew[:, 0], Xnew[:, 1], c=ynew, s=20, cmap='RdBu', alpha=0.2)
  • 1

在这里插入图片描述
这个结果就是使用训练集训练出来的高斯朴素贝叶斯模型形成的分类,边界是一条弯曲的线,通常,高斯朴素贝叶斯的边界是二次方曲线。
我们可以用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]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

测试集的最后一个数据,属于其中一个标签的概率是P (L1 | 特征 )=0.153,属于另一个标签的概率是P (L2 | 特征 )=0.847

三、多项式朴素贝叶斯sklearn.naive_bayes --MultinomialNB

这个分类器假设特征是有一个简单多项式分布生成的。
多项分布可以描述各种类型样本出现次数的概率,因此多项式朴素贝叶斯非常适合用于描述出现次数或者出现次数比例的特征。

  • 准备数据
from sklearn.datasets import fetch_20newsgroups
data=fetch_20newsgroups()
#data.target_names
  • 1
  • 2
  • 3

该data为sklearn.utils.Bunch

data.keys()
>>>dict_keys(['data', 'filenames', 'target_names', 'target', 'DESCR', 'description'])
  • 1
  • 2

前4个key对应的value都是list。data.data的元素是文章字符串,data.taget是每篇文章对应的分类标签,data.target_names的元素是文章可以分成的20类别名称字符串。取训练集和测试集,标签(文章类别)只取4个。

  • 创建管道(选择和初始化模型)
    TF-IDF向量化方法和多项式朴素贝叶斯分类器组合在一起。
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())
  • 1
  • 2
  • 3
  • 4

TfidfVectorizer()传入一个字符串列表,就可以转化成矩阵

  • 训练集训练模型、模型预测数据
model.fit(train.data, train.target)
labels = model.predict(test.data)
  • 1
  • 2

fit传入的参数都是列表,因为这两个参数分别适应TfidfVectorizer(), MultinomialNB()
这里训练集里的数据都被模型预测出所属标签

  • 模型验证

将预测的标签和原来所属新闻类目标签用混淆矩阵对比

from sklearn.metrics import confusion_matrix
mat = confusion_matrix(test.target, labels)
  • 1
  • 2

画出热力图

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')
  • 1
  • 2
  • 3

在这里插入图片描述

  • 预测任意数据
    已经获得了一个模型,结合管道的predict()函数,自定义一个函数,用于预测任意一段字符串
def predict_category(s, train=train, model=model):
    pred = model.predict([s])
    return train.target_names[pred[0]]
  • 1
  • 2
  • 3

传入一段字符串,反回所属文章类型

predict_category('discussing islam vs atheism')
>>> 'soc.religion.christian'
  • 1
  • 2

四、朴素贝叶斯的应用场景

由于朴素贝叶斯分类器对数据有严格的假设,因此它的训练效果通常比复杂模型的差。
优点:
• 训练和预测的速度非常快。
• 直接使用概率预测。
• 通常很容易解释。
• 可调参数(如果有的话)非常少。
这些优点使得朴素贝叶斯分类器通常很适合作为分类的初始解。
适用场景:
• 假设分布函数与数据匹配(实际中很少见)。
• 各种类型的区分度很高,模型复杂度不重要。
• 非常高维度的数据,模型复杂度不重要。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/875555
推荐阅读
相关标签
  

闽ICP备14008679号