【吴恩达机器学习笔记】第十一章 机器学习系统的设计

搜索微信公众号:‘AI-ming3526’或者’计算机视觉这件小事’ 获取更多人工智能、机器学习干货

csdn:https://blog.csdn.net/qq_36645271

github:https://github.com/aimi-cn/AILearners


第十一章 机器学习系统的设计

11.1 确定执行的优先级

11.1.1 邮件分类的例子

我们以一个垃圾邮件分类器算法为例进行讨论。为了应用监督学习,我们首先要做的决定是如何选择并表达特征向量 x x x。通过向量特征 x x x和分类标签 y y y,我们就能训练一个分类器。我们可以选择一个由100个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为1,不出现为0),维度为100。

比如说,如果一封邮件的片段包含单词deal,buy,discount,它可能是一封垃圾邮件,如果包含andrew,now,可能不是垃圾邮件。我们可以找到100个这样的单词。

现在,我们将一封邮件中的所有句子拆分成单词并排序,编码成一个特征向量。我们将第一一个特征向量 x x x,如果邮件中出现词表中的单词,对应特征为1,若没有出现,对应为0。
在这里插入图片描述
这样我们就可以用特征向量来表示这封文件。虽然我们只选择了100个单词来举例,但在实际中,我们会从训练集中挑出出现频率最多的n个单词,n一般介于10000到50000之间。

11.1.2 制作一个垃圾邮件分类器

假设我们正在制作一个垃圾邮件分类器,我们可以参考一下方法来降低错误率:

  • 收集更多的数据
  • 基于邮件的路由信息使用更复杂的特征变量来描述邮件。
  • 关注邮件正文,并构建更复杂的特征。比如单词discount和discounts是否应该被视为同一个词、大小写问题,标点符号的使用等。
  • 设计一些更加复杂的算法,来检测单词中故意出现的拼写错误,例如m0rtgage,med1cine,w4tches等。

11.2 误差分析

11.2.1 推荐方法

当我们准备从事研发机器学习产品或者开发机器学习应用时,通常来说,构建一个学习算法的推荐方法为:

  • 通过一个简单的算法来快速的实现它,然后通过交叉验证来测试数据
  • 然后画出相应的学习曲线以及检验误差,来找出你的算法是否存在高偏差或高方差的问题,之后再来决定是否使用更多的数据或特征等。
  • 误差分析(error analysis):例如在实现一个垃圾邮件分类器的时候,要观察交叉验证集的情况,看一下被算法错误分类的文件。通过查看这些被错误分类的文件,可以找出其蕴含的规律,这样就会启发你如何去设计新的特征,并指导你改进算法。

11.2.2 误差分析

假设我们的邮件分类系统中有500个交叉验证集,我们的算法错误分类了100个。这时我们就应该手动检查这100个数据并基于以下情况对其分类:

  • 这是哪种类型的邮件,例如卖假药的邮件,卖假货的邮件,钓鱼邮件,其他类型的邮件。
  • 观察有什么线索或是额外特征能够帮助算法识别这种邮件。

通过手工检查,确定哪种类型的邮件被错误分类的最多,那么就要对症下药,更改算法。因此,**误差分析(error analysis)**是一种手动的去检查算法出现的错误的过程,通过这种方法,我们可以更高效的实现算法。

总的来说,通过一个简单粗暴的算法实现,你可以很快找到算法的不足所在和难以处理的样本类型,然后把经精力中在它们身上

11.2.3 数值估计(numerical evaluation)的重要性

当你改进学习算法时,如果我们的算法能够返回一个数值评价指标来估计算法执行的效果,将会很有帮助。结果可能有对有错,但数字可以告诉我们学习算法的效果有多好。

例如当我们在做邮件分类使,是否要将discount,discounts,discounted,discounting作为一个词。这时我们就需要用到词干提取工具,这个工具会专注于单词的前几个字母,如discou,并把带有这几个字母的单词当成一个单词来处理。但词干提取工具是一把双刃剑,例如它会把universe和university当成一个词。

这时,我们可以通过数值估计的方法来判断进行词干提取到底是不是一个好主意。最简单的,我们可以通过交叉验证,在使用和不使用词干提取时各自的错误率来估计算法的效果。对于这个特定的问题,这个单一规则的数值评价指标就叫做交叉验证错误率。

通过一个单一规则的数值评价指标,你可以观察误差率是变大了还是变小了,你可以通过它更快的实践新的想法,它能直接告诉你你的想法能提高还是降低学习算法的表现。推荐在交叉验证集上来做误差分析而不是在测试集上。

11.3 类偏斜的误差度量

11.3.1 癌症分类的例子

跟之前一样,我们假设 y = 1 y=1 y=1表示患者患有癌症, y = 0 y=0 y=0表示他们没有癌症。假设我们用测试集检验了训练的逻辑回归模型,并且发现它只有1%的错误,因此我们99%会做出正确诊断。

这看起来跟不错,但是,假如我们发现在测试集中只有0.5%的患者真正得了癌症,因此,在我们的筛选程序里,只有0.5%的患者患了癌症。因此,在这个例子中1%的错误率就显得没有那么好了。举一个具体的例子:
在这里插入图片描述
上述代码不是机器学习代码,它忽略了输入值 x x x,并且总让 y = 0 y=0 y=0,因此它总是预测每人得癌症。那么这个算法实际上只有0.5%的错误率,这甚至比我们之前用机器学习算法得到的1%的错误率更好。上述情况发生在正样本的数量与负样本的数量相比非常非常少的情况下,我们把这种情况叫做偏斜类(skewed classes)

因此使用分类误差或者分类精确度来作为评估度量可能会产生如下问题:假如我们有一个算法,它的精度是99.2%(0.8%的误差)。当我们对算法做出了一些改动,使它的精确度上涨为99.5%(0.5%的误差),那么这到底算不算是对算法的提升呢?

用某个数作为评估度量值的好处就是它可以帮助我们迅速决定我们是否需要对算法做出一些改进。当我们的精确度从99.2%到99.5%时到底是提高了算法的准确度还是说我们只是把代码替换成了例如总是预测 y = 0 y=0 y=0

因此,如果你有一个偏斜类,用分类精确度并不能很好地衡量算法。当我们遇到偏斜类时,我们希望有一个不同的误差度量值。

11.3.2 查准率(precision)/召回率(recall)

假设我们正在使用测试集来评估一个分类模型,对于测试集中的样本,每个测试集中的样本都会等于0或1。我们的分类算法要做的是做出值的预测,并且学习算法会为每

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值