
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
在 “神经网络与卡尔曼滤波融合” 的理论基础上,Python 凭借其丰富的科学计算库(NumPy、FilterPy)、深度学习框架(PyTorch、T ...
2025-10-23在工业控制、自动驾驶、机器人导航、气象预测等领域,“状态估计” 是核心任务 —— 即从含噪声的观测数据中,精准推断系统的真 ...
2025-10-23在数据分析全流程中,“数据清洗” 恰似烹饪前的食材处理:若食材(数据)腐烂变质、混杂异物(脏数据),即便拥有精湛的烹饪技 ...
2025-10-23在人工智能领域,“大模型” 已成为近年来的热点标签:从参数超 1750 亿的 GPT-3,到万亿级参数的 PaLM,再到多模态大模型 GPT-4 ...
2025-10-22在 MySQL 数据库的日常运维与开发中,“更新数据是否会影响读数据” 是一个高频疑问。这个问题的答案并非简单的 “是” 或 “否 ...
2025-10-22在企业数据分析中,“数据孤岛” 是制约分析深度的核心瓶颈 —— 用户数据散落在注册系统、APP 日志、客服记录中,订单数据分散 ...
2025-10-22在神经网络设计中,“隐藏层个数” 是决定模型能力的关键参数 —— 太少会导致 “欠拟合”(模型无法捕捉复杂数据规律,如用单隐 ...
2025-10-21在特征工程流程中,“单变量筛选” 是承上启下的关键步骤 —— 它通过分析单个特征与目标变量的关联强度,剔除无意义、冗余的特 ...
2025-10-21在数据分析全流程中,“数据读取” 常被误解为 “简单的文件打开”—— 双击 Excel、执行基础 SQL 查询即可完成。但对 CDA(Cert ...
2025-10-21在实际业务数据分析中,我们遇到的大多数数据并非理想的正态分布 —— 电商平台的用户消费金额(少数用户单次消费上万元,多数集 ...
2025-10-20在数字化交互中,用户的每一次操作 —— 从电商平台的 “浏览商品→加入购物车→查看评价→放弃下单”,到内容 APP 的 “点击短 ...
2025-10-20在数据分析的全流程中,“数据采集” 是最基础也最关键的环节 —— 如同烹饪前需备好新鲜食材,若采集的数据不完整、不准确或不 ...
2025-10-20在数据成为新时代“石油”的今天,几乎每个职场人都在焦虑: “为什么别人能用数据驱动决策、升职加薪,而我面对Excel表格却无从 ...
2025-10-18数据清洗是 “数据价值挖掘的前置关卡”—— 其核心目标是 “去除噪声、修正错误、规范格式”,但前提是不破坏数据的真实业务含 ...
2025-10-17在数据汇总分析中,透视表凭借灵活的字段重组能力成为核心工具,但原始透视表仅能呈现数值结果,缺乏对数据背景、异常原因或业务 ...
2025-10-17在企业管理中,“凭经验定策略” 的传统模式正逐渐失效 —— 金融机构靠 “研究员主观判断” 选股可能错失收益,电商靠 “运营拍 ...
2025-10-17在数据库日常操作中,INSERT INTO SELECT是实现 “批量数据迁移” 的核心 SQL 语句 —— 它能直接将一个表(或查询结果集)的数 ...
2025-10-16在机器学习建模中,“参数” 是决定模型效果的关键变量 —— 无论是线性回归的系数、随机森林的树深度,还是神经网络的权重,这 ...
2025-10-16在数字化浪潮中,“数据” 已从 “辅助决策的工具” 升级为 “驱动业务的核心资产”—— 电商平台靠用户行为数据优化推荐算法, ...
2025-10-16在大模型从实验室走向生产环境的过程中,“稳定性” 是决定其能否实用的关键 —— 一个在单轮测试中表现优异的模型,若在高并发 ...
2025-10-15