文本分类实战: 机器学习vs深度学习算法对比(附代码)

2017 年 10 月 25 日 机器学习研究会

这几周因为在做竞赛所以没怎么看论文刷题写博客,今天抽时间把竞赛用到的东西总结一下。先试水了一个很小众的比赛–文因互联,由AI100举办,参赛队不足20个,赛题类型是文本分类。选择参赛的主要原因是其不像阿里们举办的竞赛那样,分分钟就干一件事就是特征工程和调参,然后数据又多又乱,不适合入门。其次一个原因就是目前我的研究方向就是NLP,之前也做过一个文本分类的东西,所以就参赛了。这里将主要介绍我在比赛中用到的几个模型,从理论到代码实现进行总结。

1,数据集

大家可以到竞赛官网查看赛题并下载数据集,数据集中主要包含下面几个文件,可见数据集很小也很简单,只需要使用training.csv文件进行训练我们的文本分类模型,使用testing.csv进行预测并提交结果即可: 



下面是训练集的前两行,每一行的第一个数字表示该行文本的类别,后面的描述就是要建模的文本。这个数据集是11个公司的描述数据,我们要根据4774条训练数据去预测2381条数据的类别标签。除此之外,我们还可以看到这些训练数据存在较严重的类别不平衡问题。如下图所示: 


了解完数据集,接下来我们开始进行文本分类,开始提交结果。

2, 朴素贝叶斯分类法

在这里插句题外话,往往这种竞赛大家喜欢一上来什么都不做先提交一个结果站站场面==也就是提交一个随机结果、均值等。因为我看到这个比赛的时候都已经快结束了,比较匆忙,所以第一次提交的也是直接用随机数生成的,后来还自作多情的按照训练集的类比占比作为每个类别概率生成随机数(结果显示确实有提高),代码如下所示:

import numpy as np


with open('output/random_out.csv', 'w') as f:

    for i in range(1, 2382):

        f.write(str(i))

        f.write(',')

        aa = np.random.random()

        b = 0

        if aa <= 0.25:

            b = 3

        elif aa <= 0.5:

            b = 4

        elif aa <= 0.7:

            b =6

        elif aa <= 0.775:

            b=7

        elif aa <= 0.825:

            b = 5

        elif aa <= 0.875:

            b = 8

        elif aa <= 0.925:

            b = 10

        elif aa <= 0.95:

            b = 11

        elif aa <= 0.975:

            b = 2

        elif aa <= 1:

            b = 9

        f.write(str(b))

        f.write('\n')



好,接下来说正经的,我用的第一种方法就是朴素贝叶斯,可以参见我之前的一篇博客http://blog.csdn.net/liuchonge/article/details/52204218

介绍了使用CHI选择特征,TFIDF计算特征权重,朴素贝叶斯分类的整体流程。因为之前做了这样的尝试,所以这里直接套过来看看效果如何,代码入下,这里的代码都是自己实现的,太丑,其实可以直接调用gensim的接口去做,以后有时间改改代码:

本文github源码地址:

在公众号 datadw 里 回复 CNN   即可获取。


这里我们可以为每个类选出最具代表性的十个词语看一下,从下面的特征词可以看出来,我们程序提取的特征词还是很具有类别区分度的,也可以看出第四类和第九类、第五类和第八类较为相似,可能在分类上会比较难区分:

接下来调用train.py函数,就可以得到我们的预测结果,这里我使用了朴素贝叶斯、决策树、SVC三种算法,但是结果显示朴素贝叶斯效果更好,根据参数不同测试集准确率大概达到了78%~79%左右。此外还有几个地方可以调节:

  1. 特征词维度的选择,即上面代码feature_select_use_new_CHI()函数中每个类别选择多少个特征词,取值范围在100-500


  2. 特征权重的计算方式,即上面代码document_features()函数中对每个特征词的权重计算方式,我们可以认为只要出现就记为1,否则为零;或者使用其在该文本中出现次数作为权重;或者使用TF-IDF作为权重,或者其他方法。

     

  3. 分类器的选择及参数调整,其实我们应该取出500条记录作为测试集去验证模型好坏以及作为参数选择的依据,但是因为时间比较紧迫,所以我并未作这部分工作==

此外,在获得了上面所说的类别特征词之后(每类取十个),我还尝试着用简单的类别匹配方法进行分类,思路很简单,就是看测试集包含哪个特征集中的单词更多,代码入下:

result = [] qq = 0with open('data/testing.csv'u'r'as f:    for line in f:        content = ""        for aain line.split(',')[1:]:            content += aa        word_list, word_set = jieba_fenci(content, stopwords_list)        label = 2        count = 0        for i, cla in enumerate(feature_words):            tmp = 0            for word in word_list:                if word in cla:                    tmp += 1            if tmp > count:                count = tmp                label = i+1        if count == 0:            qq += 1        result.append(label)

这个效果一般,准确率好像是在69%或者74%左右,记不太清了。

3,XGBoost算法–文本分类

考虑到xgboost算法在各类竞赛中都有很好的效果,我也决定使用该算法尝试一下效果如何,在网上找了一篇博客,直接套用到这里。我们使用所有的词作为特征进行one-hot编码(使用from sklearn.feature_extraction.text import CountVectorizer和 from sklearn.feature_extraction.text import TfidfTransformer),代码如下:

本文github源码地址:

在公众号 datadw 里 回复 CNN   即可获取。


效果不错,测试集可以达到80%的准确度,出乎意料的好==然后我还尝试将提取出来的特征用到XGBoost模型上,也就是在train.py中调用xgboost模型,结果发现准确度出不多也是80%左右,没有很大提升。其实这里也应该做参数优化的工作,比如xgboost的max_depth、n_estimate、学习率等参数等应该进行调节,因为时间太紧我这部分工作也没做,而是使用的默认设置==

转自:大数据挖掘DT数据分析


完整内容请点击“阅读原文”

登录查看更多
35

相关内容

文本分类(Text Classification)任务是根据给定文档的内容或主题,自动分配预先定义的类别标签。
专知会员服务
137+阅读 · 2020年5月19日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
126+阅读 · 2020年3月15日
《深度学习》圣经花书的数学推导、原理与Python代码实现
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
知识神经元网络 KNN(简介),12页pdf
专知会员服务
13+阅读 · 2019年12月25日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
159+阅读 · 2019年10月28日
一文读懂深度学习文本分类方法
AINLP
15+阅读 · 2019年6月6日
深度学习文本分类方法综述(代码)
专知
11+阅读 · 2018年6月15日
[机器学习] 用KNN识别MNIST手写字符实战
机器学习和数学
4+阅读 · 2018年5月13日
实战 | 基于深度学习模型VGG的图像识别(附代码)
七月在线实验室
12+阅读 · 2018年3月30日
【代码分享】系列之朴素贝叶斯(github clone)
机器学习算法与Python学习
6+阅读 · 2018年3月24日
干货:10 种机器学习算法的要点(附 Python代码)
全球人工智能
4+阅读 · 2018年1月5日
Talking-Heads Attention
Arxiv
15+阅读 · 2020年3月5日
Arxiv
5+阅读 · 2019年4月8日
Arxiv
8+阅读 · 2018年1月19日
VIP会员
相关VIP内容
专知会员服务
137+阅读 · 2020年5月19日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
126+阅读 · 2020年3月15日
《深度学习》圣经花书的数学推导、原理与Python代码实现
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
知识神经元网络 KNN(简介),12页pdf
专知会员服务
13+阅读 · 2019年12月25日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
159+阅读 · 2019年10月28日
相关资讯
一文读懂深度学习文本分类方法
AINLP
15+阅读 · 2019年6月6日
深度学习文本分类方法综述(代码)
专知
11+阅读 · 2018年6月15日
[机器学习] 用KNN识别MNIST手写字符实战
机器学习和数学
4+阅读 · 2018年5月13日
实战 | 基于深度学习模型VGG的图像识别(附代码)
七月在线实验室
12+阅读 · 2018年3月30日
【代码分享】系列之朴素贝叶斯(github clone)
机器学习算法与Python学习
6+阅读 · 2018年3月24日
干货:10 种机器学习算法的要点(附 Python代码)
全球人工智能
4+阅读 · 2018年1月5日
Top
微信扫码咨询专知VIP会员