我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在自然语言处理方面,对于预测其实有很多的算法。那么,贝叶斯函数就是其中一个最常见的方法。从贝叶斯函数又发展出了一个朴素贝叶斯分类器,而继而又发展出来了一个拉普拉修平滑参数。对于新人来说,是不是有些晕了。那么,现在就分几篇文章来,讲述一下贝叶斯函数。

苏南大叔:机器学习,用MultinomialNB多项式贝叶斯分类器进行预测 - 朴素贝叶斯函数
机器学习,用MultinomialNB多项式贝叶斯分类器进行预测(图5-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文使用python里面的sklearn机器学习包,多项式朴素贝叶斯分类器MultinomialNB来对数据进行预测。本文测试环境:win10python@3.6.8sklearn@0.24.2

准备数据

首先有一部分数据,每个数据都有个唯一的结论,或好或坏。先使用大部分数据进行训练,然后对剩下的数据进行预测。然后看看预测的结果如何。

import jieba
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

数据例子如下(有个表头,20条训练,6条对比):

苏南大叔:机器学习,用MultinomialNB多项式贝叶斯分类器进行预测 - 待测试数据
机器学习,用MultinomialNB多项式贝叶斯分类器进行预测(图5-2)

同时,准备一些停用词列表,放到一个.txt,读取到list里面。【非必须】对于本文的需求来说,停用词除了标点符号,还可以添加一些中性词。因为要计算区分好评或者差评,所以将一些两边都可以使用的中性词,过滤掉的话,对最终结果的准确率提高,是有一定的好处的。

苏南大叔:机器学习,用MultinomialNB多项式贝叶斯分类器进行预测 - 停用词
机器学习,用MultinomialNB多项式贝叶斯分类器进行预测(图5-3)

stopwords = []
with open('./data/stopwords.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()
    for line in lines:
        stopwords.append(line.strip())
stopwords = list(set(stopwords))  # 去重

苏南大叔:机器学习,用MultinomialNB多项式贝叶斯分类器进行预测 - 准备代码数据
机器学习,用MultinomialNB多项式贝叶斯分类器进行预测(图5-4)

分词

如果文章都是使用空格分割的单词的话,这里是不用进行分词的。如果是中文的话,需要对所有的内容进行分割。然后再使用英文逗号分割,组成内容(已经应用停用词列表)。

data = pd.read_csv("./data/评价.csv", encoding="gbk")
_text = []
for c in data["内容"]:
    _seg = jieba.cut(c, cut_all=False)
    _text.append(','.join(_seg))

参考文章:

统计词频

统计词频的原因,是为了多项式朴素贝叶斯分类器提供由01组成的输入内容。代码范例如下:

con = CountVectorizer(stop_words=stopwords)
X = con.fit_transform(_text)

这部分的代码解释,请参考:

训练集和测试集

实际上,并不是总是需要对数据集进行切割的。长远来看,可以使用所用数据作为训练集,后续新出现的数据作为测试数据。

苏南大叔:机器学习,用MultinomialNB多项式贝叶斯分类器进行预测 - 进行数据预测
机器学习,用MultinomialNB多项式贝叶斯分类器进行预测(图5-5)

测试代码如下,选择了前20条内容做训练,后6条内容作为结果对比。

_x = X.toarray()
_y = data['评价'].values

这里的变量名称是约定速成的,X_/y__train/_test

训练集分割方案一

X_train = _x[:20, :]
y_train = _y[:20]
# print(X_train, y_train)
X_test = _x[20:, :]
y_test = _y[20:]
# print(X_test, y_test)

训练集分割方案二

官方也有个函数train_test_split,是专门用于训练集的分割的。例如:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(_x, _y, test_size=0.2)

上面的test_size指的是,用于对比测试的比例为20%。但是,这样的训练集是随机的,也就是说每次的测试集都是不一样的。

训练集分割方案三【推荐】

使用train_test_split,顺序划分固定的训练集。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    _x, _y, test_size=0.2, random_state=1, shuffle=False)
  • random_state,这个取啥整数值都可以,只是为了保持一致。
  • shuffle,默认为true打乱,改成false就是不打乱。

朴素贝叶斯预测

  • 先使用.fit()来做训练,第一个输入是把单词变成0,1的数组,第二个输入是这些数组元素对应的结果(真实的结论)。
  • 使用.predict()来做预测,输入是和上面的第一个输入同样处理的数组,输出是预测的结果,格式类似上面的第二个输入。
mb = MultinomialNB(alpha=1)
mb.fit(X_train, y_train)
y_predict = mb.predict(X_test)

预测结果如下:

print('真实值:', y_test)
print('预测值:', y_predict)
print(mb.score(X_test, y_test))

这里可以看到输出如下:

真实值: ['好评' '好评' '差评' '差评' '好评' '好评']
预测值: ['好评' '好评' '差评' '差评' '好评' '好评']
1.0

这个最终评分是使用.score(),参数输入的是真实的值,看来隐藏着预测值到MultinomialNB对象里面啊。评分越接近1.0表示预测结果越好。

为了得到更好的预测结果,可以:

  • 使用更多更准确的训练集。
  • 使用stop_words去掉训练集中无关的词。

相关文章

综述

本文主要使用了一个机器学习的朴素贝叶斯函数进行了数据预测,主要预测某句话的情感倾向是好还是坏。更多机器学习的经验文章,请点击:

助理微信

微信打赏码

微信公众号

微信小程序

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    sklearn