《Arduino家居安全系统构建实战》——2.2 根据一个单词决定

2.2 根据一个单词决定

有了数据,我们就可以开始分析了。我们的最终目标是区分垃圾短信和非垃圾短信,但是和数字识别器的情况不同,我们还没有一组清晰的特征,唯一的材料是原始文本块——SMS本身。与此同时,人们会猜测文本中有许多信息可供利用。我们只需要找到一个途径,将这些字符串转换成可以使用的特征即可。

2.2.1 以单词作为线索

如果你仔细观察刚刚加载的数据集,就可能会注意到垃圾短信看起来和非垃圾短信有些不同。浏览这些短信,你的眼睛很容易找出某些值得警惕的线索,暗示着某一条短信可能是垃圾短信。举个例子,“FREE”(全部大写)出现在开始的几条垃圾短信中,似乎在非垃圾短信中不常见到。

这就提出了一个可能的方法:使用来自整条短信的单词识别它所属的类别。我们首先计算垃圾短信中包含特定字符串的次数,与非垃圾短信比较,确认我们的直觉是否正确。我们可以在脚本中输入几行F#代码来测试这一点。首先,过滤数据集使之只包含垃圾短信,然后再次过滤,只保留包含“FREE”的消息,最后计算剩下的条目数量。

let spamWithFREE =
    dataset
    |> Array.filter (fun (docType,_) -> docType = Spam)
    |> Array.filter (fun (_,sms) -> sms.Contains("FREE"))
    |> Array.length```
选择上述代码,在F# Interactive窗口中运行——应该看到如下的结果:

val spamWithFREE : int = 112`
现在,让我们对非垃圾短信做同样的工作:

let hamWithFREE =
    dataset
    |> Array.filter (fun (docType,_) -> docType = Ham)
    |> Array.filter (fun (_,sms) -> sms.Contains("FREE"))
    |> Array.length```
这将产生如下结果:

val hamWithFREE : int = 1`
数字确认了我们的直觉:“FREE”在垃圾短信中使用的频率确实远高于非垃圾短信,这似乎是用于区分两个类别的好标志。我们可以使用这个词构建一个很简单的垃圾短信分类器,如:

let primitiveClassifier (sms:string) =
    if (sms.Contains "FREE")
    then Spam
    else Ham```
这是一个很有希望的开始。但是,如果我们想要使用这一思路构建更重要的程序,就需要应付两个问题。首先,我们选择“FREE”作为垃圾短信的指示器,但是并没有真正证明其原因。我们怎么知道一个特定的词汇是不是垃圾或者非垃圾短信的好标志?其次,根据来自整条消息中的一个词做出决定似乎相当有局限性。我们能否一次使用多个词,将它们(可能冲突)的信息组合为单一决策过程?

####2.2.2 用一个数字表示我们的确定程度
根据直觉判断包含“FREE”的消息很可能是垃圾短信在统计学上拿不到高学位。我们能不能得到一个不依靠直觉的结论,并且量化特定单词表示一条消息是非垃圾短信或者垃圾短信的可靠性?

我个人常常借助决策树,作为更好地理解概率问题的一种方法。在我们的例子中,下面就是所要做的事情:将语料库中的5574个文档按照文档类型分成两组(747个垃圾文档,4827个非垃圾文档),对每个组计算包含“FREE”的数量。这可以表示为一棵决策树,如图2-2所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/c41442408c745c61af8d552f8c04db4d5809223c.png" width="" height="">
</div>

我喜欢将决策树看成一系列管子(如果你愿意,也可以将其看作管道)。从初始节点开始,在管子中注入100%的可能性,而不是水。每个节点代表可能有多种结果的一个事件,将各种可能性分解到不同分支,不应该有任何可能性消失。

在本例中,我们从5574个文档开始,它们可能是垃圾短信或者非垃圾短信。大部分文档是非垃圾短信——5574个中有4827个,占86.6%——所以如果没有任何其他信息,随机选择一条消息并问你“是垃圾短信还是非垃圾短信?”你的回答应该是“非垃圾短信”(有86.6%的概率答对)。

树的下一级考虑每组文档中包含“FREE”的可能性。例如,如果一条消息是垃圾短信,有112/747的可能性包含“FREE”,以概率论的术语表达,如果文档是垃圾短信,包含“FREE”的概率是15%。

这很有趣,但是对我们的分类没有用处。我们真正想知道的是包含“FREE”的文档是垃圾短信的概率。不过,获得这一信息也不太难:我们只需要重新组织决策树,从文档是否包含“FREE”开始,而不是从垃圾短信和非垃圾短信开始。注意,不管如何构造决策树,最终都应该有4个“叶子”组。例如,应该仍然有112个文档是垃圾短信且包含“FREE”。在5574个文档中,有113个包含“FREE”,其中112个来自垃圾短信组,1个来自非垃圾短信组。经过更多的重新组织,我们应该得到图2-3所示的决策树。虽然和前面的树完全等价,但是提供了不同信息相互关联的不同视角。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/caf10c56e01398401cc0f7288b5b9ad90766a275.png" width="" height="">
</div>

具体地说,这棵决策树为我们提供了关心的信息:包含“FREE”的文档是垃圾短信的概率为112/113=99.1%(从科学上确认了我们的直觉)。

####2.2.3 贝叶斯定理
我们刚刚使用的方法有一个名称:贝叶斯定理。教科书中最枯燥的表现形式通常是:

<div style="text-align: center"><img src="https://yqfile.alicdn.com/9688c7285ded78b4947b01fc9b13083c661e2dc5.png" width="" height="">
</div>

|符号应该读作“在……条件下”。我们刚才的例子计算的是在一封电子邮件包含“FREE”的条件下,该邮件是垃圾邮件的概率,按照贝叶斯公式应该写作:

<div style="text-align: center"><img src="https://yqfile.alicdn.com/ae2e1fb8937b1630c8dec62191261ec5283203ba.png" width="" height="">
</div>

如果机械地代入数字,可以得到如下结果,这就是我们用决策树得出的结果:
<div style="text-align: center"><img src="https://yqfile.alicdn.com/f48ebf7070148b768b6307ced28e54674a13d457.png" width="" height="">
</div>

看待贝叶斯定理的方法之一是将其当作两部分数据的平衡措施:对世界的初始认识(在我们的例子中是有多少垃圾短信)以及附加的信息(在垃圾短信或者非垃圾短信中找到单词“FREE”的频率)。贝叶斯定理量化新信息中的权重:垃圾短信越少见,默认的预测就应该越向非垃圾短信倾斜,更换预测方法的证据就越有力。

看待贝叶斯定理的另一种方法是与独立性概念的关联。如果如下等式成立,则称两个事件A和B相互独立:

P (A and B) = P (A)×P(B)`

使用贝叶斯定理,上式可以得出:

P (A | B) = P (A)```

换言之,知道与B相关的任何细节不能传达任何关于A的有用信息(反之亦然)。相反,如果A和B不互相独立,贝叶斯定理将捕捉到两部分信息关联的强度。最后一点(也是一句忠告)是,要注意这种效应的不对称性。如果知道一个电子邮件是垃圾邮件,那么它有15%的概率包含“FREE”,但是知道一封电子邮件包含单词“FREE”,那么它有99%的概率是垃圾邮件!

蒙蒂•霍尔问题

如果你觉得上面介绍的方法很令人困惑,不要担心。这个问题既简单又复杂——进行计算很容易,但是认识到其真正意义却不简单。众所周知,人类的大脑很不擅长理解不确定性,即使非常聪明的人在这个问题上也会犯令人难堪的错误。最著名的例子是蒙蒂•霍尔问题:在游戏节目中有3个门,其中一个门后藏有奖品,当选手选择了一个门时,主持人打开剩下两个门中的一个,指出该门后面没有奖品。问题是,选手这时候应该改变自己的选择吗?20世纪50年代,Marilyn Vos Savant正确地回答了这个问题,但是一些著名的数学家(如Paul Erdos)却错误地企图指出她的错误。从这个故事里我得到了一个教训:处理概率时应该多加小心,因为人类直觉的过往记录并不好——当然,在公开批评任何人之前要三思而行!
####2.2.4 处理罕见的单词
贝叶斯定理为我们提供了根据一个单词决定一条短信是非垃圾短信还是垃圾短信的便利方法。但是,你可能已经注意到一个小问题。如果选择仅在一个类别中出现的单词——例如只存在于非垃圾邮件的“uncle”“honeybee”或者“wine”——那么我们的公式将对一个类别指定100%的概率,另一个类别指定0%的概率。换言之,如果我们看到一条包含单词“uncle”的消息,我们将带着100%的自信决定,这条消息不可能是垃圾短信,而不管这条消息的其余内容是什么。
时间: 2024-10-21 08:29:57

《Arduino家居安全系统构建实战》——2.2 根据一个单词决定的相关文章

《Arduino家居安全系统构建实战》——第1章 家居安全系统的入门知识

第1章 家居安全系统的入门知识 Arduino家居安全系统构建实战在这一章中,我们将会介绍如下的内容: 什么是家居安全基础设施它是如何工作的部署这样一个系统都需要些什么在当前条件下为安全系统所做的准备有线安全系统和无线安全系统传统系统与现代化家居安全系统为了紧紧跟随硬件的发展趋势,本书介绍了随处可见且价格极为低廉的平台--Arduino.今时今日,我们可以在各种各样的公共场所如中小学校.高等院校.小型企业或者公共机构见到这个小电路板的身影. Arduino平台因其众多的优势而著名,例如低廉的成本

《Arduino家居安全系统构建实战》——1.2 工作原理

1.2 工作原理 之前讨论了家居安全系统基本的组成部分,但是这些要素都是什么,它们是如何工作的呢?通过对它们进行分类,我们可以将一个安全系统分成两个部分. 1.2.1 硬件部分 一个基础设施的硬件要素必须能够胜任软件的所有技术需求.可以将它们进一步细分为3个不同的子类别.这种分类方式不应该被理解为具有排斥性,因为一个要素经常可以被分到多个子类别中,这种分类方式反而有助于你理解系统所执行的功能. 传感器:传感器将作为系统的感觉器官,其作用就如同人类的身体感官.它们的功能就是从环境中搜集信息,并将这

《Arduino家居安全系统构建实战》——导读

前言 机器学习项目开发实战 如果你手里拿着这本书,我就可以认定你是对机器学习感兴趣的.NET开发人员了.你可能对编写C#应用程序很熟悉,开发的很有可能是业务线应用程序.以前你可能遇到过F#,也可能没有.而且,你很有可能对机器学习感到好奇.这一主题每天都见诸报端,因为它和软件工程有着很紧密的联系,但是使用的是不熟悉.看似有些抽象的数学概念.简而言之,机器学习看上去是有趣的主题.值得学习的实用技能,但是从哪里入手难以说清. 本书的意图是作为开发人员的机器学习入门书.我的主要目标是使熟悉代码编写的读者

《Arduino家居安全系统构建实战》——1.6 传统系统与现代化的家居安全系统的比较

1.6 传统系统与现代化的家居安全系统的比较 最后,我们将给出一个传统系统与现代化系统之间的比较,值得指出的是,在面对不同需求的时候,它们各自都有着特定的用处,这些需求例如减少模型的复杂性,提高系统的可靠性,增加系统可用性以及向开发者提供丰富的信息. 以前,如果综合考虑到多种因素,例如价格.技术的成熟度以及现有的基础设施(连接)等,以一个较低的成本来实现一个可以实时管理的系统几乎是不可能的. 而在智能手机和平板电脑已经普及的今天,这些设备有足够的能力来将硬件收集的数据即时进行发送和接收,并实现这

《Arduino家居安全系统构建实战》——2.6 改进分类器

2.6 改进分类器 现在我们已经有了基准-- 低于84.4%是糟糕的结果,至少要超过87.7%.是时候观察使用可以自由支配的两大手段(标记化程序和分类器选用的标记)能达到什么效果了. 2.6.1 使用每个单词 利用一个单词,我们就能将分类器的正确率从84.8%提升到87.7%.如果使用每个可用的标记代替单个词汇,预测正确率当然应该大幅提高.我们来尝试一下这个思路,首先,必须从训练集中提取每个标记.我们编写一个vocabulary函数,对每个文档应用标记化程序,将标记合并为单一集合,实现上述功能.

《Arduino家居安全系统构建实战》——1.3 部署安全系统的先决条件

1.3 部署安全系统的先决条件 如果你正在考虑部署一个安全系统,那么最有可能的原因就是你有这方面的关键需求.因此,在这里最重要的事情就是要准确地确定这种需求.如果做不到这一点,我们最终会步入歧途并造成损失或者导致半途而废. 如果并没有这种需求,你只是拥有着一颗对现代科技勇于探索的心,那么你可能是出于学习和娱乐的目的来设计这个系统,或者试图将自己的家打造成一个现代化的场所.你可以浏览一下这个行业的先进企业的网站以获得参考. 我们可以看到,大多数企业的系统是类似的,只是在某些部分存在一些差异,而这些

《Arduino家居安全系统构建实战》——第1章 256级灰度

第1章 256级灰度 机器学习项目开发实战 构建自动识别数字图像的程序 如果你打算建立一个当前技术热点的列表,机器学习当然会名列前茅.然而,虽然这个术语到处出现,但是它的真实含义往往含混不清.它是和"大数据"或者"数据科学"一样的东西吗?它和统计学有何不同之处?表面上,机器学习似乎是一种奇特.令人畏惧的专业,使用令人眼花缭乱的数学知识和算法,和软件工程师的日常活动没有多少共同之处. 在本章以及本书余下的部分中,我的目标是和大家一起完成实际项目,以此阐明机器学习的原理

《Arduino家居安全系统构建实战》——1.1 家居安全的基础设施

1.1 家居安全的基础设施 当然,如果你被问到一个关于安全系统组成部分的问题,你可能会毫不犹豫地对这个问题做出回答,例如,你可能会就监控摄像头.运动传感器和报警器等设备侃侃而谈.但是你确实了解这些不同的组成模块了吗?你能清楚地说出它们之间所有的关联吗?你能详细地讲出它们的工作方式吗?你能准确地说出传统的系统和当前的系统的区别吗?不要着急,这些答案都将为你揭晓. 好了,现在我们这里已经有这些问题的答案了.安全基础设施包括了所有的硬件设备.软件部分以及它们之间关联的设计,将所有这些组件组合在一起构成

《Arduino家居安全系统构建实战》——1.7 小结

1.7 小结 在这一章的学习中,本书详细地介绍了一个安全家居系统的各个部分,但是并没有涉及相关的任何具体设备.通过理论讲解的方式,我们了解了系统的组成部分以及它们各自的功能.在拥有了这些知识之后,我们已经做好了在下一章中深入学习的准备了.我可以向你保证,下一章中内容将会是引人入胜的. 在下一章中,我们将了解Arduino的概念和历史,以及Arduino Uno的各个组成部分.同样我们也将学习到它们的工作方式,以及如何使用shield对Arduino UNO进行扩展.