data_mining实验总结-100万篇幅文本分类


title: data_mining实验总结-100万篇幅文本分类
date: 2017-12-16 13:45:57
updated: 2020-03-26 12:17:53
categories: 综合技术


此文档为研一数据挖掘课程中的实验笔记

1.把doc文件分词(取名词+去停用词)

代码:E:\data_mining\fenci_data\fenci.py
输入:E:/data_mining/classified_data/aoyun
输出:E:/data_mining/fenci_data/aoyun/

2.把分词好的数据进行分流,分为训练集与测试集

代码:E:\data_mining\train_fenci_data\copyFromFenciData.py
输入:E:/data_mining//fenci_data
输出:E:/data_mining/train_fenci_data + E:/data_mining/test_fenci_data

3.将训练集与测试集所有文件重新改名1.txt往后

代码:E:\data_mining\2.提取搜狗源数据分成小doc文件\changeFileName.py
输入:E:/data_mining/train_fenci_data\aoyun
输出:E:/data_mining/train_fenci_data\aoyun
test集同样做

4.corpus2Bunch:这一步将训练+测试数据集所有信息保存到train_set/test_set.dat中,这样以后提取信息,这个就是原始的数据集信息,从这个里面提取

bunch(targetname=[“aoyun”,“fangchan”…10个], label=[“aoyun”,“aoyun”…50万], filenames=[“E:\1.txt”,“E:\2.txt”…50万], contents=[“火炬手\n妈妈\n”, “明天\n奥\n”…50万])

代码:E:\data_mining\tf-idf_data\corpus2Bunch.py
输入:E:/data_mining/train_fenci_data # 分词后分类语料库路径
输出:E:/data_mining/tf_idf_data/train_word_bag/train_set.dat #Bunch存储路径
对test同样输出test_set.dat

5.tf-idf: 将训练集与测试集分别tf_idf,生成词向量空间

tf_idf思想强推这篇文章

这里可以调参 max_df=0.5

代码:E:\data_mining\tf-idf_data\tf_idf_train.py + tf_idf_test.py
输入:E:/data_mining/tf_idf/train_word_bag/train_set.dat #Bunch存储路径
输出:E:/data_mining/tf_idf/train_word_bag/tfidf_space_train.dat
对test同样输出tfidf_space_test.dat #词向量空间保存路径

输出的tfidfSpace bunch对象各种查看方法+稀疏矩阵用法见:tfidfSpace_bunch类各种查看操作.py(顺便可以看看tf_idf原词典的维数:519899维)

6.将tfidf.dat稀疏矩阵按词索引升序排序的(index:tfidf_value)值写入libsvm格式的txt中

libsvm格式: 
0 7:0.3241232133 153:0.12359321  
1 15:0.21231233 89:0.123123112

代码:E:\data_mining\chi2\ordered_libsvm_type_data_train.py
输入:E:/data_mining/tf_idf_data/train_word_bag/tfidf_space_train.dat
输出:E:/data_mining/chi2/ordered_libsvm_type_data_train.txt #训练集
对test同样生成测试集ordered_libsvm_type_data_test.txt

7.chi2:将上述按词索引升序排序的libsvm格式的txt(词索引很多维),进行卡方降维(词索引为1万维),输出libsvm格式的txt。注意:这里的卡方1万维是把训练集+测试集放到一起,100万行txt一起送入chi2做,之后再拆分成训练集与测试集

1.两个txt放到一起
代码:E:\data_mining\chi2\togetherData.py
输入:E:/data_mining/chi2/ordered_libsvm_type_data_train.txt + test.txt
输出:E:/data_mining/chi2/ordered_libsvm_type_data_together.txt #100万行

关于chi2降维思想:看这篇文章 + sklearn.feature_selection.SelectKBest技术文档

2.chi2降维
代码:E:\data_mining\chi2\chi2.py
输入:E:/data_mining/chi2/ordered_libsvm_type_data_together.txt
输出:E:/data_mining/chi2/chi2_fea_together.txt #100万行(10000维)

注意这里把卡方检验选择的10000个特征词索引编号也输出,并写入到E:/data_mining/chi2/chi2_indexes_10000.txt中,之后可以经过XXX.py把词索引对应的分词也写入,这样就可以清晰地把卡方10000维词向量空间/词典输出,方便观察

3.拆分成两个txt训练集+测试集
代码:E:\data_mining\chi2\divideData.py
输入:E:/data_mining/chi2/chi2_fea_together.txt
输出:E:/data_mining/chi2/chi2_fea_train.txt + chi2_fea_test.txt #各50万行(10000维)

8.在svm训练之前,用**交叉验证+libsvm网格搜索(grid.py)**工具寻找svm_train的-c参数,具体就是把chi2_fea_train.txt在libsvm/tools/目录下python grid.py chi2_fea_train.txt后得到-c参数[local] 5 -7 79.9119 (best c=32.0, g=0.0078125, rate=79.9119),我得到-c 32

9.libsvm_train:将chi2降维后的txt送入svm分类器进行训练(只把训练集train.txt送入svm训练),输出一个train.model

线性核: linear "-t 0 -h 0 -c 32 -m 500"--太慢了,天荒地老,转战liblinear
代码:E:\data_mining\libsvm\libsvm_train.py
输入:E:/data_mining/chi2/chi2_fea_train.txt
输出:E:/data_mining/libsvm/linear.model

在liblinear训练前,同样需要类似于libsvm的grid.py寻找最优参数-c,具体就是把chi2_fea_train.txt在E:\liblinear-2.11\windows目录下python grid.py chi2_fea_train.txt后得到-c参数[local] 5 -7 79.9119 (best c=32.0, g=0.0078125, rate=79.9119),我得到-c 32

liblinear
代码:E:\data_mining\liblinear\liblinear_train.py
输入:E:/data_mining/chi2/chi2_fea_train.txt
输出:E:/data_mining/liblinear/liblinear_train.model

10.用train.model来测试test.txt,输出准确率并输出一个混淆矩阵

代码:E:\data_mining\libsvm\libsvm_test_and_confusionMatrix.py
输入:E:/data_mining/libsvm/linear.model
输出:一个准确率和一个混淆矩阵图

实验结果

实验一共做了三次。

第一次:libsvm训练model选了rbf高斯核(默认参数),训练到天荒地老两天两夜没出结果,放弃

第二次:libsvm训练model选了线性核(参数:-h 0),训练+测试12小时以内,准确率如下

0: #aoyun
Accuracy = 92.54% (46270/50000) (classification)
1: #fangchan
Accuracy = 91.254% (45627/50000) (classification)
2: #gupiao
Accuracy = 59.554% (29777/50000) (classification)
3: #keji
Accuracy = 72.908% (36454/50000) (classification)
4: #shangye
Accuracy = 70.968% (35484/50000) (classification)
5: #shehui
Accuracy = 58.202% (29101/50000) (classification)
6: #shishang
Accuracy = 56.026% (28013/50000) (classification)
7: #shizheng
Accuracy = 7.186% (3593/50000) (classification)
8: #tiyu
Accuracy = 52.432% (26216/50000) (classification)
9: #yule
Accuracy = 46.096% (23048/50000) (classification)

从上面结果可以看出,这次训练很不准确,遂分析原因:8000维的词如果改成1万维效果应该能提升不少;另外数据集明显不是分的很开,尤其时政;同时网上提高文本分类准确率的10条建议:

1.Eliminate Low Quality Features (Words)
2.Recursively Grow your Stopword List
3.Look Beyond Unigram into Bigrams and Trigrams
4.Diversify your Training Corpus
5.Tweak Precision and Recall
6.Eliminate Low Quality Predictions (Learn to Say “I Dont Know”)
7.Canonicalize Words through Lemma Reduction
8.Eliminate Numerals, Punctuation and Corpus Specific Text
9.Try a Different Classification Algorithm
10.Targeted Manual Injection and Curation of Corpus Data
中文:
1.消除低质量(字)
2.递归地增长您的停用词列表
3.超越一元论到三言两语
4.多样化你的训练语料库
5.调整精度和召回
6.消除低质量的预测(学会说“我不知道”)
7.通过引理缩减来规范词
8.删除数字,标点符号和语料库的具体文字
9.尝试不同的分类算法
10.针对性手工注射和处理语料库数据

第三次:完全之前按照9个步骤重做,中间的修改细节如下

1.把最初的数据集拿过来,一个类里可能有28万的数据(但要求每类10万),之前做法是随机选取10万,但可能有的文件太小导致后续训练过程效果不好,所以写了个挑选10万个的大文件脚本。思路就是遍历一个类的文件夹,计算文件平均大小,然后把小于平均大小的文件移动到delete文件夹,看剩下的文件数够不够10万,不够的话把脚本反过来设置,从delete文件夹中挑选大文件到源文件夹中,再手动微调,最后留下10万个大文件。如此方法替换了gupiao类、keji类、shangye类、tiyu类、yule类;aoyun、fangchan类准确率90+不用动;剩下的三类:shishang类没有更多的语料库了没办法动不了,shehui类与shizheng类把之前删掉的多余的好几万放回语料库,并用pickBigTxt脚本同样再从中选出10万个大文件。如此,10个类的语料库重新又整理了一遍,开始重新进行文本分类实验

2.停用词之前是自己综合各方自己做的14KB,这次换成老师上课给的4KB

3.取名词全部带n的名词都取了,n、ns(人名、机构名、地方名等等)

4.在libsvm训练模型前使用grid.py对训练集进行参数调优,找c惩罚因子,找到-c 32,使用这个参数进行svm训练,故有了最后的train训练参数-t 0 -h 0 -c 32

libsvm学习

关于libsvm使用看官方文档,这里面有交叉验证+网格搜索( Cross-validation and Grid-search);更详细的交叉验证见这篇文章 + 强推_这篇文章_交叉验证与网格搜索python实践 + 这篇文章,最后有sklearn交叉验证集成包实践

grid.py和easy.py进行参数调优,详看这篇文章

发布了158 篇原创文章 · 获赞 56 · 访问量 28万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览