
谎言已经绕了世界半圈,真相还没穿上裤子。
温斯顿·丘吉尔
自2016年总统大选以来,主导政治讨论的一个话题就是“假新闻”问题。一些政治学专家认为,显着的偏见和/或不真实的消息的泛滥影响了这次大选,不过斯坦福大学和纽约大学的研究人员得出了相反的结论。尽管如此,假新闻已经利用Facebook用户的推送在互联网上传播。
“什么是假新闻?
显然,一个旨在故意误导的故事属于“假新闻”,但最近社交媒体上的热烈讨论正在改变“假新闻”的定义。有些人现在用这个词来驳斥他们偏爱的观点相悖的事实,最为突出的例子就是特朗普总统。这样一个定义模糊的词语正适合为愤世嫉俗者所利用。
数据科学界已采取行动来应对这一问题。现在已经诞生了名为“假新闻挑战”的Kaggle式的竞赛,Facebook也正在利用人工智能来过滤用户推送内容中的假新闻。打击假新闻是一个经典的文本分类项目,其目标直截了当:你能不能构建一个模型,将“真实”的新闻与“假”新闻区分开来。
这正是我要做的事。我收集了一个假新闻和真实新闻的数据集,并采用了朴素贝叶斯分类器(Naive Bayes classifier)来创建一个模型,基于文章使用的单词和短语区分其真假。
数据收集/处理
数据采集过程分为两个部分,获得“假新闻”、获得真实新闻。第一部分实现起来很快,Kaggle发布了一个假新闻数据集,其中包括在2016年大选中发表的13000篇文章。
第二部分则更困难。为了获取与该数据集中新闻对应的真实新闻,我去了All Sides,这是一个致力于收集来自政治界各派的新闻和意见文章的网站。网站上的文章按主题(环境,经济,流产等)和政治倾向(左派,中间派和右派)进行分类。我之所以使用All Sides,因为它是从持不同政治偏见的众多媒体的网页上抓取数以千计的文章的最佳方式。另外,它允许下载文章的全文,纽约时报和国家公共电台的API就做不到这一点。经过漫长而艰苦的过程,我最后总共选择了5279篇文章。真实新闻数据集中的文章来自《纽约时报》、《华尔街日报》、彭博社、国家公共电台和《卫报》等媒体,发布时间在2015年或2016年。
我决定用相同比例的假新闻文章来构建完整的数据集,以使我的模型的准确率达到50%。我从假新闻数据集中随机选出5279篇文章,用来构成完整数据集,剩下的文章将在模型完成后作为测试集使用。
我的最终数据集由10558篇文章组成,包括文章标题和全文及其标签(真或假)。全部数据存于github资源库中。
目的和期望
当我第一次开始进行这个项目时,我承认这个项目并不完美。我的目的是看看距离成功打造一个假新闻分类器有多远,从研究中可以得出什么样的见解,然后将其用于构建更优秀的模型。我的计划是,像一般的垃圾邮件检测项目一样处理这个项目。
建立基于计数向量化器(使用单词提示)或tfidf矩阵(统计文章中的某些字眼相对数据集其他文章中的使用频率)的模型,只能到此为止了。这些方法没有考虑像排序和上下文这样的重要特征。两个文字上相似的文章很有可能是完全不一样的。我没有期望我的模型可以很好地处理其文字和短语有很多重叠的真假两篇文章。尽管如此,我还是希望这个项目能够带来一些有价值的见解。
建模
由于是文本分类项目,所以我只使用朴素贝叶斯分类器作为基于文本的数据科学项目的标准。
建模过程中真正要做的是文本转换,并选择要使用的文本类型(标题与全文)。我需要处理四对重新配置的数据集。
下一步是确定计数向量化器或tfidf向量化器的最优参数。对于那些不熟悉文本机器学习的人来说,这意味着需要使用n个最常用的单词,使用单词和/或短语,去掉停止词(一些常用单词,例如“何时”和“哪儿”),并且仅使用在文本语料库(即文本数据集或文本集合)中至少出现给定次数的单词。
为了测试多个参数的性能及其多种组合,我利用了Sci-Kit Learn的GridSearch功能来有效执行这一任务。 要了解有关如何完善算法参数的更多信息,请参阅本教程。
在网格搜索交叉验证过程之后,我发现我的模型最好使用计数向量化器,而不是tfidf,并且使用文章的全文进行训练的分数要高于使用标题训练的分数。计数向量化器的最优参数是非小写字母,两词短语,而不是单词,仅使用在语料库中至少出现三次的单词。
鉴于我在前文中提到的预期不高,我对我的模型得分之高感到很惊讶。 模型的交叉验证准确性得分为91.7%,回忆率(真阳性率)为92.6%,AUC分数为95%。
下图是我的模型的ROC曲线。

如果我要根据这个图来确定一个模型的阈值,那么我会选择FPR在0.08左右,TPR在0.90左右,因为在图中的那一点,假阳性和真阳性之间的折衷是相等的。
结果与结论
要对模型质量的真实测试,就是看看模型能不能对测试集中的假新闻文章(建模过程中没有使用的那些文章)进行准确分类。
在其他假新闻数据集中剩下的5234篇文章中,我的模型能够正确识别率为88.2%。这比模型的交叉验证准确性得分低3.5个百分点,但在我看来,这是对模型相当不错的评价。
事实证明,我之前的假设(即预测该模型在假新闻分类识别方面表现不佳)是错误的。我预测最后得分能有60-70分就很好了,结果大大超过了这个分数。
考虑到任务的复杂性,我似乎打造了一个相当不错的模型,但我并不完全相信它真有这么好,原因如下。
为了更好地理解为什么可能会出现这种情况,让我们来看看数据中的“最假”和“最真实”的单词,下面我会解释它们都表示什么意思。
我使用的是数据学院的Kevin Markham的技术,下面说说我是如何得出语料库中“最假”和“最真实”的单词的。首先,我使用两列、10558行长的表(行数即语料库中的单词数量)。第一列表示在分类为“假”的文章中出现了给定单词的次数,第二列是“真实”文章中出现给定单词的次数。
然后,我将“假”列中的数值除以模型分类识别出的“假新闻”总数,“真实”列也做同类处理。接下来,我将数据中的每个值加1,因为我创建了一个新的“假:真”比值列,不想因为除数为零而产生错误。这个“假:真”的量度已经很优秀,但绝不是“假”或“真”的完美度量。这里的逻辑很简单,如果一个词在“假新闻”文章中多次出现,同时很少出现在“真实”新闻的文章中,那么它的“假:真”比值就会相当之高。
这是我的数据集中 “最假”和“最真实”的词的前20名。


这两张图表现出一些令人不安的结果。 “假”图中的单词属于混合构成,其中包含一些典型的互联网用语,如拜托、共享、发布,html和控件,甚至包括tzrwu这样不是单词的字母组合。然而,在“最假榜”前20名中发现“Sheeple”或“UFO”这样的词,并不令我感到意外。 Infowars是由Alex Jones领导的右翼阴谋派,输出有关chemtrail和9/11的阴谋论。
“真实”图由政治文章中经常使用的名字和政治家和言论所主导,占图表中柱状图的60%。二十个词语中的七个,包括前六名中的四个,都是政客的名字。这就引发了一个问题,即有关政客的文章就更有可能是真实的吗?当然不是,实际上,有许多假新闻都在散布关于政治家的谎言。如果我得出结论,认为提到政治家的新闻就更有可能是事实的话,无疑会犯下很大的错误。
这个项目的一个大的前提假设是,每一类文章涵盖的主题都有很大的重叠。如上文所述,只是因为某个词在“真实”新闻中比“假”新闻更频繁地出现,并不意味着包含这些词的文章就保证是“真实的”,而只是表示这些词在真实新闻数据集中的文中更常见,反之亦然。
在建设数据集方面,我和另一合作方都有很大贡献。关于将哪些文章用于“真实”数据集的决定由我来做。而 “假新闻”数据集中的文章由Daniel Sieradski制作的名为“BS Detector”的Chrome扩展插件来确定。关于确定什么是“假新闻”,什么不是“假新闻”,具有更高的主观性。政治家的名字被视作“真实”的原因很可能是因为这半个语料库中政治新闻的比例过高。另外,我从几个知名的消息源处找了几篇文章。其中一篇文章来自The Intercept,这是一个高标准的新闻组织。是的,我的模型确实把这个假的“假新闻”文章标记为“真实”。
为了使问题更复杂,我们必须决定如何设定模型的阈值概率。如果我是Facebook的数据科学家,负责实施一个模型,在用户推送内容中分出真实新闻和假新闻,我将面临一个两难的选择:是要阻止所有或大多数假新闻,但也会阻止一些真实新闻,还是要放过全部或大部分的真实新闻,但也会漏过一些假新闻?这两种模型之间要作何选择?但是在做出这个决定之前,我需要弄清楚,没有阻止住假新闻与阻止了真实新闻的代价分别是什么?要如何回答这样一个抽象的问题?除非我们可以训练出能够达到100%真阳性率和0%假阳性率的模型,否则我们必将陷入这个两难的困境。
总而言之,虽然我认为标准的朴素贝叶斯文本分类模型可以为解决这个问题提供一些思路,但我们还是应该采用更强大的深度学习工具来打击专业环境中的假新闻。
如何识别“假新闻”为数据科学界提出了新的挑战。在许多机器学习项目中,您想要预测的不同类别之间的区别是明确的,而假新闻识别的任务中,这一区别则要模糊得多。本文所述项目验证了数据科学中的观念,直觉和与数据的亲密接触,与您所掌握的任何模型或工具一样重要,有时前者甚至更为重要。
原文链接:http://www.kdnuggets.com/2017/04/machine-learning-fake-news-accuracy.html

