自然语言处理NLP——文本分类之模型建立
为完待续。。。
一、朴素贝叶斯分类器
朴素贝叶斯分类器是在属性条件独立性假设下,基于贝叶斯定理的有监督的机器学习算法。假设分类变量为yyy,样本特征向量为x1,x2,...,xnx_1,x_2,...,x_nx1,x2,...,xn,则
P(y∣x1,...,Xn)=P(y)P(x1,...,xn∣y)P(x1,...,xn)P(y|x_1,...,X_n)=\frac{P(y)P(x_1,...,x_n|y)}{P(x_1,...,x_n)}P(y∣x1,...,Xn)=P(x1,...,xn)P(y)P(x1,...,xn∣y)
基于属性条件独立性假设,上式可写为:
P(y∣x1,...,xn)=P(y)∏i=1nP(xi∣y)P(x1,...,xn)P(y|x_1,...,x_n)=\frac{P(y)\prod_{i=1}^nP(x_i|y)}{P(x_1,...,x_n)}P(y∣x1,...,xn)=P(x1,...,xn)P(y)∏i=1nP(xi∣y)
使用最大后验估计来估计后验概率P(y∣x1,...,xn)P(y|x_1,...,x_n)P(y∣x1,...,xn),由于P(x1,...,xn)P(x_1,...,x_n)P(x1,...,xn)相对于yyy来说是独立的,可以忽略P(x1,...,xn)P(x_1,...,x_n)P(x1,...,xn),因此贝叶斯判定准则为
y^=arg maxyP(y)∏i=1nP(xi∣y)\hat{y}=\argmax_{y}P(y)\prod_{i=1}^nP(x_i|y)y^=yargmaxP(y)i=1∏nP(xi∣y)
朴素贝叶斯分类器是利用训练集D来估计先验概率P(y)P(y)P(y)和P(xi∣y)P(x_i|y)P(xi∣y)。假设样本独立同分布,那么先验概率
P(y)=∣Dy∣∣D∣P(y)=\frac{|D_y|}{|D|}P(y)=∣D∣∣Dy∣
其中|D_y|表示训练集D中分别为yyy的样本的集合。
假设P(xi∣y)∼N(μy,i,σy,i)P(x_i|y)\sim N(\mu_{y,i},\sigma_{y,i})P(xi∣y)∼N(μy,i,σy,i),其中μy,i\mu_{y,i}μy,i和σy,i\sigma_{y,i}σy,i分别是第yyy类样本在第iii个属性上的均值、方差。则,
P(xi∣y)=12πσy2exp(−(xi−μy)22σy2)P(x_i|y)=\frac{1}{\sqrt{2\pi\sigma_y^2}}exp(-\frac{(x_i-\mu_y)^2}{2\sigma_y^2})P(xi∣y)=2πσy21exp(−2σy2(xi−μy)2)
使用高斯朴素贝叶斯分类器的代码如下:
from sklearn.naive_bayes import GaussianNB
nb=GaussianNB()
nb.fit(train_X,train_y)
print('acc=','%.2f%%'%(nb.score(test_X,test_y)*100))
二、支持向量机
支持向量机是一种有监督的机器学习算法。其基本思想是将低维的样本空间的线性不可分问题转化为更高维样本空间的线性可分问题。支持向量机通过找到使得不同类别的样本在高维样本空间中具有最大间隔的超平面来解决分类问题。超平面方程如下:
wTx+b=0w^Tx+b=0 wTx+b=0
其中w=(w1;w2;...;wd)w=(w_1;w_2;...;w_d)w=(w1;w2;...;wd)为超平面的法向量,决定超平面的方向;bbb为偏移项,决定超平面与原点的距离。
假设样本特征向量为xi∈R,i=1,...,nx_i \in R,i=1,...,nxi∈R,i=1,...,n,样本标签为y∈{1,−1}y \in \{1, -1\}y∈{1,−1},支持向量机的原问题为:
minw,b12wTw\min_{w,b}\frac{1}{2}w^Tww,bmin21wTw
s.t.yi(wTxi+b)≥1,i=1,2,...,ms.t. y_i(w^Tx_i+b) \geq 1,i=1,2,...,ms.t.yi(wTxi+b)≥1,i=1,2,...,m
三、决策树
决策树是一种非参数的有监督学习算法。决策树可以用来处理分类和回归问题。本文利用决策树对上市公司公告进行分类。决策数的训练过程就是根据训练数据生成一颗具备良好泛化性能的决策树的过程。生成决策树的基本流程如下:
输入: 训练集 D={(x1,y1),(X2,y2),...,(xm,ym)}D=\left\{(x_1,y_1),(X_2,y_2),...,(x_m,y_m)\right\}D={(x1,y1),(X2,y2),...,(xm,ym)}
属性集A=a1,a2,...,adA={a_1,a_2,...,a_d}A=a1,a2,...,ad
过程: 函数:TreeGenerate(D,A)TreeGenerate(D,A)TreeGenerate(D,A)
生成节点node;
if D中样本全部属于同一类别C then
将node标记为C类叶节点;return
end if
从A中选择最优划分属性a∗a_*a∗;
for a∗a_*a∗的每一个值a∗va_*^va∗v do
为node生成一个分支;令DvD_vDv表示DDD中在a∗a_*a∗上取值为a∗va_*^va∗v的样本子集;
if DvD_vDv为空 then
将分支节点标记为叶节点,其类别标记为D中样本最多的类;return
else
以TreeGenerate(Dv,A\a∗)TreeGenerate(D_v,A\backslash {a_*})TreeGenerate(Dv,A\a∗)为分支节点
end if
end for
输出: 以node为根结点的决策树
生成决策树的关键在于如何选择最优划分属性,最优的划分属性即是能够使得当前样本集合DDD最快变纯的属性。本文采用CART决策树学习算法,CART算法是Classification and Regression的缩写,该算法使用基尼指数来选择最优划分属性。假设属性aaa有VVV个可能的取值{a1,a2,...,aV}\left\{a^1,a^2,...,a^V \right\}{a1,a2,...,aV},则使用属性aaa对样本集合DDD进行划分,得到VVV个分支节点,设第vvv个分支节点中的样本集合为DvD^vDv,当前样本集合中属性aaa的基尼指数公式如下:
Gini_index(D,a)=∑v=1V∣Dv∣∣D∣Gini(Dv)Gini\_index(D,a)=\sum_{v=1}^V\frac{|D^v|}{|D|}Gini(D^v)Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
其中,Gini(Dv)Gini(D^v)Gini(Dv)是基尼值,用来度量样本集合DvD^vDv的纯度。其公式如下:
Gini(D)=1−∑kpk2Gini(D)=1-\sum_{k}p_k^2Gini(D)=1−k∑pk2
其中pkp_kpk为当前样本集合DDD中第kkk类样本所占的比例。
基尼值反映了当前样本集合中随机抽取两个样本,其类别标记不一致的概率,基尼值越小,则样本集合DDD的纯度越高。基尼指数是度量使用属性值a对样本集合进行划分前后的纯度提升量。基尼指数越小,杨本集合的纯度提升越大。设候选属性集合为AAA,则最优划分属性:
a∗=arg mina∈AGini_index(D,a)a_*=\argmin_{a \in A} Gini\_ index(D,a)a∗=a∈AargminGini_index(D,a)
使用决策树分类器的代码如下:
from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier()
dtc.fit(train_X,train_y)
print('acc=','%.2f%%'%(dtc.score(test_X,test_y)*100))
四、随机森林
随机森林是以决策树为基分类器的集成学习算法。该算法在通过同时生成NNN棵独立的决策树,且在决策树的训练过程中引入了随机属性选择,最后通过投票法决定分类的结果,即少数服从多数。该算法在决策树的基础上,通过引入样本扰动和属性扰动来提升模型的泛化性能。本文生成了100颗相互独立的决策树,并使用投票法得出最终夺得分类结果。随机森林的代码如下:
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import balanced_accuracy_score,f1_score
forrest=RandomForestClassifier(
n_estimators=100,
n_jobs=8,
random_state=26366,
#class_weight="balanced")
forrest.fit(train_X,train_y)
print('acc=','%.2f%%'%(forrest.score(test_X,test_y)*100))
五、卷积神经网络
卷积神经网络(Convolutional neural Network,简称CNN)是一种采取权重共享策略的有监督深度学习算法。其结构主要包括卷积层和采样层。每个卷积层由多个特征映射(feature map)构成,每个特征映射通过滤波器(filter)提取上一层的局部特征得到;采样层又叫池化(pooling)层,其作用是对卷积层得到的特征映射进行亚采样。本文使用卷积神经网络提取文本的特征,输入不定长的向量序列,通过卷积层使用多个不同大小的卷积滤波器得到多个特征映射,并针对这些特征映射作时间维度上的最大池化。
六、深层长短期记忆网络
长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种加入了记忆单元ccc、输入门iii、遗忘门fff及输出门ooo的循环神经网络,这些门和记忆单元的加入避免了循环神经网络在训练过程中容易出现梯度消失或梯度爆炸的现象,能更好的处理长序列文本。
ht=F(xt,h{t−1})h_t=F(x_t,h_{\{t-1\}})ht=F(xt,h{t−1})
it=σ(Wxixt+Whiht−1+Wcict−1+bi)i_t=\sigma (W_{xi}x_t+W_{hi}h_{t-1}+W_{ci}c_t-1+b_i)it=σ(Wxixt+Whiht−1+Wcict−1+bi)
fi=σ(Wxixt+Whfht−1+W+cfct−1+bf)f_i=\sigma (W_{xi}x_t+W_{hf}h_{t-1}+W+{cf}c_{t-1}+b_f)fi=σ(Wxixt+Whfht−1+W+cfct−1+bf)
ct=ft⊙ct−1+it⊙tanh(Whcht−1+bc)c_t=f_t \odot c_{t-1}+i_t \odot \tanh(W_{hc}h_{t-1}+bc)ct=ft⊙ct−1+it⊙tanh(Whcht−1+bc)
ot=σ(Wxoxt+Whoct+bo)o_t=\sigma (W_{xo}x_t+W_{ho}c_t+b_o)ot=σ(Wxoxt+Whoct+bo)
ht=ot⊙tanh(ct)h_t=o_t \odot tanh(c_t)ht=ot⊙tanh(ct)
其中,xtx_txt是文本序列第t时刻的词向量,ht−1h_{t-1}ht−1为t-1时刻隐藏层的状态值,ctc_tct为记忆单元,iti_tit为输入门,控制输入记忆单元的强度,ftf_tft遗忘门,控制记忆单元维持上一时刻值的强度,oto_tot为输出门,控制输出记忆单元的强度,σ\sigmaσ为sigmoid激活函数,W为隐藏层到隐藏层的权重矩阵,bhb_hbh为隐藏层的偏置矩阵,⊙\odot⊙为逐元素乘法操作,tanh\tanhtanh为双曲正切函数。
七、多头自注意力机制网络
基于点积并进行了缩放的多头自注意力机制网络通过计算词向量之间的相似度(点积)来学习词向量之间的相关性,即学习每个词上下文语境,再通过两层全连接神经网络,将学到的含有上下文语境的词向量序列表示到固定的特征空间中,最后通过softmax得到分类为不同类别的概率分布。自注意力机制的基本思路是将输入的词向量序列通过三个不同的权重矩阵得到Q,K,VQ,K,VQ,K,V三个矩阵,其中QQQ称为查询矩阵,K和VK和VK和V是键值对,QQQ与不同的KKK的乘积之和作为KKK对应的VVV的权重。多头是指将词向量序列矩阵,在词向量纬度上均分为多个不同的词向量序列矩阵,然后分别计算词向量之间的相似度,通过基于点积的自注意力网络层之后再将其合并,最后传入接下来的全连接神经网络。基于点积的多头自注意力机制的公式如下:
MultiHead(Q,K,V)=Concat(head1,...,headh)MultiHead(Q,K,V)=Concat(head_1,...,head_h)MultiHead(Q,K,V)=Concat(head1,...,headh)
其中,headi=Attention(QWiQ,KWiK,VWiV)head_i=Attention(QW_i^Q,KW_i^K,VW_i^V)headi=Attention(QWiQ,KWiK,VWiV)
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\frac{QK^T}{\sqrt d_k})VAttention(Q,K,V)=softmax(dkQKT)V
八、ERNIE
由百度开发的预训练模型。使用少量数据就能够达到很好的效果。本人使用ernie训练了多标签文本分类模型。一千条数据通过三次迭代准确率达到了78.5%。
更多推荐
所有评论(0)