大规模文本分类实验-项目日志

20 篇文章 2 订阅
16 篇文章 0 订阅

文本分类实验项目日志(最后更新-2019.07.19)

1 One vs rest & stacking 二分类多分类器文本分类实验

1.1 描述

根据5-6月份 one vs rest(all)和stacking的融合实验的若干问题,6月中旬进行了改进。
5-6月份最终形成的方案为:融入KB;加入第一层分类器;改变KB返回类目数量,形成多个对比实验。具体方法和结果详见1.3.4
5-6月份实验存在的问题说明如下:
(1) 类间的相似性可能是影响最终结果的主要因素;
(2) 采取one-hot文本表示出现的维度过大以及OOA问题(如对于5:4:1比例,测试集占1/10,若测试集中某个词未出现在训练二分类器中的词空间里,则不能表示该特征,那么测试时会失去该特征,进而影响测试结果);
(3) 最终准确率难以提升。

6月初提出的改进方案如下:
(1) 去掉知识库;
(2) 加入第二层层级分类,使用fasttext训练二级分类器。
(3) 使用词向量表示文本特征。
1.2、 1.3给出了具体的实验设计和结果。

1.2 实验设计

1.2.1 旧方法

详细的实验方法如图1所示。(旧版本)
在这里插入图片描述
图1 文本分类框架
整个实验可分为6个环节:数据预处理,训练一级fasttext分类器,构建三级分类知识库,训练二分类分类器,训练融合分类器和测试分类器。每个环节的详细方法如下:

  1. 数据预处理。原始数据集保存在两个txt文件,大小共约680MB,具体数据形状如图2所示。
    在这里插入图片描述
    图2 数据集形状
    根据实验设计思路,需要抽取并生成新的数据集。表1列出了4次实验的数据集详细信息,其中1-3次是5月份实验用数据集,第4次是6月份数据集,第4次与前3次的区别是:(1)类别数量增加一倍左右;(2)每个三级类的文档数量未固定,即类别数据分布不均衡。(3)细化数据清洗环节(如抽取时考虑类号名字特点、去除无效文档、去除重复词语等)。
    表1 数据集介绍
实验次数大小类别数量文档数量
17MB101000*10=10000
2332MB4671000*467=467000
3278MB3581000*358=358000
4312MB773727367

数据集划分:每个类下,训练二分类数据集:训练融合分类数据集:最终测试集 = 5:4:1。
下面的流程主要以实验4的数据集为例。
2. 训练一级分类器。将所有数据集按照每行数据为‘__label__A,word1\tword2’的格式存储。A代表一级分类号,word1代表文档分词后的第一个词。然后使用fasttext模型训练分类器,最后抽取总数据集的20%作为一级分类器测试。
3. 训练二分分类器。对于每个三级类,长度为 l e 3 l e n g t h le3_{length} le3length,那么该类的二分训练集长度为 l e 3 b i n a r y L e n g t h = l e 3 l e n g t h ∗ 0.5 le3_{binaryLength} = le3_{length}*0.5 le3binaryLength=le3length0.5,从这些数据中随机抽取10个子集,然后加入其它三级类的若干数据(长度大致与属于本类数据相同,记为 s u b n sub_n subn),最终的目标是使得每个子集包含sub_n个属于该类的文档, s u b n sub_n subn个不属于该类的文档。这 2 ∗ s u b n 2*sub_n 2subn个文档使用机器学习分类算法训练一个二分类器。共得到773*10=7730个分类器。
4. 训练融合分类器。将 l e 3 l e n g t h le3_{length} le3length,那么该类的融合训练集长度为 l e 3 m e r g e L e n g t h = l e 3 l e n g t h ∗ 0.4 le3_{mergeLength} = le3_{length}*0.4 le3mergeLength=le3length0.4,抽取 l e 3 m e r g e L e n g t h le3_{mergeLength} le3mergeLength条该类文档和不属于该类的 l e 3 m e r g e L e n g t h le3_{mergeLength} le3mergeLength条文档组合成 2 ∗ l e 3 m e r g e L e n g t h 2*le3_{mergeLength} 2le3mergeLength条文档,然后用10个该类的二分分类器进行分类,结果以概率形式给出(分到类A81的概率),并保存为长度为10的向量,标签为1或0(如“A81”类数据,则标签记为1,非“A81”类记0)。然后将这些向量进行训练,得出融合的分类器。这样共得到773个融合分类器。
5. 测试分类器。测试过程包括5个方面:测试一级分类器;知识库(KB)分类;测试二分分类器;测试融合分类器;测试系统分类器。其中,测试系统分类器有多种方案,将在1.3.4节的结果和分析中提到。

1.2.2 新方法

新方法与旧方法的区别如下:

  • 去掉KB。原因是经过实验发现,加入KB会过滤掉正确的类号;去掉KB的副作用是增加测试的时间开销。
  • 加入二级分类。在一级分类的基础上加入二级分类,原因是为了降低测试的时间开销。
  • 文本表示阶段采用词向量方法。原因是原来方法(tf-idf)会生成词汇映射表文件(将近900MB),并且会造成维度过大和OOA问题;使用词向量可以避免前两个问题,OOA问题与词向量模型以及数据集有关。
  • 使用词向量中的词作为自定义词典分词。这样做的好处是在文本表示阶段尽可能使每一个特征(词语)都能够用词向量表示。(目前还在实验阶段)
    新方法的具体步骤如下:
  1. 数据预处理。同1.2.1的1,仅使用第4次抽取的数据集。
  2. 训练一级分类器。同1.2.1的2。
  3. 训练二级分类器。将所有数据集按照每行数据为‘__label__A8,word1\tword2’的格式存储。A8代表二级分类号,word1代表文档分词后的第一个词。然后使用fasttext模型训练分类器,最后抽取总数据集的20%作为测试。
  4. 训练二分分类器和融合分类器。步骤与1.2.1的3和4大致同,仅文本表示阶段不同。
  5. 测试分类器。测试过程包括5个方面:测试一级分类器;测试二级分类器;测试二分分类器;测试融合分类器;测试系统分类器。其中,测试系统分类器较复杂,将在1.3中提到。

1.3 实验结果和分析

1.3.1 实验-旧方法

本次实验加入了层级分类(FC)和知识库(KB),第一层分类器使用fasttext算法,第二层分类器使用svm算法。其中,fasttext的测试结果为0.95.

最终测试时,经过和老师及学长讨论形成了两种方案,后来经过实验,又总结了几种优化策略。下面是这几种方案的介绍。
(1) 文档首先经过KB,得到20个三级类号,然后仅在这20个类的20*10=200个二分类器和20个融合分类器中进行分类测试。记为way_1。
(2) 文档首先经过7730个二分类器和773个融合分类器,然后将所有分类结果按概率从大到小排序,与KB的结果取交集。记为way_2。
(3) 加入一级分类。文档首先经过一级分类器,得到一级分类号(如A),并经过KB,得到20个三级分类号(如A81,A84,B02,…,C81),然后仅在一级分类号下并且存在于20个三级分类号的分类器中进行分类测试(如在A81,A84中测试)。记为way_3。
以上三种方案,把最后得到排名前三的三级类号作为最终的分类结果。
此外,加入了baseline,即不加入KB和层级分类的结果,如下表所示。
表2 实验4结果

实验代号准确率运行时间/s
Baseline0.18458113(约16h)
Way_10.21514886(约4.1h)
Way_20.21628106(约7.8h)
Way_30.2317035(约2h)

从表2可以看出,增加KB,准确率提高了近0.03,并且时间性能大大改善。way_1和way_2主要差别在于时间,way_1运行时间更短,这与方案(1)和方案(2)的步骤有关。(1)和(2)是计算所有三级类的分类结果并排序,而(1)仅需要计算由知识库得到的三级类下的分类器并排序,因此(1)的时间性能更好。

实验Way_3验证了加入第一层分类器是有效的,时间性能提高了一倍,准确率提高了0.015。因此下一步将考虑以way_3为基础进行优化。
实验发现,对于方案(3),增加从知识库中返回的结果数目,如经过KB得到30个结果,最终的准确率得到提高。因此,进行了几组优化实验,如表3所示。
表3 way_3的优化实验结果

实验代号KB类号数准确率运行时间/s
Way_3200.2317035(约2h)
Way_4300.26910951(约3h)
Way_5500.30520411(约5.6h)
Way_6600.31220150(约5.6h)

由表3,增加KB的类号后,准确率显著提高,但相应的时间开销也增加。
为了分析具体分类时每个类的效果,实验统计了每个文档在分类时的第一层分类结果、KB分类结果、最终分类结果列表(top10)。以way_6为例,选取三个有代表性的类别,其中其整体的准确率如表4所示,选取其中若干个文档具体分析结果如表5所示。
表4 三个类的准确率

三级类号文档数准确率
A84915260.84
D088200.475
Q5937320.000

表5 三个文档的具体分类结果

文档KB结果Le1结果最终结果(取top10,不足10个全部选择)
A849_C1A:12;B:1;C:1;D:20…A[‘A849’, ‘A81’]
D08_C1B:1;C:1;D:5;Q:41…D[‘D52’,‘D43’,‘D90’]
Q593_C1S:7;Q:40…Q[‘Q942’,‘Q945’,‘Q95-3’,‘Q25’, ‘Q53’,‘Q935’,‘Q954’,‘Q936’, ‘Q948’, ‘Q24’]

由表5知,在D08类中一个文档的KB结果中出现了较多的Q类,并且最终分类结果中未命中D08;在Q593类中一个文档中虽然大部分都是Q类,但最终结果(top3)并没有命中。
表4和表5只是列出了个别文档的分类情况,这三个类全部分类情况见附件1.
此外,为了分析其它类的分类效果,统计了那些效果较差的类别,如图5所示。其中,横坐标表示准确率,纵坐标表示低于准确率的三级类类别数量。类别总数为773.
在这里插入图片描述
图5 三级类准确率分布情况
从图5可以看出,大部分三级类的准确率低于0.5,有将近一半低于0.3,有20个三级类准确率为0.0.
基于目前的实验,可考虑的优化方法包括这几个方面:改善KB;改善第一层分类器性能;剔除效果非常差的类别。

1.3.2 实验-新方法

本次实验加入了第二层级分类(FC),并且文本表示使用词向量方法(百科训练的词向量模型,大小1.7GB),第二层分类器使用fasttext算法,第三层分类器使用svm算法。其中,第一层分类器的测试结果为0.95,第二层分类器的测试结果为0.93.
新方法的几次过程结果如表6所示。

实验代号描述准确率运行时间/s
Baseline(Way_6)旧方法最好结果0.31220150(约5.6h)
New_way_1加入二级分类器0.33414169(约3.9h)
New_way_2在new_way_1基础上去掉KB0.48464741(约18h)
New_way_3在new_way_2基础上使用词向量0.45533425(约9.3h)

由表6,New_way_1加入二级分类器的效果提升不大,但是时间开销降低。New_way_2去掉KB后准确率大幅提升,达到0.484,但是时间开销增大3倍多。New_way_3使用词向量,准确率降低了0.03,但时间开销降低了一倍。
由此分析,新方法是有效的。
对于新方法New_way_3,使用词向量仍会出现OOA问题,故使用词向量中的词作为自定义词典分词。这样做的好处是在文本表示阶段尽可能使每一个特征(词语)都能够用词向量表示。这个方法目前在实验阶段。

1.3.3 实验-新方法-新数据

本次数据选取的是规模为7.32GB数据,经过预处理后,大小为5.16GB。预处理包括分词、去除无效数据等。分词使用百度词向量生成的词典进行分词。5.16GB数据的情况如表7所示。
表7 新数据集介绍

实验次数大小类别数量文档数量
55.16GB1679

由于类别数据少会影响分类性能,故去掉数据小于500条的三级类别,共得到851个三级类。
根据这851个类进行实验,方法与1.3.2相同。
使用fasttext训练一级分类器的准确率为0.92,训练二级分类器的准确率为0.77。
表8给出了实验的结果。

实验代号描述准确率运行时间/s
New_way_data_1和New_way_3不同的是未加入2级分类器0.20147581(约41h)
New_way_data_2方法和new_way_3同0.4135556(约9.8h)

1.4 结论

根据新-旧实验和若干次讨论,得到结论如下:
(1) 加入第二层分类器是有效的。对比表6的几个方案结果,发现加入第二层分类对分类效果和时间性能有一定提升。
(2) 去掉知识库是有效的。根据表6的结果,去掉KB能大幅提升准确率。
(3) 使用词向量可以缩短训练和测试时间。根据表6结果,词向量在准确率方面和TF-IDF方法相差不大,但时间开销降低一半,此外,使用词向量不需要生成额外的映射文件。
根据以上结论,新方法是目前最好的文本分类方案,将应用到实际的标引项目中。

1.5 集成学习的资源

集成学习-1:https://blog.csdn.net/qq_20386411/article/details/82985219
集成学习-2: https://blog.csdn.net/qq_32690999/article/details/78759463

Stacking原理:https://blog.csdn.net/wstcjf/article/details/77989963
Stacking代码实现:https://www.jianshu.com/p/5905f19c4df6
模型融合(stacking&blending) :https://blog.csdn.net/u014356002/article/details/54376138

1.6 项目地址

Hierarchical-text-classify

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lingpy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值