文本分类实例数据集链接:http://qwone.com/~jason/20Newsgroups/

代码如下:

1)算法比价

from sklearn.datasets import load_files
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import RandomForestClassifier
from matplotlib import pyplot as pltcategories=['alt.atheism','tec.sport.hockey','sci.crypt','comp.sys.ibm.pc.hardware','sci.med','comp.sys.mac.hardware','sci.space','comp.windows.x','soc.religion.christian','misc.forsale','talk.politocs.guns','rec.autos','talk.politocs.medeast','rec.motorcycles','talk.politics.misc','rec.sport.baseball','talk.religion.misc']#导入训练数据
train_path='/home/duan/下载/20news-bydate/20news-bydate-train'
dataset_train=load_files(container_path=train_path,categories=categories)#导入评估数据
test_path='/home/duan/下载/20news-bydate/20news-bydate-test'
dataset_test=load_files(container_path=test_path,categories=categories)#数据准备与理解#计算词频
count_vect=CountVectorizer(stop_words='english',decode_error='ignore')
X_train_counts=count_vect.fit_transform(dataset_train.data)
#查看数据维度
#词频的计算结果如下:
print(X_train_counts.shape)#计算TF-IDF
tf_transformer=TfidfVectorizer(stop_words='english',decode_error='ignore')
X_train_counts_tf=tf_transformer.fit_transform(dataset_train.data)
print(X_train_counts_tf.shape)#以上用两种方法进行了文本特征的提取。并且查看了数据维度。
#接下来用TF-IDF特征进行分类模型的训练。#评估算法
#设置评估算法的基准
num_folds=10
seed=7
scoring='accuracy'#线性算法LR ,
#非线性算法:CART,SVM,MNB,KNN
models={}
models['LR']=LogisticRegression()
models['SVM']=SVC()
models['CART']=DecisionTreeClassifier()
models['MNB']=MultinomialNB()
models['KNN']=KNeighborsClassifier()#比较算法
results=[]
for key in models:kfold = KFold(n_splits= num_folds, random_state=seed)cv_result = cross_val_score(models[key], X_train_counts_tf, dataset_train.target, cv=kfold, scoring=scoring)results.append(cv_result)print('%s: %f (%f)' %(key, cv_result.mean(), cv_result.std()))

运行结果:

(7838, 77172)
(7838, 77172)
KNN: 0.824575 (0.012700)
LR: 0.920900 (0.008155)
CART: 0.703240 (0.013782)
MNB: 0.896786 (0.009055)
SVM: 0.062772 (0.004306)

箱线图比较算法:

#箱线图10折交叉验证比较算法
fig=plt.figure()
fig.suptitle("Algorithm Comparision")
ax=fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(models.keys())
plt.show()

运行结果:

从图中结果可以看出,朴素贝叶斯分类器的数据离散程度比较好,逻辑回归的偏度较大.算法结果的离散程度能够反应算法对数据的只用情况,所以对逻辑回归和朴素贝叶斯分类器进行进一步的研究,实行算法调参.


2) 算法调参

通过上面的分析发现,LR和MNB值得进一步进行优化.下面对这两个算法的参宿进行调参,进一步提高算法的准确度.

(1)逻辑回归调参

逻辑回归中的超参数是C.C是目标的约束函数,C值越小则正则化强度越大,对C进行调参,每次给C设定一定数量的值,如果临界值是最有参数,重复这个步骤,直到找到最优值.

#算法调参
#调参LR
param_grid={}
param_grid['C']=[0.1,5,13,15]
model=LogisticRegression()
kfold=KFold(n_splits=num_folds,random_state=seed)
grid=GridSearchCV(estimator=model,param_grid=param_grid,scoring=scoring,cv=kfold)
grid_result=grid.fit(X=X_train_counts_tf,y=dataset_train.target)
print('最优:%s使用%s'%(grid_result.best_score_,grid_result.best_params_))

运行结果:
最优:0.9393978055626435使用{'C': 15}

(2)朴素贝叶斯调参

朴素贝叶斯有一个alpha参数,该参数是一个平滑参数,默认值为1.0.
我们可以对这个参数进行调参,以提高算法的准确度.

#算法调参
#调参MNB
param_grid={}
param_grid['alpha']=[0.001,0.01,0.1,1.5]
model=MultinomialNB()
kfold=KFold(n_splits=num_folds,random_state=seed)
grid=GridSearchCV(estimator=model,param_grid=param_grid,scoring=scoring,cv=kfold)
grid_result=grid.fit(X=X_train_counts_tf,y=dataset_train.target)
print('最优:%s使用%s'%(grid_result.best_score_,grid_result.best_params_))
cv_results=zip(grid_result.cv_results_['mean_test_score'],grid_result.cv_results_['std_test_score'],grid_result.cv_results_['params'])
for mean, std, param in cv_results:print('%f (%f) with %r'%(mean, std, param)) 

运行结果:

最优:0.934804797142128使用{'alpha': 0.01}
0.929829 (0.008380) with {'alpha': 0.001}
0.934805 (0.008096) with {'alpha': 0.01}
0.928043 (0.008024) with {'alpha': 0.1}
0.889640 (0.010375) with {'alpha': 1.5}

MNB算法最有参数为alpha=0.01.最优:0.934804797142128使用{‘alpha’: 0.01}
LR算法最优参数为:C=15. 最优:0.9393978055626435使用{‘C’: 15}

通过调参发现,LR在C=15时具有最好的准确度.接下来审查集成算法.

3).集成算法

随机森林(RF)
AdaBoost(AB)

ensembles={}
ensembles['RF']=RandomForestClassifier()
ensembles['AB']=AdaBoostClassifier()
#比较集成算法
results=[]
for key in ensembles:kfold = KFold(n_splits= num_folds, random_state=seed)cv_result = cross_val_score(ensembles[key], X_train_counts_tf, dataset_train.target, cv=kfold, scoring=scoring)results.append(cv_result)print('%s: %f (%f)' %(key, cv_result.mean(), cv_result.std()))

运行结果:

RF: 0.773795 (0.017244)
AB: 0.620055 (0.017638)

箱线图:

#箱线图10折交叉验证比较算法
fig=plt.figure()
fig.suptitle("Algorithm Comparision")
ax=fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(ensembles.keys())
plt.show()

从箱线图可以看出,随机森林的分布比较均匀,对数据的适用性比较高,更值得进一步优化研究.

4).集成算法调参

#集成算法调参
#调参RF
param_grid={}
param_grid['n_estimators']=[10,100,150,200]
model=RandomForestClassifier()kfold=KFold(n_splits=num_folds,random_state=seed)grid=GridSearchCV(estimator=model,param_grid=param_grid,scoring=scoring,cv=kfold)grid_result=grid.fit(X=X_train_counts_tf,y=dataset_train.target)print('最优:%s使用%s'%(grid_result.best_score_,grid_result.best_params_))cv_results=zip(grid_result.cv_results_['mean_test_score'],grid_result.cv_results_['std_test_score'],grid_result.cv_results_['params'])
for mean, std, param in cv_results:print('%f (%f) with %r'%(mean, std, param)) 

运行结果:

最优:0.888236795100791使用{'n_estimators': 200}
0.779025 (0.007910) with {'n_estimators': 10}
0.882496 (0.012405) with {'n_estimators': 100}
0.887982 (0.010867) with {'n_estimators': 150}
0.888237 (0.009727) with {'n_estimators': 200}

确定最终模型

#算法调参
#调参LR
param_grid={}
model=LogisticRegression(C=15)
model.fit(X=X_train_counts_tf,y=dataset_train.target)
X_test_counts=tf_transformer.transform(dataset_test.data)
predictions=model.predict(X_test_counts)
print(accuracy_score(dataset_test.target,predictions))
print(classification_report(dataset_test.target,predictions))

运行结果:

0.8844163312248419precision    recall  f1-score   support0       0.85      0.79      0.82       3191       0.78      0.84      0.81       3922       0.86      0.88      0.87       3853       0.91      0.89      0.90       3954       0.81      0.90      0.86       3905       0.91      0.91      0.91       3966       0.97      0.95      0.96       3987       0.94      0.97      0.96       3978       0.97      0.94      0.96       3969       0.92      0.89      0.91       39610       0.93      0.95      0.94       39411       0.86      0.93      0.89       39812       0.91      0.77      0.84       31013       0.70      0.62      0.65       251avg / total       0.89      0.88      0.88      5217

《深度学习Python实践》第22章——文本分类实例相关推荐

  1. 猿创征文丨深度学习基于双向LSTM模型完成文本分类任务

    大家好,我是猿童学,本期猿创征文的第三期,也是最后一期,给大家带来神经网络中的循环神经网络案例,基于双向LSTM模型完成文本分类任务,数据集来自kaggle,对电影评论进行文本分类. 电影评论可以蕴含 ...

  2. 深度学习基于双向 LSTM 模型完成文本分类任务

    大家好,本期给大家带来神经网络中的循环神经网络案例,基于双向LSTM模型完成文本分类任务,数据集来自kaggle,对电影评论进行文本分类. 电影评论可以蕴含丰富的情感:比如喜欢.讨厌.等等.情感分析( ...

  3. 【深度学习】情感分析:基于文本分类与情感预测的方法

    本文将介绍情感分析的基本概念.技术原理和方法,以及如何使用文本分类和情感预测技术实现情感分析.我们将通过实际的代码示例展示如何使用Python和相关库构建情感分析模型,并应用在实际场景中. 1. 情感 ...

  4. 深度学习保姆级别之NLP入门文本分类之情感分析

    缘起 作为一个菜鸟小硕,无师自通入门NLP已经一年多了,想着自己的第一个项目就是情感分析,以及第一篇CCF B类中文期刊也是情感分析,决定开一个关于文本分类的专栏,提供保姆级别的模型训练过程.很多同学 ...

  5. 深度学习-nlp系列(2)文本分类(Bert)pytorch

    对于 Bert 来说,用于文本分类是最常见的,并且准确率也很高.本文将会对 bert 用于文本分类来做详细的介绍. 预训练模型 对于不同的数据,需要导入不同的预训练模型. 预训练模型下载地址:Mode ...

  6. 零基础学习Python 作业 第22章

    x**============ CH22 homework ============** 0 递归在编程的形式上是如何表现的呢? Answer: 函数本身不断迭代调用自身 1 递归必须满足哪两个基本条 ...

  7. 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...

    1. tf.nn.embedding_lookup(W, X) W的维度为[len(vocabulary_list), 128], X的维度为[?, 8],组合后的维度为[?, 8, 128] 代码说 ...

  8. 【神经网络与深度学习-TensorFlow实践】-中国大学MOOC课程(四)(Python语言基础(2))

    [神经网络与深度学习-TensorFlow实践]-中国大学MOOC课程(四)(Python语言基础(2)) 第4讲 Python语言基础(2) 4.1 内置数据结构 4.1.1 序列数据结构(sequ ...

  9. 人工神经网络理论、设计及应用_TensorFlow深度学习应用实践:教你如何掌握深度学习模型及应用...

    前言 通过TensorFlow图像处理,全面掌握深度学习模型及应用. 全面深入讲解反馈神经网络和卷积神经网络理论体系. 结合深度学习实际案例的实现,掌握TensorFlow程序设计方法和技巧. 着重深 ...

  10. 解析深度学习:语音识别实践 (俞栋等著) 完整pdf[44MB]

    AlphaGo与李世石的围棋大战激发了人们对人工智能是非的诸多争论.人工智能背后的工作原理深度学习跳入大众的视野.AlphaGo的大获全胜一定程度展示了深度学习在应用领域的成功,而语音识别正是深度学习 ...

最新文章

  1. OpenCV形态学变换函数morphologyEx()闭运算的使用
  2. YouTube 多目标排序系统:如何推荐接下来收看的视频
  3. Computer Vision阅读文章总结纪要
  4. 李开复:无人驾驶必须一步到位,没有所谓的人机协同
  5. 《计算机组成原理》(微课版) 第1章 计算机系统概述
  6. 《腾讯产品启示录》学习笔记
  7. 流量造假:“蔡徐坤微博转发过亿”幕后推手星援 App 开发者一审获刑五年
  8. 简单的酒店管理系统(纯属练手)
  9. diffmerge对比时出现中文乱码的解决办法
  10. 于NXP芯片第一次无法进入CAN中断的问题
  11. 电商网站商品详情架构
  12. 机器学习系列(一)——机器学习简介
  13. Harbor安装教程-完全根据官方文档2.6.0版本
  14. Altium Designer操作——创建元器件——同一SchLib库下创建多个器件模型
  15. GM7123视频编码电路:TTL转VGA,替换SDA7123转换芯片
  16. 2021年6月27日 root Redmi Note 8
  17. java excel解析:poi与jxl的区别(excel版本问题:xls,xlsx)
  18. 面向对象的设计原则(七大原则)
  19. uniGUI之事项合集
  20. ansible 自动化运维工具——ansible Ad-Hoc 使用

热门文章

  1. pythonforin替换字符_Python:用一个字符串替换数组中的数字(Python: Replace a number in array with a string)...
  2. 爬虫实例2 用bs4库批量爬取图片
  3. c#中接口的使用方法图解_C#中的接口interface的使用
  4. python 迭代器 删除_Python学习100天-Day08(迭代器解析)
  5. mysql创建jdbc数据库_创建本地数据库mySQL并连接JDBC
  6. Vue:结合ElementUI元素超过一定高度加滚动框,高度由浏览器高度决定并随浏览器变化而变化
  7. JavaWeb:JSON对象和Java对象的相互转换
  8. SQL:postgresql中COALESCE函数
  9. 关于Pulsar与Kafka的对比
  10. 常用31个Java机器学习、深度学习、自然语言处理学习库工具