机器学习,用MultinomialNB多项式贝叶斯分类器进行预测
发布于 作者:苏南大叔 来源:程序如此灵动~在自然语言处理方面,对于预测其实有很多的算法。那么,贝叶斯函数就是其中一个最常见的方法。从贝叶斯函数又发展出了一个朴素贝叶斯分类器,而继而又发展出来了一个拉普拉修平滑参数。对于新人来说,是不是有些晕了。那么,现在就分几篇文章来,讲述一下贝叶斯函数。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文使用python
里面的sklearn
机器学习包,多项式朴素贝叶斯分类器MultinomialNB
来对数据进行预测。本文测试环境:win10
,python@3.6.8
,sklearn@0.24.2
。
准备数据
首先有一部分数据,每个数据都有个唯一的结论,或好或坏。先使用大部分数据进行训练,然后对剩下的数据进行预测,然后看看预测的结果如何。
import jieba
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
数据例子如下(有个表头,20条训练,6条对比):
同时,准备一些停用词列表,放到一个.txt
文件里面,然后读取到list
变量里面。【非必须】
对于本文的需求来说,停用词除了标点符号,还可以添加一些中性词。因为要计算区分好评或者差评,所以将一些两边都可以使用的中性词,过滤掉的话,对最终结果的准确率提高,是有一定的好处的。
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)) # 去重
分词
如果文章都是使用空格分割的单词的话,这里是不用进行分词的。如果是中文的话,需要对所有的内容进行分割。然后再使用英文逗号分割,组成内容(已经应用停用词列表)。
data = pd.read_csv("./data/评价.csv", encoding="gbk")
_text = []
for c in data["内容"]:
_seg = jieba.cut(c, cut_all=False)
_text.append(','.join(_seg))
参考文章:
统计词频
统计词频的原因,是为了多项式朴素贝叶斯分类器提供由0
和1
组成的输入内容。代码范例如下:
con = CountVectorizer(stop_words=stopwords)
X = con.fit_transform(_text)
这部分的代码解释,请参考:
训练集和测试集
实际上,并不是总是需要对数据集进行切割的。长远来看,可以使用所用数据作为训练集,后续新出现的数据作为测试数据。
测试代码如下,选择了前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
去掉训练集中无关的词。
相关文章
- https://newsn.net/say/python-count-vectorizer.html
- https://newsn.net/say/jieba-cut.html
- https://newsn.net/say/jieba-lcut.html
综述
本文主要使用了一个机器学习的朴素贝叶斯函数进行了数据预测,主要预测某句话的情感倾向是好还是坏。更多机器学习的经验文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。