突发事件的分类技术

更新于 2026年10月10日 版权声明
(二)突发事件的分类技术

文本在经过向量化处理后获得了其在向量空间中的表示,向量的每个维度可以作为特征用于分类器的构建。基于机器学习方法的常见分类算法已经在前文列出,这里对这些算法的一些细节进行论述。

1.传统机器学习分类算法

KNN是基本的分类算法之一,是一种典型的监督学习方法,由于它没有训练过程,在输入测试样本时才开始进行运算,故又被称为“懒惰学习”的典型算法。[26]KNN的思想非常纯粹,对于给定的带标签的训练数据集和测试数据集,对测试集中每一条数据,选择其与训练数据集中所有样本距离最小的k个对应样本的标签,即可得到测试样本的分类。过程如下。

①输入带标签的训练数据和测试数据。

②遍历测试集,对测试集中每一条测试样本计算与训练数据集中所有样本里距离最近的k个,这里k值已经预先设定好。

③对每一条测试集数据的k个最近训练样本标签进行投票,按多数表决,哪一类占比最大,则测试样本被分为哪一类。

从上面的计算过程可以看到,KNN算法效果的决定性因素主要有三个:带标签的数据、距离的计算方式、k值的选取。KNN是一个典型的监督学习算法,必须知道数据的标签才能进行分类。距离的计算方式有很多种,最常见的距离计算方式为欧几里得距离,其他方法还有曼哈顿距离、切比雪夫距离等,不同的计算方式可能会对分类结果造成一定影响。另外k值应该选取合适,若k值过小则容易受噪声点干扰,k值过大则计算复杂,而且通常k值需要选奇数而非偶数(为了避免票数持平的情况)。遍历整个训练集计算距离并没有太大必要,所以为了降低线性遍历带来的巨大时间复杂度,便从递归的角度出发设计了k-d树算法,以进行计算上的优化。[27]

决策树是一种利用树状数据结构来进行分类或者回归的算法,在决策树的生成中,我们通过信息论里面几个数值的计算判断分类,例如熵、信息增益、增益率、基尼指数等。在决策树中非叶子节点表示属性,叶子节点表示样本的类别,自顶而下地生成。对于属性全部为离散型的带标签数据进行分类,我们提出了最早的ID3决策树算法。[28]

ID3决策树算法的核心思想是以信息增益来度量特征选择,选择信息增益最大的特征进行节点分裂,采用自顶向下的贪婪搜索遍历可能的决策树空间。其基本步骤如下。

①初始化特征集合和数据集。

②计算数据集的信息熵,并遍历特征集计算条件熵。

③选择信息增益最大的特征作为分类节点,并更新数据集和特征集(删除已经使用的特征)。

④重复②、③两步直到无法继续细分特征集。

其中,信息熵的定义为:

图示

条件信息熵的定义为:

图示

信息增益则被定义为:

图示

ID3决策树遵循奥卡姆剃刀定律,生成规则较简单,但只能处理特征属性全部为离散型数据的分类问题。为应对属性中含有连续型数据的分类任务,ID3决策树算法经改进得到了C4.5算法。[29]

C4.5算法的大致流程与ID3算法一样,不同的是,C4.5算法选择用信息增益率而非信息增益来处理数据。信息增益率的定义为:

图示

C4.5算法最大的特点是克服了ID3决策树算法对特征数目的偏重这一缺点,引入信息增益率来作为分类标准。它将连续特征离散化,以某个阈值作为划分点,将连续数据情形变为离散情形,计算以划分点作为二元分类点时的信息增益,并选择信息增益最大的点作为该连续特征的二元离散分类点。这里值得注意的是,C4.5算法并不是直接用信息增益率最大的特征进行划分,而是使用一个启发式方法:先从候选划分特征中找到信息增益高于平均值的特征,再从中选择信息增益率最高的特征。

但无论是ID3决策树还是C4.5算法都无法进行分类任务。对于回归任务,布雷曼和弗里德曼等人提出了CART(classification and regression tree)[30]。

CART包含的基本过程有分裂、剪枝和树选择。基本操作包括如下几个步骤。

①分裂:分裂过程是一个二叉递归划分过程,对应属性既可以是连续型的也可以是离散型的。

②剪枝:采用代价复杂度剪枝,从最大树开始,每次选择训练数据熵对整体性能贡献最小的那个分裂节点作为下一个剪枝对象,直到只剩下根节点。CART会产生一系列嵌套的剪枝树,需要从中选出一棵最优的决策树。

③树选择:可以用单独的测试集评估每棵剪枝树的预测性能,也可以采用交叉验证。

CART选择使用基尼指数而非信息增益和信息增益率作为评价标准,在简化模型的同时还保留了熵模型的优点。基尼指数代表了模型的不纯度,基尼系数越小,不纯度越低,特征越好。这和信息增益(率)正好相反。ID3决策树算法和C4.5算法虽然在对训练数据集的学习中可以尽可能多地挖掘信息,但是其生成的决策树分支、规模都比较大,CART算法的二分法可以简化决策树的规模,提高生成决策树的效率(见图3-11)。

决策树还有一个重要的防拟合措施就是剪枝。决策树剪枝分两种:预剪枝和后剪枝。预剪枝的停止准则包括树的最大深度、叶子节点的数目和准确度等;缺点是容易造成欠拟合。后剪枝是自底而上计算信息熵,判断是否剪除;最大的缺点是计算信息熵带来的时间开销大。[31]

支持向量机算法是在线性可分情况下的最优分类面的基础上提出的。[32]如图3-12所示,所谓最优分类,就是要求分割超平面(在二维空间中为直线),不但能够将两类无错误地分开,而且使两类之间的分类间隔最大,前者是保证经验风险最小,而后者则使推广性中的置信范围最小。

对于二分类问题(暂且拿二分类为例),我们找两个分割超平面。

图示

目标是使这两个平行的超平面间距最大,从而能够更好地实现分割。由几何原理可得,两个平行的超平面的距离为图示。

就这样,我们导出来一个凸优化问题:

图示

图3-11 一棵CART决策树示例

图示

图示

图3-12 支持向量机示意图

但实际上并非所有的样本都是严格线性可分的,可能存在一些噪声样本对超平面造成干扰。退一步说,即使样本在特征空间中线性可分,也很难判断其是不是由于过度拟合造成的。也就是说,我们不能刻意要求所有的变量都线性可分,只能说让绝大部分数据正常,而允许一小部分数据被误分类。这就是为什么我们要引入软间隔的概念。引入软间隔后的模型变为:

图示

支持向量机曾一度掀起了机器学习的浪潮,其原因就在于核方法的引入。核方法使得数据能够由低维向高维映射,让形如异或问题这样的线性不可分问题得到解决。非线性问题往往不好求解,所以希望能用解线性分类问题的方法求解,因此可以采用非线性变换,将非线性问题变换成线性问题。对于这样的问题,可以将训练样本从原始空间映射到一个更高维的空间,使得样本在这个空间中线性可分,如果原始空间维数是有限的,即属性是有限的,那么一定存在一个高维特征空间使得样本可分。

这一模型基于凸优化理论中的KKT条件求解。引入拉格朗日乘子:

图示

解方程并消去w和b,则模型如公式(3.15)所示,KKT条件如公式(3.16)所示:

图示

图示

若使用核函数将数据映射到更高维度的空间,则公式(3.15)变为公式(3.17)的形式:

图示

经过SMO算法等数值方法可以求解出对应拉格朗日乘子的值[33]。另外,近年来随着启发式算法与进化计算的发展,使用遗传算法等方法对支持向量机进行求解的研究引起了业界的广泛关注。[34]

朴素贝叶斯基于贝叶斯统计理论,它的原理基于贝叶斯公式[35]:

图示

然而仅仅是这样一个简单的条件概率变换,却使得我们从贝叶斯统计理论的角度进行的分析变得更加容易。对于含有多个属性和一个标签的分类问题,当给定所有属性值来预测分类时,我们需要判断给定属性值对应到每一个类的概率。用于转换的条件概率公式如下:

图示

相对而言,我们在获得数据集时就可以计算相关概率P(yi)和P(aj|yi),真正统计起来比较复杂的是P(x)。当输入数据集时我们的训练过程就是计算P(yi)和P(aj|yi),测试时统计P(x)即可做出较为精准的预判。但朴素贝叶斯需要满足一个基本假设,即变量之间相互独立,这也是“朴素”一词的由来。这一方法被广泛应用于文本模型的分类中,例如垃圾邮件的识别等领域。

理论上,朴素贝叶斯与其他分类方法相比,具有较小的误差率。但是,实际上并非总是如此,因为,朴素贝叶斯在给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的。在属性个数比较多或者属性之间相关性较大时,分类效果就不好;而在属性之间相关性较小时,朴素贝叶斯性能较好。也正是这一“朴素”的假设,导致很多参数被误判,使得结果发生较大偏差。朴素贝叶斯虽然处理速度相较基于核方法与凸优化方法的支持向量机更快,但往往精确度不够高。[36](https://www.daowen.com)

2.集成学习中的分类算法

集成学习作为一种思想,将多个相同或不同的学习器集成到一起,效果往往比单一模型更好。[37]集成学习先产生一组个体学习器,再用某种策略将它们结合起来,若只包含同种类型的个体学习器,称为同质集成,当中的个体学习器称为同质基学习器,相应的算法称为基学习算法。若集成不同类型的个体学习器,称为异质集成,当中的个体学习器称为组建学习器或异质基学习器。[38]

若想要集成模型取得好的效果,个体学习器应有一定的准确性,并且要有多样性,即个体学习器间具有差异。不过基学习器的性能也无须太好。AdaBoost和随机森林是集成学习的两个典型例子,也是Boosting系列算法和Bagging系列算法的代表。

AdaBoost算法基本原理就是将多个弱分类器(弱分类器一般选用单层决策树或线性模型)进行合理的结合,使其成为一个强分类器。[39]AdaBoost采用迭代的思想,每次迭代只训练一个弱分类器,训练好的弱分类器将参与下一次迭代的使用。也就是说,在第N次迭代中,一共就有N个弱分类器,其中N-1个弱分类器是以前训练好的,其各种参数都不再改变,而本次训练的是第N个分类器。其中弱分类器的关系是第N个弱分类器更可能分对前N-1个弱分类器没分对的数据,最终分类输出要看这N个分类器的综合效果。可以很明显地看到,这个模型是串行生成分类器的,每次生成的新分类器总是基于先前生成的更弱一些的分类器。

AdaBoost中有两种权重,一种是数据的权重,另一种是弱分类器的权重。其中,数据的权重主要用于弱分类器寻找其分类误差最小的决策点,找到之后用这个最小误差计算出该弱分类器的权重。分类器权重越大,说明该弱分类器在最终决策时拥有更大的发言权。它会对每个样本赋权值,训练样本是带有标签的,权值代表重要性,可以调整误差。但是出乎意料的是,AdaBoost调整误差的方式并非优化基学习器,反倒是把误分类的样本权值变大。这是因为所有的样本都有很高的区分度,对于一个集成学习器来讲,基学习器弱一点其实无伤大雅,恰恰还能增强分类器之间的差异性,我们的最终目的是让集成后的结果被准确分类。

随机森林就是通过集成学习的思想将多棵树集成到一起的一种算法,它的基本单元是决策树。随机森林是Bagging系列的典型代表,而Bagging又是并行式集成学习方法的著名代表,是基于自助采样法通过有放回的取样来提高学习器泛化能力的一种高效的集成学习方法。[40]由于随机森林采用的是Bootstrap采样,那么基学习器大概只使用了初始训练集中约63.2%的样本,剩下36.8%的样本可以用作验证集来对泛化性能进行估计。由于基学习器数量足够多,每个基学习器并不需要使用全部特征,所以每个基学习器在构建过程中都只随机使用了部分特征。

随机森林相比于AdaBoost有很多优点,例如训练可以并行化,在大规模样本的训练方面具有速度优势等。其由于通过随机选择决策树划分特征列表,所以在样本维度比较高的时候,仍然具有比较高的训练性能。由于存在随机抽样,训练出来的模型方差小,泛化能力强,并且对于部分特征的缺失不敏感。但问题在于,在某些噪声比较大的特征上,随机森林模型容易陷入过度拟合。

GBDT是对决策树的改进,是一种基于集成思想的Boosting学习器,采用梯度提升的方法进行每一轮的迭代,最终组建出强学习器,因此其运行往往要生成一定数量的树才能达到令我们满意的准确率。当数据集大且较为复杂时,运行一次极有可能需要几千次的迭代运算,这将对我们使用算法造成巨大的计算瓶颈。事实上,GBDT往往被作为一种框架,有很多算法都基于GBDT进行改进。两个应用极为广泛的例子就是XGBoost和LightGBM。

XGBoost的全称是extreme gradient boosting tree,它最大的特点在于能够自动利用CPU的多线程进行并行运算,同时在算法上提高了精度[41]。XGBoost同样属于Boosting系列,每次迭代就生成一棵新的树。它在生成每一棵树的时候,以之前生成的所有树为基础,向着最小化给定目标函数的方向多走一步。XGBoost的目标函数为:

图示

在合理的参数设置下,我们往往要生成一定数量的树才能达到令人满意的准确率。在数据集较大较复杂的时候,我们可能需要几千次迭代运算,不断地添加树,不断地进行特征分裂来生长一棵树。每次添加一个树,其实是学习一个新函数f(x),去拟合上次预测的残差。当我们训练完成得到k棵树,为预测一个样本的分数,要做的是根据这个样本的特征,对应每棵树中的一个叶子节点,每个叶子节点对应一个分数最后只需要将每棵树对应的分数加起来就得到该样本的预测值。很显然,一棵树是由一个节点一分为二,然后不断分裂形成的。那么树是怎么分裂的就成为我们接下来要探讨的关键。对于一个叶子节点如何进行分裂,XGBoost作者在其原始论文中给出了一种分裂节点的方法:枚举所有不同树结构的贪心算法。不断地枚举不同树的结构,然后利用打分函数来寻找出一个最优结构的树,接着将其加入模型中,不断重复这样的操作。这个寻找的过程使用的就是贪心算法。选择一个特征分裂,计算目标函数最小值,然后重复操作,枚举完毕,选择最优节点分裂得到新的树。

XGBoost使用了一阶和二阶偏导,二阶导数有利于梯度下降更快更准。使用泰勒展开得到的函数做自变量的二阶导数形式,可以在不选定损失函数具体形式的情况下,仅仅依靠输入数据的值就进行叶子分裂优化计算,本质上是把损失函数的选取和模型算法的优化与参数选择分开了.这种去耦合增加了XGBoost的适用性,使得它可以按需选取损失函数,既可以用于分类,也可以用于回归。泰勒展开的过程如公式(3.21)所示:

图示

最终,切分点的分数计算公式如公式(3.22)所示,示意图如图3-13所示。

图示

图示

图3-13 XGBoost选择切分点示意图[42]

XGBoost在目标函数中加上了正则化项,基学习器为CART时,正则化项与树的叶子节点的数量和值有关。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的I2模的平方和,降低了模型的方差,使训练出来的模型更加简单,防止了过度拟合。另外,使用泰勒公式使得计算速度更快。同时,XGBoost支持并行,能够利用CPU的多线程机制。但相比于后续提出的一些算法仍有些冗余操作可以简化。

常用的机器学习算法,例如神经网络算法等,都可以以mini-batch的方式训练,训练数据的大小不会受到内存限制。而GBDT在每一次迭代的时候,都需要多次遍历整个训练数据集。如果把整个训练数据集装进内存,则会限制训练数据规模的大小;如果不装进内存,反复地读写训练数据又会消耗非常多的时间。尤其是面对工业级海量的数据,普通的GBDT算法是不能满足需求的。

LightGBM的提出主要是为了解决GBDT在海量数据中遇到的问题,让GBDT可以更好更快地用于工业实践,为了在不损害准确率的条件下加快GBDT模型的训练速度,LightGBM在传统的GBDT算法上进行了几项重要的优化。[43]

①采用基于Histogram的决策树算法,提升速度。

②采用单边梯度采样(gradient-based one-side sampling,GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用具有高梯度的数据即可,相比XGBoost须遍历所有特征值节省了不少时间和空间上的开销。

③使用带深度限制的leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长(level-wise)的决策树生长策略,导致了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的leaf-wise算法,减少了不必要的搜索次数,使得GBDT性能得到提升。

3.深度学习中的分类算法

深度学习方法也常被用于文本分类中。卷积神经网络在进行文本分类时的一个常用的架构就是TextCNN。TextCNN网络是2014年提出的用来做文本分类的卷积神经网络,其由于结构简单、效果好,在文本分类、推荐等NLP领域应用广泛。[44]TextCNN的结构比较简单,输入数据首先通过一个embedding layer,得到输入语句的embedding表示,然后通过一个convolution layer,提取语句的特征,最后通过一个fully connected layer得到最终的输出。

图3-14代表了TextCNN中的模型结构。与图像当中CNN的网络相比,TextCNN最大的不同便是输入数据的不同。图像是二维数据,图像的卷积核是从左到右、从上到下进行滑动,然后通过卷积核映射来进行特征抽取。而以自然语言为代表的序列模型是一维数据,虽然经过word-embedding生成了二维向量,但是对词向量而言,无法进行从左到右的滑动卷积。TextCNN的成功更多的是发掘序列模型的卷积模式,通过引入已经训练好的词向量在多个数据集上实现了非常良好的表现,进一步证明了构造更好的embedding是处理自然语言处理领域各项任务的关键能力。

图示

图3-14 TextCNN的模型结构[45]

TextCNN最大的优势是网络结构简单,在模型网络结构如此简单的情况下,通过引入已经训练好的词向量依旧有不错的效果。其网络结构简单导致参数数目少、计算量少、训练速度快,TextCNN是很适合中短文本场景的强baseline,但不太适合长文本场景,因为卷积核尺寸通常不会设置得很大,无法捕获长距离特征。同时max-pooling也存在局限,会丢掉一些有用特征。此外,TextCNN和传统的N-Gram词袋模型本质是一样的,它的优越的处理能力很大部分来自词向量的引入,解决了词袋模型的稀疏性问题。

循环神经网络被用于文本等序列模型的建模中。文本分类问题就是对输入的文本字符串进行分析判断,之后再输出结果,但字符串无法直接输入RNN网络,因此在输入之前需要先将文本拆分成单个词组,将词组编码成一个向量,每轮输入一个词组,得到的输出结果也是一个向量。[46]嵌入表示将一个词对应为一个向量,向量的每一个维度对应一个浮点值,动态调整这些浮点值使得编码和词的意思相关。这样网络的输入、输出都是向量,最后再进行全连接操作将其对应到不同的分类即可。

如图3-15所示,RNN进行文本分类时须将问题抽象为序列,最后使用softmax进行分类预判。RNN网络不可避免带来的问题就是最后的输出结果受最近的输入影响较大,而之前较远的输入可能无法影响结果,这就是信息瓶颈问题。为了解决这个问题,双向LSTM被引入模型。双向LSTM不仅增强了反向信息传播,而且每一轮都会有一个输出,将这些输出进行组合之后再传给全连接层。

图示

图3-15 使用RNN进行文本分类

从前面介绍的一些方法中可以发现,当我们使用深度学习进行文本分类时,先要基于上下文对文本进行向量化编码,然后通过池化层得到句子表示的再分类。在最终池化时,max-pooling通常表现得更好,因为文本分类经常是主题上的分类,从句子中部分主要的词就可以得出结论,其他大多是噪声,对分类没有意义。但到更细粒度的分析时,max-pooling可能又会把有用的特征去掉,这时便可以用attention进行句子表示的融合,如图3-16所示[47]。

另一个经典的文本分类模型是HAN(hierarchy attention network)(见图3-17),其主要用于句子级别的分类,虽然用到长文本、篇章级也是可以的,但速度、精度都会下降,于是有研究者提出了层次注意力分类框架,即hierarchical attention。它首先将文本分为句子、词语级别,对每个句子用BiGRU-Att编码得到句向量,再对句向量用BiGRU-Att得到doc级别的表示[48]。而attention是在每一个级别的编码进行累加前,加入一个加权值,根据不同的权值对编码进行累加。

图示

图3-16 结合attention的LSTM[49]

CNN网络不能完美处理输入长短不一的序列的问题,但是它可以并行处理多个词组,且效率更高,而RNN可以更好地处理序列式的输入,将两者的优势结合起来就构成了R-CNN模型。R-CNN模型首先通过双向RNN网络对输入进行特征提取,再使用CNN做进一步特征提取,之后通过池化层将每一步的特征融合在一起,最后经过全连接层进行分类。所以,形如BiLSTMCNN这样的模型也常常被用于文本分类。[50]

BERT在文本分类中取得了显著的成就。前面我们已经介绍过BERT进行文本向量化的pre-training过程,在文本经过向量化以后,BERT还能够根据不同的任务对结构进行微调,从而得到适合不同任务的结构。对于文本分类任务而言,测试结果表明BERT在大规模文本分类上展现出了比以往模型更强大的潜力。

图示

图3-17 HAN的基本结构[51]

4.突发事件的分类与统计

本书的文本分类是基于BERT实现的。我们在利用BERT进行文本向量化以后,将人工标注的部分数据作为训练集,对数据进行两重分类。并使用开源的BERT预训练模型先进行突发事件的二分类,经过模型蒸馏等操作过滤掉2008—2021年将近300G的微博文本中的大部分内容,保留了478148条突发事件文本。随后,我们结合一些特征事件关键词与正则表达式等方法,将突发事件文本做进一步细粒度分类,得到4个大类18个小类的数据。类别结构如图3-18所示。

图示

图3-18 突发事件的事件分类

由于这些报道中有不少文本是对同一事件的重复报道,我们根据事件爆发的时间、地点和事件类型对数据进行去重,保留了109593件突发事件数据。而在这些突发事件数据中,各类数据的数量和占比如图3-19所示。

图示

图3-19 事件发生频数统计

可以看到,刑事案件的数目是最多的,多达62983个事件,而涉外冲突是最少的,只有4个事件。在这些事件的报道中,报道内容字数的概率密度分布如图3-20所示。

图示

图3-20 字数的概率密度分布

可以明显地看到,字数的分布是一个有偏分布,最高峰在142字。报道内容大都不超过1000个字,多数报道不超过400字,这很符合微博这类网络媒体的写作风格,要求准确简单地表述事件的主要内容,并且也符合易读性原则。相较于长文本,一些简单的文本往往更容易被读者理解。

对报道时间的统计如图3-21所示。

报道的统计基于年、月、日、小时四个不同的粒度。从年份图来看,2019年的突发事件是最多的。在2009—2019年,突发事件的增速大体是逐渐增长的。但这并不能说明这一阶段社会的不稳定因素正在增多,而是因为微博平台的发展,媒体在突发事件的预警和防控中扮演着越来越重要的角色。这证明了传媒预警的重要性。而2020—2021年突发事件的骤减,则是由于疫情减少了公民活动,使得实体之间的社会性冲突与矛盾减少。就月份统计情况来看,突发事件更多地集中在7—8月,也就是夏季。这也符合我们的生活经验与认知,包括一些常见的自然灾害例如暴雨就常在夏季爆发,继而引发其他突发事件,例如洪涝灾害、地质灾害、环境污染等,继而引发群体极化等非常态现象。就小时而言,报道在0—7时之间较少,因为这一时间段大多数人都在休眠。而自9时到达一个较高的水平以后持续十余个小时。可以看到上午的发帖较为集中在9时左右,下午的发帖时间分布比较均匀。以日为粒度,我们制作了密度分布图,可以看到爆发数量随日期推演的分布密度。其大致分布情况与上述统计特性一致,有趣的是在2012—2020这几年内出现了几个高峰,尤其是2019年这类高峰是非常多的。而且这几个高峰都在夏季,从而进一步验证了我们的结论。

图示

图3-21 报道的时间统计

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)