此外,还是用cnn卷积神经网络实现了中文的文本分类,效果要优于上述算法。
完整源码(包括冠军源码) 获取方式:
关注微信公众号 datayx 然后回复 文本分类 即可获取。
数据集
数据集中主要包含下面几个文件,可见数据集很小也很简单,只需要使用training.csv文件进行训练我们的文本分类模型,使用testing.csv进行预测并提交结果即可:
下面是训练集的前两行,每一行的第一个数字表示该行文本的类别,后面的描述就是要建模的文本。这个数据集是11个公司的描述数据,我们要根据4774条训练数据去预测2381条数据的类别标签。除此之外,我们还可以看到这些训练数据存在较严重的类别不平衡问题。如下图所示:
2,合晟资产是一家专注于股票、债券等二级市场投资,为合格投资者提供专业资产管理服务的企业。公司业务范围包括资产管理、投资咨询和投资顾问服务。公司管理的私募基金产品主要包括股票型、债券型资产管理计划或证券投资基金,管理总资产规模80亿元左右。根据中国证券投资基金业协会数据,公司管理的私募证券投资基金(顾问管理)类规模较大,公司管理规模处于50亿元以上的第一梯队。 2,公司的主营业务为向中小微企业、个体工商户、农户等客户提供贷款服务,自设立以来主营业务未发生过变化。
了解完数据集,接下来我们开始进行文本分类,开始提交结果。
2, 朴素贝叶斯分类法 在这里插句题外话,往往这种竞赛大家喜欢一上来什么都不做先提交一个结果站站场面==也就是提交一个随机结果、均值等。因为我看到这个比赛的时候都已经快结束了,比较匆忙,所以第一次提交的也是直接用随机数生成的,后来还自作多情的按照训练集的类比占比作为每个类别概率生成随机数(结果显示确实有提高),代码如下所示
好,接下来说正经的,我用的第一种方法就是朴素贝叶斯,可以参见我之前的一篇博客,http://blog.csdn.net/liuchonge/article/details/52204218
介绍了使用CHI选择特征,TFIDF计算特征权重,朴素贝叶斯分类的整体流程。因为之前做了这样的尝试,所以这里直接套过来看看效果如何,代码入下,这里的代码都是自己实现的,太丑,其实可以直接调用gensim的接口去做,以后有时间改改代码:
这里我们可以为每个类选出最具代表性的十个词语看一下,从下面的特征词可以看出来,我们程序提取的特征词还是很具有类别区分度的,也可以看出第四类和第九类、第五类和第八类较为相似,可能在分类上会比较难区分:
接下来调用train.py函数,就可以得到我们的预测结果,这里我使用了朴素贝叶斯、决策树、SVC三种算法,但是结果显示朴素贝叶斯效果更好,根据参数不同测试集准确率大概达到了78%~79%左右。此外还有几个地方可以调节: 特征词维度的选择,即上面代码feature_select_use_new_CHI()函数中每个类别选择多少个特征词,取值范围在100-500 特征权重的计算方式,即上面代码document_features()函数中对每个特征词的权重计算方式,我们可以认为只要出现就记为1,否则为零;或者使用其在该文本中出现次数作为权重;或者使用TF-IDF作为权重,或者其他方法。。。 分类器的选择及参数调整,其实我们应该取出500条记录作为测试集去验证模型好坏以及作为参数选择的依据,但是因为时间比较紧迫,所以我并未作这部分工作==
此外,在获得了上面所说的类别特征词之后(每类取十个),我还尝试着用简单的类别匹配方法进行分类,思路很简单,就是看测试集包含哪个特征集中的单词更多,代码入下:
这个效果一般,准确率好像是在69%或者74%左右。
XGBoost算法–文本分类 考虑到xgboost算法在各类竞赛中都有很好的效果,我也决定使用该算法尝试一下效果如何,在网上找了一篇博客,直接套用到这里。我们使用所有的词作为特征进行one-hot编码(使用from sklearn.feature_extraction.text import CountVectorizer和 from sklearn.feature_extraction.text import TfidfTransformer),代码如下:
效果不错,测试集可以达到80%的准确度,出乎意料的好==然后我还尝试将提取出来的特征用到XGBoost模型上,也就是在train.py中调用xgboost模型,结果发现准确度出不多也是80%左右,没有很大提升。其实这里也应该做参数优化的工作,比如xgboost的max_depth、n_estimate、学习率等参数等应该进行调节,因为时间太紧我这部分工作也没做,而是使用的默认设置==
4, 卷积神经网络 这里使用YOON KIM的模型框架,代码使用WILDML的,可以参见我之前的一篇博客,为了适用于本任务,修改一下 data_helpers.py文件中的代码,增加load_AI100_data_and_labels()函数,用于读取训练集和测试集。然后就可以训练了,这里使用随机初始化的词向量,让其随模型训练,效果不错,测试集精确度达到了82%以上,之后我还尝试了一下使用char-cnn模型,但是效果不太好,根本就没有办法收敛,可能是参数选择的不对或者训练集太小了,但是到这比赛就结束了,我也没有时间和机会去尝试更所得模型和参数==
5,冠军的方法 赛后,举办方请第一名的选手分享了方法和经验,我发现他也是使用的卷积神经网络,不过分词的时候加入了词性标注,然后使用gensim单独训练词向量,然后卷积层的使用了1000个卷积核等等吧,其分享链接为:http://geek.ai100.com.cn/2017/05/18/1580 模型架构如下图所示: