斯坦福大学公开课机器学习: machine learning system design | prioritizing what to work on : spam classification example(设计复杂机器学习系统的主要问题及构建复杂的机器学习系统的建议)

当我们在进行机器学习时着重要考虑什么问题。以垃圾邮件分类为例子。假如你想建立一个垃圾邮件分类器,看这些垃圾邮件与非垃圾邮件的例子。左边这封邮件想向你推销东西。注意这封垃圾邮件有意的拼错一些单词,就像Med1cine中有一个1,m0rtgage里有个0。右边的邮件显然不是一个垃圾邮件。

斯坦福大学公开课机器学习: machine learning system design | prioritizing what to work on : spam classification example(设计复杂机器学习系统的主要问题及构建复杂的机器学习系统的建议)

假设我们已经有一些加过标签的训练集,比如标注垃圾邮件为y=1,和非垃圾邮件为y=0。那么如何用监督学习的方法来构造一个分类器,区分垃圾邮件和非垃圾邮件呢?为了应用监督学习,首先必须确定的是,如何用邮件的特征构造向量x。给出训练集中的特征x和标签y,我们就能够训练出某种分类器,比如用逻辑回归的方法。这里有一种选择,邮件的一些特征变量的方法,比如说我们可能会想出一系列单词或者成百上千的单词,我们可以认为这些单词能够用来区分垃圾邮件或非垃圾邮件。比如,如果邮件包含单词"deal(交易),同时包含单词"buy(买)"、 "discount(折扣)",那么很有可能是垃圾邮件。如果一封邮件中,包含了收件人名字,这有可能是一个知道收件人的人写的,说明这封邮件不太可能是垃圾邮件。因为某些原因我们还可以认为now(现在)"这个单词表明了这封邮件可能并不是垃圾邮件,因为经常收到一些很紧急的邮件,当然还有别的单词。我们可以选出这样成百上千的单词,给出一封这样的邮件,我们可以将这封邮件用一个特征向量来表示。方法如下,现在列出一些之前选好的单词,然后按字典序排序(并不是一定要这样的排序)。看看下图的例子,准备检查一下前面提到的词汇,看它们是否出现在这封邮件中。用一个特征向量x,表示右边的这封邮件,收件人名字没有出现,因此是0,单词"buy(购买)"出现了,所以是1. 注意在向量里面只有1或0,表示有没有出现。所以尽管"buy"出现了两次,这里仍然只是1。单词"deal"也出现了,所以也是1。单词"discount"并没有出现,至少在这封邮件里是这样,以此类推。单词"now"出现了,所以我在特征向量中,依据对应的单词是否出现,填上0和1。 在这个例子中,因为我选择了100个单词,用于表示是否可能为垃圾邮件。所以这个特征向量x的维度是100,并且如果这个特定的单词即单词级j出现在这封邮件中, 那么每一个特征变量Xj的值为1。反之,Xj为0。这样我们就可以使用特征向量来表示这封邮件。顺便说一句,在实际工作中最普遍的做法是遍历整个训练集。然后在训练集中选出出现次数最多的n个单词,n一般介于10,000和50,000之间。然后把这些单词作为特征。因此不同于手动选取,我们只用遍历训练样本,然后选出出现频率最高的词语。差不多是10,000到50,000个单词,这些单词会构成特征。这样你就可以用它们,来做垃圾邮件分类。

斯坦福大学公开课机器学习: machine learning system design | prioritizing what to work on : spam classification example(设计复杂机器学习系统的主要问题及构建复杂的机器学习系统的建议)

如果你正在构造一个垃圾邮件分类器,你应该会面对这样一个问题,那就是如何在有限的时间和精力下改进你的方法,从而使得你的垃圾邮件分类器具有较高的准确度。从直觉上讲是要收集大量的数据。就垃圾邮件分类而言,有一个叫做"Honey Pot"的项目,它可以建立一个假的邮箱地址,故意将这些地址泄露给发垃圾邮件的人,这样就能收到大量的垃圾邮件。这样的话,我们就能得到非常多的垃圾邮件来训练学习算法。在前面的课程中我们知道,大量的数据可能会有帮助,也可能没有。对于大部分的机器学习问题,还有很多办法用来提升机器学习的效果。比如对于垃圾邮件而言,也许你会想到用更复杂的特征变量。像是邮件的路径信息,这种信息通常会出现在邮件的标题中,因此垃圾邮件发送方在发送垃圾邮件时,他们总会试图让这个邮件的来源变得模糊一些,或者是用假的邮件标题或者通过不常见的服务器来发送邮件。用不常见的路由他们就能给你发送垃圾邮件,而且这些信息也有可能包含在邮件标题部分。因此可以想到,我们可以通过邮件的标题部分来构造更加复杂的特征,来获得一系列的邮件路由信息,进而判定这是否是一封垃圾邮件。你还可能会想到别的方法,比如从邮件的正文出发,寻找一些复杂点的特征,比如单词"discount”, 是否和单词"discounts"是一样的,又比如单词"deal(交易)"和"dealer(交易商)"是否也应视为等同。甚至,像这个例子中有的单词小写有的大写,或者我们是否应该用标点符号来构造复杂的特征变量,因为垃圾邮件可能会更多的使用感叹号。同样的,我们也可能构造更加复杂的算法来检测或者纠正那些故意的拼写错误,比如m0rtgage、med1cine、w4tches。因为如果你将4放到"w4tches"中,那么用我们之前提到的简单的方法,垃圾邮件分类器不会把"w4tches” 和"watches” 看成一样的, 这样我们就很难区分这些故意拼错的垃圾邮件,这么做可以逃避一些过滤规则。当我们使用机器学习时,可以“头脑风暴”一下,想出一堆方法来试试。

斯坦福大学公开课机器学习: machine learning system design | prioritizing what to work on : spam classification example(设计复杂机器学习系统的主要问题及构建复杂的机器学习系统的建议)

上一篇:jQuery学习教程(3)


下一篇:斯坦福大学公开课机器学习:advice for applying machine learning - deciding what to try next(设计机器学习系统时,怎样确定最适合、最正确的方法)