谁在椭圆形办公室发推:机器学习揭露川普推文的真实作者
我采取了这一领域的标准做法,将数据分成两部分:80%训练集和20%测试集。
特征重要程度
我进行的最重要的任务之一是根据对模型输出的影响的数量级排序特征。为了排序,我使用了scikit learn的Ridge分类器。Ridge回归是一种包含正则化因子(alpha)的逻辑回归形式。alpha为零时,ridge回归和普通的逻辑回归一样;alpha值较低时,ridge回归迫使影响力最低的那些特征的系数为零,实际上将这些特征从模型中移除了;alpha值较高时,更多特征被移除了。我递归地迭代每个alpha级别,逐一移除特征,直到所有特征都被移除了。
如图所示,在alpha级别刚超过1022时,第一个(影响力最低)的特征被移除了。超过1025之后,特征移除的速度迅速增加了,在1026之上,只有最具影响力的特征保留下来。
单个模型
我总共创建了9个模型:高斯朴素贝叶斯、多项朴素贝叶斯、K近邻、逻辑回归、支持向量分类器、支持向量机,以及集成方法AdaBoost、梯度提升、随机森林。每个模型在训练数据上使用10折交叉验证精心调优,并在测试数据上进行了评估。
交叉验证是训练这些模型同时避免它们过于偏向特定的训练数据的有效方法;换句话说,让它们在未知数据上更具概括性。在10折交叉验证中,数据被平均分为10组,组1-10. 在第一次训练的迭代中,模型在组1-9上训练,在组10上测试。然后重复这一过程,只不过这次在组1-8、10上训练,在组9上测试。整个训练步骤共重复10次,因此训练集中的每个组都有一次被保留,作为未知测试集使用。最后,在10折中具有最佳平均表现的模型参数组合成为最终模型使用的组合。
这些模型背后的算法都很迷人;它们各有自己的优势和弱点,在偏置-方差的折衷上各有不同的取舍,有时处理时间大不相同(例如,训练朴素贝叶斯,只需几分之一秒,而支持向量分类和梯度提升方法各自需要一整个周末进行网格搜索)。如果你对此感兴趣,想要学习更多内容,我推荐从阅读这些模型的维基百科条目开始:
朴素贝叶斯分类器
K近邻算法
逻辑回归
支持向量机
AdaBoost
梯度提升
随机森林
利用前面提到的生成的特征重要程度,我在每个模型上训练了将近900个特征的子集。例如,朴素贝叶斯,在只有5个最重要特征的情形下表现最优,而两个提升模型在300个最重要特征上表现出色。这部分源于维度诅咒;在高维空间中,看上去彼此相近的两个点(在我们3维生物的脑海中想象的),可能事实上相距非常、非常远。特别是K近邻模型(knn),对过多维度高度敏感,因此我对传入这一模型的数据应用了主成分分析(PCA)方法。
主成分分析技术可以在降维的同时消除特征间的共线性。想象一组高维空间中的向量,PCA扭曲、揉搓这些向量,使得所有向量彼此垂直。如果这些向量表示特征,那么通过迫使所有向量正交,我们确保了它们之间不存在任何共线性。这将大大提升knn这样的模型的预测能力,也让我们可以在不减少信息的前提下,减少传给模型的特征数目。简而言之,这让我的knn模型表现更好。
集成
最后,我创建了两个不同的集合。第一个是简单多数投票:奇数个模型和二元输出意味着不会有平局,所以我可以简单地将结果为川普的预测和结果为助手的预测分别相加,其中值较大的那个将是我的最终预测。我的第二个集成有一点复杂:我将9个模型的结果传入一颗新的决策树。这一最终模型在我的测试集上达到了完美的精确度。
好了,终于到结果部分了……
结果
如你所见,梯度提升和随机森林的表现最优,错误率大约只有1/20.
模型 | 精确度(Accuracy) | 准确率(Precision) | 召回(Recall) | F1分值 |
---|---|---|---|---|
梯度提升 | 95% | 95% | 95% | 95% |
随机森林 | 94% | 94% | 95% | 94% |
AdaBoost | 92% | 92% | 90% | 91% |
逻辑回归 | 90% | 90% | 88% | 89% |
KNN | 90% | 91% | 89% | 90% |
SVM | 90% | 90% | 90% | 90% |
SVC | 92% | 92% | 92% | 92% |
多项朴素贝叶斯 | 84% | 83% | 82% | 82% |
高斯朴素贝叶斯 | 92% | 90% | 90% | 89% |
其他模型单独使用时表现不那么好,不过在最终的集成中贡献不少。我基于这9个模型的结果创建的决策树最终达到了99%的精确度!
如果你不清楚上面的这些指标意味着什么,我这里简单介绍一下。精确度是这些指标之中最为直观的,它是正确猜测数除以总猜测数,即,我的所有猜测对了多少?准确率则回答这样一个问题,在我所有猜测是川普所发的推文中,有多少确实是川普所发的?召回几乎是准确率的反义词(不过事实上并不是);它回答的问题是,在所有事实上由川普所写的推文中,有多少被我预测到了?F1是准确率和召回两者的调和,技术上而言是两者的调和平均数(一种平均数)。它理解起来不像精确度那样直观,但当类别失衡程度较高时,f1分值是比精确度好很多的指标。在这一推文数据的情形中,类别很均衡,因此上表中的指标都差不多。如果你仍对这些概念感到困惑,或者你想了解更多内容,可以参考这篇讨论这些指标的文章。
因此,川普的推文的特征是什么呢?
引用转推
@提及
在10pm和10am间发布
惊讶、愤怒、消极性、厌恶、快乐、悲伤、恐惧
感叹号
全大写单词
@realDonaldTrump
正如我所预料的,我在特征选取一节中描述的引用转推很能预测推文是否是川普所发。@提及其他用户同样如此。川普经常在晚上、大清早还有周末发推。他传达了惊讶、愤怒、消极性、厌恶……事实上包括了所有的情绪,而不仅仅是媒体如此强调的负面情绪。相比语法上的需要,他确实更多地使用感叹号和全大写的单词。最后,他太多地提及了自己。
另一方面,他的助手发的推文的特征是:
真正的转推
使用单词“via”
在10am和4pm间发布
分号
句号
URL
@BarackObama
如果一则推文是方法正确的转推,你可以很自信地打赌它是由助手发布的。有趣的是,助手的推文经常使用“via”——他们经常引用一篇文章或者一张图片,然后使用“via”指明作者。意料之中,他们经常在工作日发推,工作日以外不常发推。他们的语法更复杂,句子结构和标点的使用更妥当,同时他们频繁地粘贴指向其他资源的URL。有趣的是,如果一则推文@了Barack Obama(奥巴马)的推特用户名,那么通常这条推文是助手发布的。川普会提到奥巴马的名字,但不会@奥巴马。
词类标记上,川普最常使用的组合是NN PRP VBP,或者,名词、人称代词、动词。这些推文经常采用@某人后接“I thank…”或“I have…”的形式。助手常常写的是NNP NNP NNP,连用三个专有名词,经常是某个组织的名字。同时,助手倾向于在文字之后使用#,而Trump习惯在@某人后使用#。
我有点失望,因为词类标记对模型的作用不是那么显著。我知道推文使用的具体词汇表会随时间而改变,因此我希望更多地刻画语法结构,据我推断,这些语法结构更加稳定。然而,这一项目面对的主要挑战是推文本质上的简短,这大大减少了我的模型可以获取的语法信号。对我的模型而言,尽管它在历史推文上具有几乎完美的精确度,在当下的推文上的精确度下降了。
此外,有三个在历史推文上表现出高度预测能力的特征:推文长度、收藏数量、转推数量。然而,我在部署模型进行实时预测时,移除了这三个特征。移除后两个特征的原因很明显:我尝试在推文发布后立刻进行预测,因此它还没来得及被收藏或被转推。移除推文长度是基于另一个原因。训练数据中的33000条推文,是在推特限制字符数140的前提下发布的。但最近推特将限制提高到了280。所以我需要丢弃基于这一特征进行的训练。
最新活动更多
-
11月28日立即报名>>> 2024工程师系列—工业电子技术在线会议
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
-
即日-12.26火热报名中>> OFweek2024中国智造CIO在线峰会
-
即日-2025.8.1立即下载>> 《2024智能制造产业高端化、智能化、绿色化发展蓝皮书》
-
精彩回顾立即查看>> 2024 智能家居出海论坛
-
精彩回顾立即查看>> 【在线会议】多物理场仿真助跑新能源汽车
推荐专题
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论