自然语言处理5——朴素贝叶斯及其sklearn实现

1. 朴素贝叶斯的原理

基于朴素贝叶斯公式,比较出后验概率的最大值来进行分类,后验概率的计算是由先验概率与类条件概率的乘积得出,先验概率和类条件概率要通过训练数据集得出,即为朴素贝叶斯分类模型,将其保存为中间结果,测试文档进行分类时调用这个中间结果得出后验概率。
一个事物具有很多属性,把它的众多属性看作一个向量,即x=(x1,x2,x3,…,xn),用x这个向量来代表这个事物,x的集合记为X,称为属性集。类别也有很多种,用集合C={c1,c2,…cm}表示。根据贝叶斯公式,后验概率 P ( C ∣ X ) = P ( X ∣ C ) P ( C ) P ( X ) P(C|X)=\frac{P(X|C)P(C)}{P(X)} P(CX)=P(X)P(XC)P(C),但在比较不同C值的后验概率时,分母P(X)总是常数,忽略掉,后验概率 P ( C ∣ X ) = P ( X ∣ C ) P ( C ) P(C|X)=P(X|C)P(C) P(CX)=P(XC)P(C),先验概率P©可以通过计算训练集中属于每一个类的训练样本所占的比例,

2. 朴素贝叶斯应用场景

(1)实时预测:朴素贝叶斯算法简单便捷。 因此,它可以用于实时进行预测。
(2)多分类预测:适用于目标变量为多类别的任务,这里我们可以预测多类目标变量的概率。
(3)文本分类/垃圾邮件过滤/情感分析:主要用于文本分类的朴素贝叶斯分类器(由于多类问题和独立规则更好的结果)与其他算法相比具有更高的成功率。 因此,它被广泛用于垃圾邮件过滤(识别垃圾邮件)和情感分析(在社交媒体分析中,识别积极和消极的客户情绪)
(4)推荐系统:朴素贝叶斯分类器和协作过滤一起构建推荐系统,该系统使用机器学习和数据挖掘技术来过滤看不见的信息并预测用户是否会喜欢给定的资源,简单的例子就是淘宝上的商品推荐。

3. 朴素贝叶斯优缺点

优点
(1)对数据的预测是简单、快捷和搞笑的,特别在多元分类任务;
(2)当特征相互独立的假设成立,其预测能力好于逻辑回归等其他算法,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
(3)相比于输入变量为数值变量时,它在分类变量的情况下表现良好,若是数值变量,则需要假设其为正态分布。

缺点
(1)朴素贝叶斯算法的假设条件在实际中往往很难成立,在属性个数比较多或者属性之间相关性较大时,分类效果不好。
(2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
(3)对输入数据的表达形式很敏感。

4. 朴素贝叶斯 sklearn 参数学习

在sklearn 库中有朴素贝叶斯模型包括三种类型:
(1)高斯Gaussian:用于分类,它假定特征遵循正态分布。
参数
alpha : float, optional (default=1.0)平滑参数
binarize : float or None, optional (default=0.0)样本特征的二值化(映射到布尔值)的阈值。
fit_prior : boolean, optional (default=True)是否学习类别先验概率
class_prior : array-like, size=[n_classes,], optional (default=None)类先验概率,如果指定,则不根据数据调整先验。

(2)多项式Multinomial:用于离散计数。例如,假设我们有文本分类问题。在这里,我们可以考虑更进一步的伯努利试验,而不是“在文档中出现的词”,而是“计算文档中出现词的频率”,您可以将其视为“在n次试验中观察结果数x_i出现的次数”。
参数
alpha : float, optional (default=1.0)平滑参数
fit_prior : boolean, optional (default=True)
class_prior : array-like, size (n_classes,), optional (default=None)

(3)伯努利Bernoulli:如果你的特征向量是0-1分类,二项模型很有用。比如在文本分类,其中“1、0”分别是“词语出现在文档中”和“词语文档不出现在文档中”。
参数
alpha : float, optional (default=1.0)
binarize : float or None, optional (default=0.0)
fit_prior : boolean, optional (default=True)
class_prior : array-like, size=[n_classes,], optional (default=None)

5. 利用朴素贝叶斯模型结合 Tf-idf 算法进行文本分类

这里利用朴素贝叶斯模型结合 Tf-idf 算法对THUCNEWS数据集进行了分类,我选择的是MultinomialNB模型,用GaussianNB时候,toarray总会内存溢出,没找到解决办法

from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import LabelEncoder
from cnew_deal.pre_data import *
import sklearn.naive_bayes as nb


train_data = pd.read_csv('G:/PycharmCode/NLP/cnews/cnews.train.txt', sep='\t', names=['label', 'content'])
test_data = pd.read_csv('G:/PycharmCode/NLP/cnews/cnews.test.txt', sep='\t', names=['label', 'content'])

label_list = []
for i in train_data['label']:
    label_list.append(i)
# num_class = np.unique(label_list).shape[0]
# train_content = train_data['content'].apply(cut_content)
with open('train_content.pickle', 'rb') as f:
    train_content = pk.load(f)
# test_content = test_data['content'].apply(cut_content)
with open('test_content.pickle', 'rb') as f:
    test_content = pk.load(f)
labelEncoder = LabelEncoder()
train_y = labelEncoder.fit_transform(label_list)
print(len(train_y))
vectorizer = TfidfVectorizer()
x_train = vectorizer.fit_transform(train_content)
x_test = vectorizer.transform(test_content)
y_train = train_y
model = nb.MultinomialNB()
model.fit(x_train, y_train)
print('--------------------训练完成-----------------------')


test_label_list = []
for i in test_data['label']:
    test_label_list.append(i)
y_test = labelEncoder.transform(test_label_list)
print(len(y_test))
predic = model.predict(x_test)
print(len(predic))
print("classification report on test set for classifier:")
print(classification_report(y_test, predic))
print(model.score(x_test, predic))
print(confusion_matrix(y_test, predic))

但是,我的可能有问题啊,准确率1.0“警告”让我很不安,大佬们帮我看看可能的问题,下面是我的模型评估:

在这里插入图片描述

参考资料

[1]朴素贝叶斯1:sklearn:朴素贝叶斯(naïve beyes) - 专注计算机体系结构 - CSDN博客 (https://blog.csdn.net/u013710265/article/details/72780520)
[2]用LDA处理文本(Python) - 专注计算机体系结构 - CSDN博客 (https://blog.csdn.net/u013710265/article/details/73480332)
[3]合并特征:Python:合并两个numpy矩阵 - 专注计算机体系结构 - CSDN博客(https://blog.csdn.net/u013710265/article/details/72848564)
[4]关于朴素贝叶斯的一些理解及python的简单实现 - 简书(https://www.jianshu.com/p/38648c987ad8)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Growing_Snake

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值