京公网安备 11010802034615号
经营许可证编号:京B2-20210330
R文本分类之RTextTools
古有曹植七步成诗,而RTextTools是一款让你可以在十步之内实现九种主流的机器学习分类器模型的文本分类开发包。
它集成了(或者说支持)如下算法相关的包:
支持向量机(Support Vector Machine from e1071)
glmnet(一个非常流行的用于变量选择的R包,俗称kaggle竞赛“三驾马车”之一)
最大熵模型(maximum entropy from maxent)
大规模线性判别(scaled linear discriminant,slda)
装袋算法(bagging from ipred)
提升算法(boosting from caTools)
随机森林(random forest from randomForest)
神经网络(neural networks from nnet)
回归树(regression tree from tree)
RTextTools有着不可不学的三大理由:
首先,RTextTools的设计哲学在于易学与灵活。从而,让没有任何R编程经验的社会科学研究者也能轻松实现高端的机器学习算法;并且,让经验老道的R用户充分发挥R的威力,与其他相关的包结合,如:文本预处理方面的tm包,实现LDA主题模型的topicmodels包等,实现高难度的模型,并且充分提高模型的精度等。
其次,RTextTools提供了从数据载入,数据清洗,到模型评价的所有功能,并且,实现的函数非常简单易记。即所谓的『一条龙服务』。
最后,RTextTools还可以实现结构化数据的分类问题。也就是说,它可以像普通的机器学习包caret那样使用。
下面,让我们一起来见证一下RTextTools是如何在十步之内演绎文本分类这一高端技术活的。
文本分类step-by-step
1.创建矩阵
首先,载入一个自带的测试数据集:data(USCongress)。由于RTextTools集成了tm包的功能,所以tm包在文本预处理方面的功能,如去除空格、移除稀疏词、移除停止词、词干化等功能,都可以轻松实现。
# 创建一个文档-词项矩阵doc_matrix<-create_matrix(USCongress$text,language="english",removeNumbers=TRUE,stemWords=TRUE,removeSparseTerms=.998)
2.创建容器(Container)
创建好文档-词项矩阵以后,下一步要做的就是对矩阵进行训练集/测试集的划分了。RTextTools中的容器(Container)概念,使得人们不必两次读入数据,而将训练集和测试集一并读入,在容器内做区分即可。
既然我们是有监督的分类算法实现,当然不能忘了指定因变量(即类别标签)。在我们的测试数据集中,类别标签为USCongress$major。
注意:类别标签一定要为数值型!
这里,virgin =参数的设置影响到后续模型结果的分析解读。virgin = FALSE意味着告诉R,我们的测试集是有真实的类别标签的。
3.训练模型
数据已经准备妥当,下面就可以进行模型的训练了。前面提到的九个机器学习算法的训练,只需要写成一个向量,作为参数传入train_model()函数即可同时轻松实现各种高大上的分类器模型训练。
我们来看一下train_model()函数的使用方法。
参数的设置也很简单。如果你实在懒得设置,不妨先使用默认的参数试一试。
SVM<-train_model(container,"SVM")GLMNET<-train_model(container,"GLMNET")MAXENT<-train_model(container,"MAXENT")SLDA<-train_model(container,"SLDA")BOOSTING<-train_model(container,"BOOSTING")BAGGING<-train_model(container,"BAGGING")RF<-train_model(container,"RF")#NNET <- train_model(container,"NNET")TREE<-train_model(container,"TREE")
4.使用训练好的模型进行文本分类
train_model()函数会返回一个训练好的模型对象,我们可以把该对象作为参数传给classify_model()函数,进行测试集的分类。
SVM_CLASSIFY<-classify_model(container,SVM)GLMNET_CLASSIFY<-classify_model(container,GLMNET)MAXENT_CLASSIFY<-classify_model(container,MAXENT)SLDA_CLASSIFY<-classify_model(container,SLDA)BOOSTING_CLASSIFY<-classify_model(container,BOOSTING)BAGGING_CLASSIFY<-classify_model(container,BAGGING)RF_CLASSIFY<-classify_model(container,RF)#NNET_CLASSIFY <- classify_model(container, NNET)TREE_CLASSIFY<-classify_model(container,TREE)
5.结果分析
create_analytics()函数提供了对测试集的分类结果的四种解读:从标签出发;从算法对比出发;从角度文档出发;以及整体评价。
analytics<-create_analytics(container,cbind(SVM_CLASSIFY,SLDA_CLASSIFY,BOOSTING_CLASSIFY,BAGGING_CLASSIFY,RF_CLASSIFY,GLMNET_CLASSIFY,TREE_CLASSIFY,MAXENT_CLASSIFY))
6.测试分类器准确率(accuracy)
create_analytics()返回的对象适用于summary()和print()方法。
summary(analytics)返回了精度(precision),召回率(recall)和F-值(F-Score)等指标。这三个指标是文本分类中常用的评价指标。
精度的定义为预测为真实正例的个数除以所有被预测为正例样本的个数。召回率则是预测为真实正例的个数除以所有真实正例样本的个数。F-值则同时考虑了精度和召回率,是两个指标的折衷。
7.整体效果评价(Ensemble agreement)
create_ensembleSummary()函数提供了整体评价功能。它反映了我们所应用的几种分类算法的『同时命中率』。
整体评价函数提供了两个评价指标:Coverage和Recall。
Coverage衡量了达到召回率阈值的文档百分比。
Coverage的定义如下:
其中,k表示满足阈值的算法个数,n代表总的算法个数。
8.交叉验证
为了进一步对比与验证各种算法的精确度,我们可以使用cross_validate()函数进行k-折交叉验证。
SVM<-cross_validate(container,4,"SVM")GLMNET<-cross_validate(container,4,"GLMNET")MAXENT<-cross_validate(container,4,"MAXENT")SLDA<-cross_validate(container,4,"SLDA")BAGGING<-cross_validate(container,4,"BAGGING")BOOSTING<-cross_validate(container,4,"BOOSTING")RF<-cross_validate(container,4,"RF")NNET<-cross_validate(container,4,"NNET")TREE<-cross_validate(container,4,"TREE")
9.导出数据
最后,可以导出结果,对未正确标签的文档做进一步研究处理。比如,看看是哪种情形下,分类算法准确率较低,需要人工干预。
write.csv(analytics@document_summary,"DocumentSummary.csv")
结论
至此,文本分类的『独孤九剑』已然练成!然而,长路漫漫,我们要想提高模型的精度,还需要『勤修内功』,进一步学习模型的细节,加深对模型的理解,从而学会调节各种参数,进行噪音过滤,模型调整等。否则,只怕是『Garbage in, Garbage out』了。数据分析师培训
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
写在开头 老板在微信上甩来一句: "帮我看下为什么销量跌了。" ” 你回工位,打开 SQL,开始写。查订单表、拉近三个月、按 ...
2026-10-03CDA数据分析师 出品 作者:李诗怡 1. 事实表 vs 维度表 对比维度 事实表 维度表 核心问题 记录“业务发生了什么事” 描述 ...
2026-10-02做数据聚合时,PySpark的groupBy()确实能完成统计,这也是它的本职工作。但它有一个根本性局限:每一组数据,最终只能返回一行 ...
2026-10-01热力地图是数据可视化中极具辨识度与实用性的空间分析图表,结合地理空间维度与数据密度特征,通过颜色深浅、色阶渐变直观展示数 ...
2026-09-30 很多数据分析师做过按月份的销售额趋势图,画过按天的流量折线图,但当被问到“时间序列和普通数据有什么本质区别”“季节性 ...
2026-09-30同样是“银行数据岗”,在国有大行总行数据中心、在一家城商行的零售部、在银行系金融科技子公司、在保险公司,工作内容、成长节 ...
2026-09-29在数据分析与统计学研究中,数据往往不是独立存在的,不同变量之间普遍存在相互关联、相互影响的关系。相关性统计分析是挖掘变量 ...
2026-09-29 导读:大多数人只把 dataclasses 当成偷懒工具,用来少写 __init__、__repr__ 这类魔法方法。但它的能力远不止于此。本文带 ...
2026-09-29 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-09-29在MySQL数据库运维与业务开发中,行业普遍存在“数据达到千万级就必须分表”的说法。但在实际生产环境中,千万条数据并不是强制 ...
2026-09-28CDA数据分析师 出品 作者:李诗怡 1. 5W1H 分析法 定义:经典系统性思维框架,通过六个核心维度对问题进行全方位拆解与剖析,确 ...
2026-09-28 很多分析师在设计标签时思路清晰,但真到落地环节却面临“数据在手,不知如何转化为可用标签”的困境:或因加工方式选择不当 ...
2026-09-28CDA数据分析师 出品 作者:李诗怡 1. 用户标签体系 定义: 通过一系列高度精炼的特征标识,对用户属性、行为与偏好进行量化刻画 ...
2026-09-24Pandas是Python生态中用于表格数据处理的核心库,广泛应用于数据清洗、统计运算、报表输出、数据分析建模等场景。在处理极大数值 ...
2026-09-24随着数字经济快速发展,数据已成为核心生产要素,各行各业的业务沉淀、用户行为、设备运行、市场交易均产生海量数据。数据处理作 ...
2026-09-24 很多分析师每天和数据打交道,但当被问到“标签是什么”“标签和指标有什么区别”“标签体系如何设计”时,却常常答不上来。 ...
2026-09-24在时序数据分析中,大部分业务数据并非持续平稳变化,而是会在某些时间节点出现突然抬升、断崖下跌、趋势反转、波动异变等现象, ...
2026-09-23在统计学与数据分析中,研究多组数据差异最常用的方法为单因素方差分析与事后多重比较。很多数据分析初学者容易混淆两者功能,认 ...
2026-09-23 很多数据分析师每天都在写 SQL,但当被问到“DQL 的本质是什么”“SELECT 子句的书写顺序与执行顺序为何不同”“INNER JOIN ...
2026-09-23 很多数据分析师写过无数个SELECT查询,但当被问到“如何新建一张表来固化中间数据”“创建视图和创建物理表有什么区别”“视 ...
2026-09-22