Log

2022.01.29继续学习第十一章,稍微提提速
2022.01.30今天效率不大行,明天争取弄完
2022.02.04结束第十一章


一、确定执行的优先级(Prioritizing what to work on: Spam classification example)

  • 本篇文章将会介绍机器学习系统设计时所面临的主要问题,以及在如何制定一个复杂的机器学习系统方面给出的一些建议(以免在下一章内容的学习过程中产生脱节,因为会涉及到设计复杂学习系统时可能遇到的一系列不同的问题),这些知识在构建大型机器学习系统时,会让我们节约大量的时间。
  • 首先要讲的是在实际工作过程中应该优先处理哪些事情,将以一个垃圾邮件分类的例子来开始本节内容。

1. 垃圾邮件分类器的建立

  • 假如想要建立一个垃圾邮件分类器,下面是一对垃圾和非垃圾邮件的例子:
    在这里插入图片描述

  • 垃圾邮件(上图左)会想向你推销东西,发邮件的人会故意拼错一些单词,比如 Med1cine 和 M0rtages;正常的邮件则如右图所示。

  • 假设垃圾邮件的训练集已经有了用数字表示的分类标签,对于垃圾邮件或非垃圾邮件,用 y=1 或 y=0 来表示。

  • 那么如何通过监督学习的方法来构造一个分类器,来区分垃圾邮件和非垃圾邮件?

  • 为了应用监督学习,首先要想的是如何来表示邮件的特征向量 x,通过特征向量 x 和分类标签 y 就能训练一个分类器,比如使用逻辑回归的方法。

  • 下面是一个选择邮件的特征向量的方法:

  • 可以提出一个可能含100个单词的列表,通过这些单词来区分垃圾邮件或非垃圾邮件。例如,如果一封邮件的片段包含单词 deal、buy、discount,那么它就很有可能是一封垃圾邮件;如果包含接收者的姓名(意味着写邮件的人知道对方是谁)或者单词 now (经常在一些紧急邮件中出现),那么这份邮件就很可能不是垃圾邮件。
    在这里插入图片描述

  • 假如有一封邮件(上图),可以将这封邮件的各个片段编码成如下的一个特征变量,列出之前找到的100个单词,然后按照字典序排序,得到了一张单词表,定义一个特征变量x 来表示,单词表中的单词是否在该邮件中出现。
    x = [ 0 ( a n d r e w ) 1 ( b u y ) 1 ( d e a l ) 0 ( d i s c o u n t ) . . . 1 ( n o w ) . . . ] x ∈ R 100 \begin{aligned} x=\left[\begin{matrix} \quad0&(andrew)\\ \quad1&(buy)\\ \quad1&(deal)\\ \quad0&(discount)\\ \quad...\\ \quad1&(now)\\ \quad... \end{matrix}\right]\qquad x\in\R^{100} \end{aligned} x=0110...1...(andrew)(buy)(deal)(discount)(now)xR100

  • 注意单词是否出现用0和1来表示,单词出现多次也用一表示(只统计单词是否出现,而不统计出现的次数)。
    x j = { 1 i f    w o r d    j    a p p e a r s    i n    e m a i l 0 o t h e r w i s e \begin{aligned} x_j=\begin{cases} 1 \qquad if\ \ word\ \ j\ \ appears\ \ in\ \ email\\ 0\qquad otherwise \end{cases} \end{aligned} xj={1if  word  j  appears  in  email0otherwise

  • 虽然选取了 100 个单词来描述刚才的过程,但实际工作中普遍的做法是,在训练集中挑选出出现频率最多的 n 个单词(n 一般在 10000 到 50000 之间),然后将它们作为特征向量,并且用他们来表示邮件,对其进行分类。

2. 可能会遇到的问题以及解决方案

  • 在建立一个垃圾邮件分类器的过程中,会遇到的一个问题就是如何在有限的时间下让垃圾邮件分类器具有高精准度和低错误率。
    How    to    spend    your    time    to    make    it    have    low    error? − Collect    lots    of    data E . g .    “ h o n e y p o t ”    p r o j e c t . − Develop     sophisticated     features     based     on     email     routing   information    ( f r o m    e m a i l    h e a d e r ) . − Develop     sophisticated     features     for     message     body e . g .    s h o u l d    “ d i s c o u n t ”    a n d    “ d i s c o u n t s ”    b e    t r e a t e d    a s    t h e    s a m e    w o r d ?         H o w    a b o u t    “ d e a l ”    a n d    “ D e a l e r ” ?    F e a t u r e s    a b o u t    p u n c t u a t i o n ?    − Develop     sophisticated     algorithm     to     detect     misspellings e . g .    m 0 r t g a g e ,    m e d 1 c i n e ,    w 4 t c h e s . \begin{aligned} &\textbf{How\ \ to\ \ spend\ \ your\ \ time\ \ to\ \ make\ \ it\ \ have\ \ low\ \ error?}\\ &\qquad-\textbf{Collect\ \ lots\ \ of\ \ data}\\ &\qquad\quad E.g.\ \ “honeypot”\ \ project.\\ &\qquad-\textbf{Develop\ \ sophisticated\ \ features\ \ based\ \ on\ \ email\ \ routing information}\ \ ( from\ \ email\ \ header).\\ &\qquad-\textbf{Develop\ \ sophisticated\ \ features\ \ for\ \ message\ \ body}\\ &\qquad\quad e.g.\ \ should\ \ “discount”\ \ and\ \ “discounts”\ \ be\ \ treated\ \ as\ \ the\ \ same\ \ word?\ \ \\ &\qquad\ \ \ \ \qquad How\ \ about\ \ “deal”\ \ and\ \ “Dealer”?\ \ Features\ \ about\ \ punctuation?\ \ \\ &\qquad-\textbf{Develop\ \ sophisticated\ \ algorithm\ \ to\ \ detect\ \ misspellings}\\ &\qquad\quad e.g.\ \ m0rtgage,\ \ med1cine,\ \ w4tches. \end{aligned} How  to  spend  your  time  to  make  it  have  low  error?Collect  lots  of  dataE.g.  honeypot  project.Develop   sophisticated   features   based   on   email   routing information  (from  email  header).Develop   sophisticated   features   for   message   bodye.g.  should  discount  and  discounts  be  treated  as  the  same  word?      How  about  deal  and  Dealer?  Features  about  punctuation?  Develop   sophisticated   algorithm   to   detect   misspellingse.g.  m0rtgage,  med1cine,  w4tches.
  1. 收集大量的数据:
    确实有一种倾向,认为数据收集的越多,算法就会越准确。事实上在垃圾邮件领域就有一个很严肃的项目叫做honey pot项目,这个项目通过创建虚假的邮箱地址,然后故意将这些地址暴露给垃圾邮件的发送者,以此来收集大量的垃圾邮件,然后得到大量的垃圾邮件数据来训练分类算法。根据之前学到的内容,可以知道大量的数据可能会有帮助,但绝大多数时候不管用。

  2. 用更复杂的特征变量:
    比如将发件人的信息包括其中,这种信息通常会出现在邮件的标题中,所以发送者发送垃圾邮件时,他们通常会去掩盖这封邮件的来源,还可能使用虚假的邮件标题,或者通过很奇怪的计算机服务器或者很奇怪的途径来向你发送垃圾邮件,而通过邮件的标题可以反馈出这种信息,所以可以通过邮件的标题来构造一个更加复杂的特征来捕捉到这封邮件的来源信息,并以此判断邮件是否是垃圾邮件。

  3. 关注邮件的主体部分:
    例如单词 discount 和 discounts 应该被视作同一个单词,或者把 deal 和 dealer 视作同一个单词,甚至还可以关注首字母的大小写或者,通过标点符号来构建复杂的特征,因为垃圾邮件一般会使用很多感叹号(但是也不一定)。

  4. 设计更复杂的算法检测拼写错误:
    通过设计更复杂的算法来检测单词中的拼写错误,例如:m0rtgage、 med1cine、 w4tch。因为垃圾邮件发送者的确会这么做来躲避检测,这样可以导致前面提到的简单的方法,无法把看作是一个单词,所以就很难识别出垃圾邮件中故意拼错的单词(对于中文的话我发现存在一些用谐音字来替换原有字句的现象,所以这种方法还是具有一定的使用价值的)。

二、误差分析(Error analysis)

  • 主要内容: 介绍误差分析的概念,帮助我们更系统的在众多方法中作出选择。误差分析以及设定误差度量值的重要性(设定某个实数来评估学习算法并衡量它的表现)

1. 推荐的方法

  1. 通过一个简单的算法来快速的实现目标
    在研发机器学习产品或者开发机器学习应用时,通常来说,最好的办法不是建立一个很复杂的,有许多复杂特征的系统,而是通过一个简单的算法来快速的实现它(即使这个速成的东西并不是很完美),然后通过交叉验证来测试数据
  2. 画出相应的学习曲线来帮助我们进行之后的判断
    通过画出学习曲线以及检验误差来找出算法是否存在高偏差或者高方差的问题,或者一些其他问题,在做出这些分析之后,再来决定是否使用更多的数据或特征等等。
    这种方法在刚开始解决一个机器学习问题时,能起到很好的作用,因为你并不能预知是需要更多的特征,还是需要更多的数据,或是别的东西,在缺乏各种证据的情况下,很难提前知道应该把时间花在哪些地方。所以很多时候应当先进行一次简单快速的实现,然后画出学习曲线来帮助我们进行之后的判断,避免在编程过程中出现过早优化(premature optimization) 的问题,这种思想告诉我们应当用实际的证据来指导我们的决策,而不是仅凭直觉
  3. 误差分析
    当实现比如一个垃圾邮件分类器的时候,应当经常观察交叉验证集的情况,然后看一看那些被算法错误分类的文件。通过查看这些被错误分类的垃圾邮件和非垃圾邮件分析经常被错误分类的邮件有什么共同的特征和规律。这样做多了以后,这个过程就会启发你应该怎样设计新的特征,或者告诉你现在的系统有什么优点和缺点,然后指导你想出办法来改进它,下面将会举出一个具体的例子来进行说明。

2. 误差分析

  • 主要内容: 通过手动去检查算法所出现的失误,来引导我们走上最有成效的道路。

  • 假设在做一个垃圾邮件分类器,在交叉验证集中有 500 个样本。

  • 假如该算法有很高的错误率,错误分类了 100 个交叉验证样本,接下来要做的就是手动核查这 100 个错误,然后手工为它们分类。

  • 同时要考虑这些邮件是什么类型的邮件:有什么线索或者特征,能够帮助算法正确的进行分类。

  • 得到如下的分类及数量:
    P h a r m a   ( 卖 药 ) : 12 R e p l i c a / f a k e   ( 卖 假 货 ) : 4 S t e a l    p a s s w o r d s   ( 钓 鱼 邮 件 ) : 53 O t h e r : 31 \begin{aligned} &Pharma\ (卖药):&12\\ &Replica/fake\ (卖假货):&4\\ &Steal\ \ passwords\ (钓鱼邮件):&53\\ &Other:&31 \end{aligned} Pharma ():Replica/fake ():Steal  passwords ():Other:1245331

  • 发现算法在判断钓鱼邮件的时候表现的很差,说明应该花更多的时间仔细研究这类邮件,看看是否可以想到更好的特征来为他们正确分类,同时看看有什么线索或者额外的特征能帮助算法识别这种邮件。

  • 假设能帮助我们能更好地进行分类的一些方法或者特征是检查故意的拼写错误奇怪的邮件来源以及垃圾邮件特有的标点方式

  • 从交叉验证集中手工分类后得到的结果如下:
    D e l i b e r a t e    m i s s p e l l i n g s : 5 U n u s u a l    e m a i l    r o u t i n g : 16 U n u s u a l   ( s p a m m i n g )    p u n c t u a t i o n : 32 \begin{aligned} &Deliberate\ \ misspellings:&5\\ &Unusual\ \ email\ \ routing:&16\\ &Unusual\ (spamming)\ \ punctuation:&32 \end{aligned} Deliberate  misspellings:Unusual  email  routing:Unusual (spamming)  punctuation:51632

  • 上面的结果说明故意拼写错误的现象在错误样本中很少出现,所以不值得花时间去编写算法来识别它;很多垃圾邮件都有奇怪的标点方式,是一个很明显的信号,说明值得花时间去构造一些更加复杂的、基于标点符号的特征。

  • 总结: 真正要做的事是找出这种算法最难以分类的样本,对于不同的算法,不同的学习算法而言,对他们造成的困难的样本总是相似的。通过一个简单粗暴的算法的实现,可以很快地找到算法的不足所在和难以处理的样本类型,然后集中精力放在他们身上。

3. 数值估计(numerical evaluation)

  • 在改进学习算法时,另一个技巧是保证自己对学习算法有一种数值估计的方法,也就是说,当改进学习算法的时候,如果算法能够返回一个数值评价指标来估计算法执行的效果,将会很有帮助。

  • 假如正在决定是否应该将以下几个单词视作同一个单词,这样做的一种方法就是只看一个单词中的前几个英文字母,发现这些单词大体上有着相似的意思:
    d i s c o u n t ‾ d i s c o u n t ‾ s d i s c o u n t ‾ e d d i s c o u n t ‾ i n g \begin{aligned} &\underline{discount}\\ &\underline{discount}s\\ &\underline{discount}ed\\ &\underline{discount}ing\\ \end{aligned} discountdiscountsdiscounteddiscounting

  • 在一自然语言处理中,这种方法是通过一种词干提取软件实现的,可以参考 Porter Stemmer 、fasttext 。

  • 但是这种词干提取软件只会简单的检查单词的前几个字母,这样的方式也有坏的一面,例如这个软件可能把 universe 和 university 看成是一个单词,因为这两个单词的开头字母都非常相似。

  • 因此,在决定要不要使用这样的软件来进行垃圾邮件分类,就很难做出抉择,即使是进行误差分析,可能也无法帮助我们去决定进行词干提取到底是不是一个好主意。而如果要判断此类提取软件是否对我们的分类器有益,最好的方法是用最快的方式来尝试使用一下他,然后看他能否起到效果。
    W i t h o u t    s t e m m i n g : 5.0 %    e r r o r W i t h    s t e m m i n g : 3.0 %    e r r o r D i s t i n g u i s h    u p p e r / l o w e r    c a s e : 3.2 %    e r r o r \begin{aligned} &Without\ \ stemming:&5.0\%\ \ error\\ &With\ \ stemming:&3.0\%\ \ error\\ &Distinguish\ \ upper/lower\ \ case:&3.2\%\ \ error\\ \end{aligned} Without  stemming:With  stemming:Distinguish  upper/lower  case:5.0%  error3.0%  error3.2%  error

  • 如果通过数值方法的评估算法的效果将会非常有用。也许最容易想到的方法是通过交叉验证在使用和不使用词干提取时各自的错误率来估计算法的效果。
    如果没有使用词干提取,最后得到的结果有 5% 的分类错误率,再使用词干提取并重新运行,算法得到了比如 3% 的错误率,错误率的减少能让你很快的判断出使用词干提取其实是一个好主意。
    对这个特定的问题,这个很自然的单一规则的数值评价指标.(single rule number evaluation metric),就叫做交叉验证错误率(the cross validation error)

  • 在之后,这种带有数值评价指标的例子还需要进行一些其他的处理,将会在之后的内容中介绍到。

  • 再说一个例子,决定是否应该区分单词的大小写,比如 Mom 和 mom,应该把他们看成一个单词,还是不同的单词(他们应该被视作相同的特征,还是不同的特征)。如果不区分大小写,最后得到 3.2% 的错误率,要比之前的错误率更高,于是我们就能很快地决定不应该区分大小写。

  • 当改进学习算法时,总是要去尝试很多新主意和新版本的算法,如果你每次都手动地去检测这些例子,看表现的好不好,会让你很难决定到底应不应该使用词干提取、该不该区分大小写。
    但是通过一个单一规则的数值评价,可以观察误差率是变大了还是变小了,通过它更快地实践新想法,它能直接表明我们的想法能提高还是降低学习算法的表现,这会大大加速我们的进程。

  • 所以强烈推荐在交叉验证集上来做误差分析,而不是在测试集上(从数学的角度用测试集来做是有问题的)。

  • 总结: 刚开始研究一个新的机器学习问题时,应该先实现一个简单粗暴(尽管效果不一定好)的学习算法。一旦有了一个初始的算法实现,我们就能使用一个强有力的工具来决定下一步应该如何做。
    第一步,看看它所造成的错误,通过误差分析来看看它出现了什么失误,然后以此决定之后的优化方法;
    第二步,在已经有了一个简单粗暴的算法实现,又有一个素质评价指标的基础上,可以进一步利用这些来试验新的想法,快速发现这些想法是否能够提高算法的表现,从而更快地决定我们的算法应该放弃什么,应该包含什么。

三、不对称性分类的误差评估(Error metrics for skewed class)

  • 有了算法的评估和误差度量值,还需要注意使用一个合适的误差度量值,这会对学习算法产生非常微妙的影响,也就是偏斜类(skewed class) 的问题。

1. 癌症分类问题(偏斜类)

  • 我们拥有内科病人的特征变量,希望知道他们是否有癌症(就像恶性与良性肿瘤的分类问题一样)
    T r a i n    l o g i s t i c    r e g r e s s i o n    m o d e    h θ ( x ) y = { 1 i f    c a n c e r 0 o t h e r w i s e F i n d    t h a t    y o u    g o t    1 %    e r r o r    o n    t e s t    s e t . ( 99 %    c o r r e c t    d i a g n o s e s )    \begin{aligned} &Train\ \ logistic\ \ regression\ \ mode\ \ h_\theta(x)\\ &y=\begin{cases} &1\qquad if\ \ cancer\\ &0\qquad otherwise\\ \end{cases}\\ &Find\ \ that\ \ you\ \ got\ \ 1\%\ \ error\ \ on\ \ test\ \ set.\\ &\qquad\qquad\qquad\qquad(99\%\ \ correct\ \ diagnoses)\ \ \end{aligned} Train  logistic  regression  mode  hθ(x)y={1if  cancer0otherwiseFind  that  you  got  1%  error  on  test  set.(99%  correct  diagnoses)  
  • 训练逻辑回归模型,用测试集检验模型,发现只有 1% 的错误(99% 会做出正确诊断)。这个结果看起来不错,但是假如在测试集中只有 0.5% 的患者得了癌症, 1% 的错误率就显得没有那么好了。
  • 下面的一个非机器学习算法让预测值恒为 0,将会得到 0.5% 的错误率,甚至比 1% 的错误率都要好:
function y = predictCancer(x) 
 y = 0; %ignore x! 
return
  • 这种情况发生在正例和负例的比率非常接近于一个极端情况,正样本的数量相比于负样本的数量非常非常少,这种情况被叫做偏斜类(skewed class)
  • 因此使用分类误差或者分类精确度来作为评估可能会产生如下问题:
  • 算法精确度的提升不一定能正确反应分类模型的质量是否提升,当我们遇到这样一个偏斜类时,我们希望有一个不同的误差度量值或者不同的评估度量值,其中一种评估度量值叫做查准率和召回率(precision and recall)

2. 查准率和召回率

  • 假设有一个二分(二元分类)问题,用测试集来评估一个分类模型,对于测试集中的样本,每个样本的实际值都会等于 0 或 1,学习算法会为测试集中的每一个实例做出预测,预测值也是等于 0 或 1。
    y = 1    i n    p r e s e n c e    o f    r a r e    c l a s s    t h a t    w e    w a n t    t o    d e t e c t    \begin{aligned} y=1\ \ in\ \ presence\ \ of\ \ rare\ \ class\ \ that\ \ we\ \ want\ \ to\ \ detect\ \ \end{aligned} y=1  in  presence  of  rare  class  that  we  want  to  detect  

在这里插入图片描述

  • 实际类与预测类的值均为 1 ,把这个样本叫做真阳性(true positive)

  • 实际类与预测类的值均为 0 ,把这个样本叫做真阴性(true negative)

  • 学习算法预测为 1 ,但实际上等于 0 ,叫做假阳性(false positive)

  • 学习算法预测为 0 ,但实际上等于 1 ,叫做假阴性(false negative)

  • 现在就有了另一种方式来评估算法的表现,需要计算两个数字:

  1. 查准率(precision)
    所有预测的患有癌症的病人有多大比例的病人是真正患有癌症的。
    一个分类模型的查准率,等于真阳性除以所有预测为阳性的数量:
    P r e c i s i o n = T r u e    p o s i t i v e s # p r e d i c t e d    p o s i t i v e = T r u e    p o s i t i v e s T r u e    p o s   +   F a l s e    p o s \begin{aligned} Precision=\frac{True\ \ positives}{\#predicted\ \ positive}=\frac{True\ \ positives}{True\ \ pos\ +\ \red{False\ \ pos}} \end{aligned} Precision=#predicted  positiveTrue  positives=True  pos + False  posTrue  positives
    查准率越高越好。
  2. 召回率(recall)
    确实患有癌症中有多少可以正确预测为患有癌症。
    一个分类模型的召回率,等于真阳性除以所有实际为阳性的数量:
    R e c a l l = T r u e    p o s i t i v e s # a c t u a l    p o s i t i v e = T r u e    p o s i t i v e s T r u e    p o s   +   F a l s e    n e g \begin{aligned} Recall=\frac{True\ \ positives}{\#actual\ \ positive}=\frac{True\ \ positives}{True\ \ pos\ +\ \red{False\ \ neg}} \end{aligned} Recall=#actual  positiveTrue  positives=True  pos + False  negTrue  positives
    同样地,召回率也是越高越好。
  • 通过计算查准率和召回率可以更好地判断分类模型到底好不好。如果一个算法总是预测 y=0(病人无病),那么它的召回率就为 0 ,因为他不会有真阳性,因此不是一个好的模型。对于偏斜类问题,算法也不能够欺骗我们,仅仅通过测试 y 总是等于 0(或者 y 总是等于一),他没有办法得到高的查准率和高的召回率。因此,能够更肯定拥有高查准率和高召回率的模型是一个好的分类模型,这也给了我们更好直接更直接的方法来评估模型的好坏。
  • 在核查准率和召回率的定义中,总是习惯性地用 y=1 作为某种希望检测的出现较少的类。

四、查准率和召回率的权衡(Trading off precision and recall)

  • 主要内容: 如何保持查准率和召回率的相对平衡,以及二者作为算法评估度量值的更有效的方式。

1. 查准率和召回率与临界值的关系

  • 仍然以癌症预测为例:
    L o g i s t i c    r e g r e s s i o n :    0 ≤ h θ ( x ) ≤ 1 P r e d i c t    1    i f    h θ ( x ) ≥ 0.5 P r e d i c t    0    i f    h θ ( x ) < 0.5 \begin{aligned} &Logistic\ \ regression:\ \ 0\le h_\theta(x)\le 1\\ &Predict\ \ 1\ \ if\ \ h_\theta(x)\ge 0.5\\ &Predict\ \ 0\ \ if\ \ h_\theta(x)< 0.5\\ \end{aligned} Logistic  regression:  0hθ(x)1Predict  1  if  hθ(x)0.5Predict  0  if  hθ(x)<0.5
  • 如果想要在十分肯定的情况下才预测 y=1(患有癌症),避免误诊导致病人承受治疗的痛苦,那么就应该提高临界值(threshold)(比如 0.7、0.9),此时查准率会提高,召回率会降低
  • 如果想要避免没能预测出患有癌症的病人(避免负阴性),就应该降低临界值,后续对预测出的病人进行进一步的检查,此时召回率会提高,查准率会降低
  • 对于大多数的回归模型,需要权衡查准率和召回率,当改变临界值时,可以得到如下的曲线(注:曲线图像不唯一,取决于回归模型的具体算法):
    在这里插入图片描述

2. 查准率和召回率的结合方式

  • 那么能否自动选取临界值呢?或者说有不同的想法或算法,如何比较不同的查准率和召回率呢?

  • 假设有三个临界值不同的算法:
    在这里插入图片描述

  • 希望可以通过一个评估度量值来决定算法的好坏。

①平均值

  • 很容易可以想到通过计算召回率和查准率二者的平均值来对模型进行评估,通过数据不难看出算法 3 的平均值最高,但是查准率很低召回率为 1 代表它是恒预测 y=1 的,显然不是一个好的算法,因此这一标准不可行。

②F 值

  • 下面是一个结合查准率和召回率的另一种方式叫做 F 值(F Score),公式如下:
    F 1 S c o r e = 2 P R P + R \begin{aligned} F_1Score=2\frac{PR}{P+R} \end{aligned} F1Score=2P+RPR
  • 通过表格中 F 值的数据最终选择算法 1。
  • F 值也叫 F1 值,一般都叫 F 值,但是写的时候写 F1 值。它结合了查准率合召回率,同时给较低值更高的权重。这个称呼实际上没有什么也别的含义,计算的内容实际上就是调和平均数。
  • 对于不同的取值,计算结果如下:
    P = 0   o r    R = 0    ⟹    F 1   S c o r e = 0 P = 1   a n d    R = 1    ⟹    F 1   S c o r e = 1 \begin{aligned} &P=0\ \quad or\ \ &R=0\ \ &\Longrightarrow\ \ &F_1\ Score = 0\\ &P=1\ \quad and\ \ &R=1\ \ &\Longrightarrow\ \ &F_1\ Score = 1\\ \end{aligned} P=0 or  P=1 and  R=0  R=1      F1 Score=0F1 Score=1

五、机器学习数据(Data for machine learning)

  • 之前讲过不要盲目地开始花大量的时间来收集大量的数据,因为大量的数据只在一些情况下起作用。在一定条件下,得到大量数据并在某种类型的学习算法中进行训练可以是一种有效的方法来获得一个具有良好性能的学习算法(需要条件成立且有大量数据),下面将会介绍到。

1. 一项过去的研究

  • 两位研究人员 Michele Banko 和 Eric Brill 在研究·使用不同的学习算法的效果·与·将这些效果使用到不同训练数据集上·两者的比较时,考虑这样一个问题,如何在易混淆的词之间进行分类(2001)。于是他们把诸如这样的机器学习问题当做一类监督学习问题并尝试将其分类(什么样的词在一个英文句子的特定位置才是合适的)。他们使用了如下的方法:
    A l g o r i t h m s − P e r c e p t r o n    ( L o g i s t i c    r e g r e s s i o n ) − W i n n o w − M e m o r y − b a s e d − N a ı ¨ v e    B a y e s \begin{aligned} &Algorithms\\ &\qquad-Perceptron\ \ (Logistic\ \ regression)\\ &\qquad-Winnow\\ &\qquad-Memory-based\\ &\qquad-Naïve\ \ Bayes\\ \end{aligned} AlgorithmsPerceptron  (Logistic  regression)WinnowMemorybasedNaı¨ve  Bayes
  1. 感知器(Perceptron)
    一个用于逻辑回归上的方差
  2. Winnow 算法
    一个很厉害但是现在用的比较少的算法,类似于回归问题,但是在方法上又有一些不同
  3. 基于内存的算法(Memory-based)
    也是现在用的比较少了,后面也会介绍到
  4. 朴素贝叶斯算法(Naïve Bayes)
    同样也是后面会学到
  • 具体算法并不重要,他们做的就是改变了训练数据集的大小,并尝试将这些学习算法用于不同大小的训练数据集中,下图为他们得到的结果。
    在这里插入图片描述

  • 趋势非常明显:

    • 首先,大部分外部空间都具有相似的性能
    • 其次,随着训练数据集的增大(在横轴上代表数以百万计大小的训练集从成百上千到成千上万),这些算法的性能也都对应增强了
  • 事实上,如果选择任意一个算法,可能是选择了一个劣质的算法,如果给这个劣质算法更多的数据,那么从这些例子中看起来的话,他很有可能会比其他算法(甚至是优质算法)更好。

  • 由于这些原始的研究非常具有影响力,因此已经有一系列许多不同的研究显示了类似的结果,表明许多不同的学习算法有时倾向于依赖一些细节,并表现出相当相似的性能。但是真正提高性能的是能够给予一个算法大量的训练数据。

  • 像这样的一种结果引起了在机器学习中一种常见的说法:
    “It’s    not    who    has    the    best    algorithm    that    wins. It’s    who    has    the    most    data.”    \begin{aligned} &\textbf{“It’s\ \ not\ \ who\ \ has\ \ the\ \ best\ \ algorithm\ \ that\ \ wins.}\\ &\qquad\qquad \textbf{It’s\ \ who\ \ has\ \ the\ \ most\ \ data.”}\ \ \end{aligned} “It’s  not  who  has  the  best  algorithm  that  wins.It’s  who  has  the  most  data.”  

  • “并不是拥有最好算法的人能成功,而是拥有最多数据的人能成功”。

  • 那么这种情况何时为真,何时为假?因为有一个算法,这种算法在这种情况下是真的,那么得到的大量数据通常保证我们具有一个高性能算法的最佳方式,而不是去争辩使用什么样的算法。

2. 假设的解释(庞大的训练集和含有很多参数的算法)

  • 假如我们有一些含有大量我们认为有用的训练集的假设,特征值 x 包含了足够的信息用来准确地预测 y。
  • 例如前面的容易混淆的问题,句子中包含了足够的信息来帮助我们预测结果是 two 而不是 to 或 too;反例就是预测房价时只给出房子大小,而不给出房子所处的地段或是房间数量装修情况等其他特征,那么就无法预测出正确的房价。
    A s s u m e    f e a t u r e    x ∈ R n + 1    h a s    s u f f i c i e n t    i n f o r m a t i o n    t o p r e d i c t    y    a c c u r a t e l y .   Example:    F o r    b r e a k f a s t    I    a t e    t w o ‾    e g g s . Counterexample:    P r e d i c t    h o u s i n g    p r i c e    f r o m    o n l y    s i z e ( f e e t 2 )    a n d    n o    o t h e r    f e a t u r e s . \begin{aligned} &Assume\ \ feature\ \ x \in \R^{n+1}\ \ has\ \ sufficient\ \ information\ \ to\\ &predict\ \ y\ \ accurately.\\\ \\ &\textbf{Example:}\ \ For\ \ breakfast\ \ I\ \ ate\ \ \underline{two}\ \ eggs.\\ &\textbf{Counterexample:}\ \ Predict\ \ housing\ \ price\ \ from\ \ only\ \ size\\ &(feet^2)\ \ and\ \ no\ \ other\ \ features.\\ \end{aligned}  Assume  feature  xRn+1  has  sufficient  information  topredict  y  accurately.Example:  For  breakfast  I  ate  two  eggs.Counterexample:  Predict  housing  price  from  only  size(feet2)  and  no  other  features.
  • 一个有用的方法:给定一个输入特征向量 x ,也给定了相同的可用的信息和学习算法,如果去人类专家这个领域,一个人类专家能够准确或自信地预测出 y 治值吗?
  • 例如上面的第一个例子,如果找一个说英语的人类专家,那么他就可能预测债这种情况下会说什么;与此相反,如果找一个价格上的专家(可能是一个房地产经纪人专家),如果只告诉他们一个房子的大小并告诉他们房子的价格,那么即使是房价评估或售房方面的专家他也不能告诉我们房子预测的价格。

Useful    test:    G i v e n    t h e    i n p u t ,    c a n    a    h u m a n    e x p e r t c o n f i d e n t l y    p r e d i c t    ? \begin{aligned} &\textbf{Useful\ \ test:}\ \ Given\ \ the\ \ input,\ \ can\ \ a\ \ human\ \ expert\\ &confidently\ \ predict\ \ ?\\ \end{aligned} Useful  test:  Given  the  input,  can  a  human  expertconfidently  predict  ?

  • 如果上面的假设是成立的,那么当有大量的数据时是有帮助的。
  • 假设特征值有足够的信息来预测 y 值,假设使用一种需要大量参数的学习算法(也许是有很多特征值的逻辑回归或线性回归,或是经常使用的利用许多隐藏单元的神经网络),这些参数可以拟合非常复杂的函数。
  • 把这些算法当成低偏差算法(low-bias algorithm),因为能够拟合非常复杂的函数,可以很好地拟合训练集,训练误差就会很低
    Use    a    learning    algorithm    with    many    parameters e . g .    l o g i s t i c    r e g r e s s i o n / l i n e a r    r e g r e s s i o n    w i t h    m a n y    f e a t u r e s ; n e u r a l    n e t w o r k    w i t h    m a n y    h i d d e n    u n i t s .   ⟹ J t r a i n ( θ )    w i l l    b e    s m a l l . \begin{aligned} &\textbf{Use\ \ a\ \ learning\ \ algorithm\ \ with\ \ many\ \ parameters}\\ &e.g.\ \ logistic\ \ regression/linear\ \ regression\ \ with\ \ many\ \ features;\\ &neural\ \ network\ \ with\ \ many\ \ hidden\ \ units.\\\ \\ &\Longrightarrow J_{train}(\theta)\ \ will\ \ be\ \ small. \end{aligned}  Use  a  learning  algorithm  with  many  parameterse.g.  logistic  regression/linear  regression  with  many  features;neural  network  with  many  hidden  units.Jtrain(θ)  will  be  small.
  • 假设使用了非常大的训练集,尽管希望有很多参数,但是如果训练集比参数的数量更多,那么这些算法就不大容易出现过拟合,也就是说训练误差可能接近测试误差
    Use    a    very    large    training    set    ( u n l i k e l y    t o    o v e r f i t )   ⟹ J t r a i n ( θ ) ≈ J t e s t ( θ ) \begin{aligned} &\textbf{Use\ \ a\ \ very\ \ large\ \ training\ \ set}\ \ (unlikely\ \ to\ \ overfit)\\\ \\ &\Longrightarrow J_{train}(\theta)\approx J_{test}(\theta) \end{aligned}  Use  a  very  large  training  set  (unlikely  to  overfit)Jtrain(θ)Jtest(θ)
  • 最后由训练误差很低,且训练误差接近测试误差,可以推出测试集的误差也很小。
    ⟹ J t e s t ( θ )    w i l l    b e    s m a l l . \begin{aligned} &\Longrightarrow J_{test}(\theta)\ \ will\ \ be\ \ small. \end{aligned} Jtest(θ)  will  be  small.
  • 从另一个角度来说,这样做是为了有一个高性能的学习算法,并且希望不要有高的偏差和方差。因此,偏差问题通过确保有一个具有很多参数的学习算法来保证(以便我们能够得到一个低偏差的算法),通过非常大的训练集来保证没有方差问题。通过将这两个放在一起最终可以得到低误差和低方差的学习算法,使得我们可以很好地测试测试数据集。

总结

  • 本文主要介绍了机器学习系统设计的相关问题。首先通过垃圾邮件分类的例子来展示操作过程,随后介绍了提高精准度降低错误率的一些方法。
  • 为了选出应该使用哪些方法,引入了误差分析的概念,其中也介绍了一些在机器学习开发或应用时的推荐的方法:先通过一个简单的算法来快速的实现目标,随后画出相应的学习曲线便于后续的判断,最后进行误差分析。
  • 随后介绍了评估度量值的重要性:通过一个具体的数字来反应回归模型到底如何。
  • 为了解决偏斜类问题(即正负样本比例失调),引入了查准率召回率的概念,对于如何在查准率和召回率之间抉择的问题,应当采用调和平均数对两者进行结合,通过 F 值这一指标来挑选临界值
  • 除此之外,当有偏斜类问题时使用查准率和召回率来评价学习算法要比用分类误差或者分类准确率好得多。
  • 最后,在特定的情况下,如果可以得到庞大的训练集以及含有很多参数(特征值)的学习算法,那么往往可以得到一个性能很好地学习算法。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐