APP下载

商品自动分类的贝叶斯方法及Python实现

2019-08-26程树林

关键词:后验朴素贝叶斯

吕 彦,程树林

(安庆师范大学计算机与信息学院,安徽安庆246133)

随着Web2.0的深入应用,用户为互联网贡献了大量的文本信息,实现文本自动分类成为组织信息的一种高效方式。因此,文本分类作为自然语言处理领域中的一个重要应用,得到较为广泛的研究[1-2]。当前,电商平台商品数量越来越多,需要对商品进行分类,便于寻找自己所需的商品,因此商品自动分类无疑是很好的选择。商品分类是根据商品的描述,设计一个分类模型,通过现有已知分类标签的数据进行学习,再利用学习好的模型对新商品进行自动分类。

基于贝叶斯定理和特征条件相互独立的假设的朴素贝叶斯分类方法可有效地用于文本分类。对于给定的训练数据集,在基于样本特征相互独立的假设下,先学习输入(特征)/输出(分类)的联合概率分布;然后,利用贝叶斯定理计算待分类的数据在各类别下的后验概率;最后根据最大后验概率原则输出分类结果。由于分类模型简单、易于理解、学习速度快、效果好,且方便在分布式环境下实现并行化学习和分类[3],以及可以实现实时分类的特点,因此基于贝叶斯的分类方法在各种文本分类应用中较为广泛。朴素贝叶斯分类方法对维度过高的情况,有时分类效果不是很理想。而在基于商品描述的文本分类问题中,商品描述相对较短且特征词较为集中。因此,适合使用朴素贝叶斯分类方法进行商品的自动分类。本文针对第十届中国大学创新创业大赛的第А01问题“网络零售商品分类【浪潮】”,研究朴素贝叶斯理论构建商品自动分类模型,以其提供的50万条商品数据集进行实验,应用Python语言和模型库实现商品的自动分类。

1 数据预处理

第十届中国大学创新创业大赛的第А01问题“网络零售商品分类【浪潮】”数据集包含了50万条已标记的数据,原始数据集中每件商品仅给出了描述信息以及商品所属的类别,示例如图1所示。

图1 数据集示例截图

原始数据不能直接用来分类,需要进行数据预处理。(1)使用Python的pandas库中pandas.DataFrame.drop()方法滤除缺失的数据。由于朴素贝叶斯是一个概率分类器,想要计算出某词汇描述属于各分类的概率,需要通过正则表达式对商品描述信息进行分词处理,即将所有商品描述信息去除所有的非文字部分后利用jieba分词器对商品描述信息进行词语切分,如图2所示。(2)清除中文停用词,这些停用词对商品描述信息本身并没有多大意义。部分清除后的商品描述信息如图3所示。

图2 切词后数据集示例

图3 清除停用词后商品描述信息示例

2 特征提取与模型构建

数据集中商品描述为短文本,经过切词后得到商品的特征信息。采用sklearn库中的CountVectorizer类进行特征词的量化计算。CountVectorizer是一个文本特征提取方法,其思想是先根据训练集中所有样本,不考虑其出现顺序,只将训练文本中每个出现过的词汇单独视为一列特征,构成一个词汇表(Vocabulary List),该方法又称为词袋法(Bag of Words)。然后,使用Python中的fit_transform函数将特征词的信息转换为词频矩阵。

设根据商品描述提取n个特征词,且有K个商品类别,则输入空间X⊆ℜn定义为n维向量的集合,输出空间Y={y1,y2,…,ym}为分类标记形成的集合,所有类别值形成类别空间C={c1,c2,…,cK},则N个样本元素的训练数据集表示为

其中,任意的(xi,yi)和(xj,yj)两个元素满足独立同分布的条件。若在输入空间上给定随机向量xi=(xi1,xi2,…,xin)∈ℜ,则输出的类标记为y∈Y,P(xi,y)为xi和y的联合概率分布。

通过对训练集的学习,得到联合概率分布P(xi,y),即学习先验概率分布及条件概率分布。根据学习到的模型计算输入xi属于每一种输出类别的后验概率分布P(y=ck|xi),选择最大后验概率作为最终的输出,后验概率最大化表明对于任意输入xi所得输出y在所有类别中,期望风险最小化[4],因此朴素贝叶斯分类方法根据后验概率最大化准则计算最终输出。

朴素贝叶斯分类模型学习的过程实际上是估计先验概率和条件概率,即P(y=ck)和P(x=xi|y=ck),可以使用极大似然估计[5]。但极大似然估计可能会出现所估计的概率值为0的情况,这将导致在对新商品进行预测分类时后验概率的计算产生一定的误差。因此,本文提出在商品分类时采用拉普拉斯平滑(Laplace Smoothing)修正后验概率,进而生成朴素贝叶斯分类方法。在估计条件概率时使用贝叶斯估计,则先验概率的贝叶斯估计为

样本xi的第j个属性取值为ajl的条件概率的贝叶斯估计为

其中,λ≥0,当λ=0时为极大似然估计,当λ=1为拉普拉斯平滑的贝叶斯估计,N为商品训练集样本个数,K为商品类别个数,Kj为商品第j个特征词的取值个数,显然这里Kj=2,即表示存在与否。

3 实验结果

针对数据集中的50万条数据,本文随机划分20%为测试集,80%作为训练集,并进行了5次交叉实验。Python中运用train_test_split进行数据集的划分,关键代码如下:

from sklearn.model_selection import train_test_split

#分割数据

x_train,x_test,y_train,y_test=train_test_split(df_train[‘contents_clean’].values,df_train[‘label’].valaues)

为保证每个维度的特征数据方差为1,均值为0,使得预测结果不会被某些维度过大的特征值主导,本文应用了多项式朴素贝叶斯分类算法,即MultinomialNB。实验环境为Аnoconda3(64)的Jupyter Notebook和Python 3.6,调用之前,通过以下方法引入库numpy和sklearn:

import numpy as np

from sklearn.navie_bayes import MultnomialNB

实验中使用到的关键分类方法为sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None)。其中,alpha为浮点型,可选项,默认1.0,拉普拉斯平滑参数本文使用了默认值alpha=1.0;fit_prior为布尔型,可选项,默认为True,表示是否学习先验概率,取False值时表示所有类标记具有相同的先验概率,本文使用了True;class_prior为类似数组,数组大小为(n_classes),默认None。

划分好数据集后先运用fit()方法从一个训练集中学习模型参数,其中就包括归一化时用到的均值和标准偏差,而测试数据只需要在原先的基础上进行归一化,再运用transform()方法对数据进行标准化处理。表1是根据已得到的标准化数据,采用多项式贝叶斯分类器进行拟合后的预测结果。5次预测精度相当,最终平均精度为0.731,预测效果较好。

表1 实验预测结果

4 结束语

在电子商务时代,商品的自动分类具有重要的研究意义和实际应用价值。本文针对商品描述的特点,提出使用基于多项式朴素贝叶斯方法对商品进行自动分类,并在一个具有50万条数据的真实数据集上进行了验证。实验结果表明,朴素贝叶斯分类效率较为稳定,预测准确率较高,且对缺失数据不太敏感。但由于样本特征属性之间相互独立是朴素贝叶斯方法的前提,使得朴素贝叶斯分类方法在满足该条件的数据集上分类效果较好,而对于不满足此条件的数据集上分类效果欠佳。因此,在实际应用过程中,当特征属性个数非常多、属性之间的相关性比较大时,不建议使用朴素贝叶斯分类方法。

猜你喜欢

后验朴素贝叶斯
隔离朴素
基于对偶理论的椭圆变分不等式的后验误差分析(英)
朴素的安慰(组诗)
他是那样“笨拙”和朴素——30多年后,我们为什么还需要读路遥?
贝叶斯统计中单参数后验分布的精确计算方法
最神奇最朴素的两本书
贝叶斯公式及其应用
一种基于最大后验框架的聚类分析多基线干涉SAR高度重建算法
基于贝叶斯估计的轨道占用识别方法
一种基于贝叶斯压缩感知的说话人识别方法