This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
<audio id="audio" title="01 | 频率视角下的机器学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/af/fb/af10048b0f1634e24104a04dabd11efb.mp3"></audio>
在“人工智能基础课”中我曾提到“概率”probability这个基本概念存在着两种解读方式它们分别对应着**概率的频率学派**Frequentist和**贝叶斯学派**Bayesian。而解读方式上的差异也延伸到了以概率为基础的其他学科尤其是机器学习之中。
根据机器学习领域的元老汤姆·米切尔Tom M. Mitchell的定义机器学习machine learning是一门研究通过计算的手段利用经验来改善系统自身性能的学科。
现如今,几乎所有的经验都以数据的形式出现,因而机器学习的任务也就变成了基于已知数据构造概率模型,反过来再运用概率模型对未知数据进行预测与分析。如此一来,关于概率的不同认识无疑会影响到对模型的构建与解释。
可在概率的应用上,频率学派和贝叶斯学派的思路呈现出天壤之别,这种思维上的差异也让两派的拥护者势同水火,都视另一方为异端邪说。正因如此,在这个专栏的前两篇文章中,我将首先和你理清频率学派与贝叶斯学派对概率的不同观点,为接下来**从不同的角度理解机器学习的各种算法**打下扎实的基础。
下面这个流传已久的笑话,不经意间对频率学派和贝叶斯学派的区别给出了形象的解释:有个病人找医生看病,医生检查之后对他说:“你这病说得上是九死一生,但多亏到我这里来看了。不瞒你说,在你之前我已经看了九个得一同样病的患者,结果他们都死了,那你这第十个就一定能看得好啦,妥妥的!”
如果病人脑子没事,肯定就从这个糊涂医生那里跑了。显然,医生在看待概率时秉持的是频率主义的观点,但却是个蹩脚的频率主义者。之所以说他是频率主义者,是因为他对九死一生的理解就是十次手术九次失败一次成功;说他蹩脚则是因为他不懂频率学派的基础,区区九个病人就让他自以为掌握了生死的密码。
归根到底,**频率学派口中的概率表示的是事件发生频率的极限值**它只有在无限次的独立重复试验之下才有绝对的精确意义。在上面的例子中如果非要从频率的角度解释“九死一生”的话这个10%的概率只有在样本容量为无穷大时才有意义。因此即使“九死一生”的概率的确存在,它也不能确保第十个病人的康复。
**在频率学派眼中,当重复试验的次数趋近于无穷大时,事件发生的频率会收敛到真实的概率之上。这种观点背后暗含了一个前提,那就是概率是一个确定的值,并不会受单次观察结果的影响。**
将一枚均匀的硬币抛掷10次结果可能是10次都是正面也可能10次都是反面写成频率的话就对应着0%和100%这两个极端代表着最大范围的波动。可如果将抛掷次数增加到100次出现正面的次数依然会发生变化但波动的范围更可能会收缩到40%到60%之间。再将抛掷次数增加到100010000的话频率波动的现象不会消失但波动的范围会进一步收缩到越来越小的区间之内。
基于以上的逻辑,把根据频率计算概率的过程反转过来,就是频率统计估计参数的过程。**频率统计理论的核心在于认定待估计的参数是固定不变的常量,讨论参数的概率分布是没有意义的;而用来估计参数的数据是随机的变量,每个数据都是参数支配下一次独立重复试验的结果。由于参数本身是确定的,那频率的波动就并非来源于参数本身的不确定性,而是由有限次观察造成的干扰而导致**。
这可以从两个角度来解释:一方面,根据这些不精确的数据就可以对未知参数的精确取值做出有效的推断;另一方面,数据中包含的只是关于参数不完全的信息,所以从样本估计整体就必然会产生误差。
统计学的核⼼任务之一是根据从总体中抽取出的样本,也就是数据来估计未知的总体参数。参数的最优估计可以通过样本数据的分布,也就是**采样分布**sampling distribution来求解由于频率统计将数据看作随机变量所以计算采样分布是没有问题的。确定采样分布之后参数估计可以等效成一个最优化的问题而频率统计最常使用的最优化方法就是**最大似然估计**maximum likelihood estimation
**回忆一下最大似然估计,它的目标是让似然概率最大化,也就是固定参数的前提之下,数据出现的条件概率最大化**。这是频率学派估计参数的基本出发点:一组数据之所以能够在单次试验中出现,是因为它出现的可能性最大。而参数估计的过程就是赋予观测数据最大似然概率的过程。这可以通过下面这个简单的例子来说明:
“如果观测到的数据$\theta_i$是真实值$\theta$和方差为$\sigma ^ 2$,但形式未知的噪声$e_i$的叠加,那么如何得出$\theta$的最优估计值?”
要用最大似然估计解决这个问题,首先就要对似然概率进行建模,建模中的一个重要假设是假定未知形式的噪声满足高斯分布。这不仅在统计学中,在其他学科里也是一个常用的假设。
从理论上说,在功率有限的条件下,高斯噪声的信源熵最大,因而带来的不确定性也就越大,换句话说,这是最恶劣的噪声;从实践上说,真实的噪声通常来源于多个独立的物理过程,都具有不同的概率分布,中心极限定理告诉我们,当噪声源的数目越来越多时,它们的叠加就趋近于高斯分布,因而高斯噪声就是对真实情况的一个合理的模拟。
在高斯噪声的假设下,每个观测数据$\theta_i$所满足的概率分布就可以写成
$$ p(\theta_i | \theta) = \dfrac{1}{\sqrt{2\pi \sigma ^ 2}} \exp [-\dfrac{(\theta_i - \theta) ^ 2}{2\sigma ^ 2}]$$
这实际上就是采样分布。计算所有数据的概率分布的乘积得到的就是似然函数likelihood function
$$ L(\boldsymbol{\theta} | \theta) = \prod\limits_{i = 1}^N p(\theta_i | \theta)$$
求解似然函数的对数,就可以将乘法运算转换为加法运算
$$ \log L = -\dfrac{1}{2} \sum\limits_{i = 1}^N [\log (2\pi \sigma ^ 2) + \dfrac{(\theta_i - \theta) ^ 2}{2\sigma ^ 2}]$$
令对数似然函数的导数为0就求出了使似然概率最大的最优估计
$$ \hat \theta = \dfrac{1}{N} \sum\limits_{i = 1}^N \theta_i $$
不知道你有没有在上面的公式中发现一个问题:虽然真实值$\theta$是个固定值,但估计值$\hat \theta$却是数据的函数,因而也是个随机变量。
这一点其实很好理解,因为估计值本质上是利用数据构造出来的函数,既然数据是随机分布的,估计值肯定也是随机的。这意味着如果每次估计使用的数据不同,得到的估计值也不会相同。那么如何来度量作为随机变量的估计值和作为客观常量的真实值之间的偏差呢?**置信区间**confidence interval就是频率学派给出的答案。
置信区间的意义在于划定了真值的取值范围,真实的参数会以一定的概率$\alpha$落入根据样本计算出的置信区间之内。当然这里的概率还是要从频率的角度来解读从同一个总体中进行100次采样可以得到100个不同的样本根据这100个不同的样本又可以计算出100个不同的置信区间。在这么多个置信区间之中包含真值的有多少个呢$100 \times \alpha$个,剩下的$100 \times (1 - \alpha)$个置信区间就把真值漏掉了。这有点像乱枪打鸟每一枪都乱打一梭子打了100枪之后统计战果发现打下来$100 \times \alpha$只鸟。如果把参数的真实值比喻成鸟,那么每一枪轰出的一梭子子弹就是置信区间。显然,置信区间的上下界和估计值一样,也是随机变量。
总结起来,**频率主义解决统计问题的基本思路如下:参数是确定的,数据是随机的,利用随机的数据推断确定的参数,得到的结果也是随机的。**
这种思路直接把可能的参数空间压缩成为一个点:参数本身可能满足这样或者那样的概率分布,但一旦试验的条件确定,参数表现出来的就是一个固定的取值,让所有的概率分布都失去了意义。这就像说即使上帝真的掷骰子,但从骰子脱手那一刻起,它的点数就不再受上帝的控制,也就变成了确定不变的取值。频率主义者关注的就是这个真实存在的唯一参数,通过计算它对数据的影响来实现估计。
**将频率主义“参数确定,数据随机”的思路应用在机器学习当中,得到的就是统计机器学习**statistical learning。统计机器学习的做法是通过对给定的指标比如似然函数或者均方误差进行最优化来估计模型中参数的取值估计时并不考虑参数的不确定性也就是不考虑未知参数的先验分布。**和参数相关的信息全部来源于数据,输出的则是未知参数唯一的估计结果,这是统计机器学习的核心特征**。
受噪声和干扰的影响,观测数据并不是未知参数的准确反映,因此如何衡量估计结果的精确程度就成为统计机器学习中的一个关键问题。**损失函数**loss function直接定义了模型性能的度量方式其数学期望被称为**风险**risk风险最小化就是参数估计的依据和准则。但风险的计算并不能一蹴而就估计最优参数需要计算风险计算风险时需要在数据的概率分布上对损失函数进行积分可表示数据的分布又需要依赖未知参数的精确取值。这就给频率主义出了一个无解的问题风险函数是没有办法精确求解的。
为了解决这个问题,统计机器学习引入了**经验风险**empirical risk**用训练数据的经验分布替换掉原始表达式中数据的真实分布**借此将风险函数转化成了可计算的数值。在真实的学习算法中无论是分类问题中的误分类率还是回归问题的中的均方误差都是经验风险的实例而所谓的最优模型也就是使经验风险最小化empirical risk minimization的那个模型。
今天我和你分享了频率学派对概率、统计学和机器学习的认识方式,其要点如下:
<li>频率学派认为概率是随机事件发生频率的极限值;
</li>
<li> 频率学派执行参数估计时,视参数为确定取值,视数据为随机变量;
</li>
<li>频率学派主要使用最大似然估计法,让数据在给定参数下的似然概率最大化;
</li>
<li>频率学派对应机器学习中的统计学习,以经验风险最小化作为模型选择的准则。
</li>
有了这些理论之后如何在实际问题中应用频率主义的统计学呢这里有一个非常好的例子来源于Nature Biotechnology第22卷第9期上的论文《什么是贝叶斯统计学》What is Bayesian statistics
在这个例子中Alice和Bob在进行一场赌局先得到6分者获胜。判断得分的方式有一些特别在赌局开始之前荷官在赌桌上扔一个小球在这个球停止的位置做个标记。显然这个标记的位置是随机的。赌局开始后荷官继续扔球如果球停到标记的左侧则Alice得分反之停到标记右侧则Bob得分这就是赌局的计分规则。那么问题来了在这样的规则下Alice现在以5:3领先Bob那么Bob反败为胜的概率是多大呢
要计算Bob获胜的概率必须要借助一个参数那就是Alice得分的概率不妨将它设为$p$那么Bob得分的概率就是$1 - p$。概率$p$取决于标记在赌桌上的位置,由于位置本身是随机的,$p$也就在[0, 1]上满足均匀分布。按照频率主义的观点,在这一场赌局中,$p$有固定的取值,并可以通过已有的得分结果来估计。估计出$p$后就可以进一步计算Bob获胜的概率。这个问题就作为今天的思考题目你可以计算一下。
但是,这个问题并没有到此为止。如果跳出频率主义的限制,把$p$的概率分布引入到计算之中,又会得到什么样的结果呢?
请加以思考并发表你的观点。
<img src="https://static001.geekbang.org/resource/image/a7/58/a7a64ab55c83c7a1c2519a6dc777cb58.jpg" alt="">

View File

@@ -0,0 +1,102 @@
<audio id="audio" title="02 | 贝叶斯视角下的机器学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/cd/bd/cd49875b9bb59dcc7459af59c0041bbd.mp3"></audio>
在上一篇文章中,我向你介绍了频率学派对概率、统计和机器学习的理解。今天则要转换视角,看一看贝叶斯学派解决这些问题的思路。
还记得那个“九死一生”的例子吗对其中90%的概率更直观、也更合理的解释是生病之后生还的可能性。之所以说频率主义的解释牵强,是因为没有哪个人能倒霉到三番五次地得这个病。当多次独立重复试验不可能实现时,就不存在从频率角度解读概率的理论基础。
虽然上面的这个例子不见得严谨,却可以用来描述频率学派的问题:对于所有的“一锤子买卖”,也就是不包含随机变量的事件来说,频率学派对概率的解读都是不成立的。
**为了解决频率主义的问题贝叶斯学派给出了一种更加通用的概率定义概率表示的是客观上事件的可信程度degree of belief也可以说成是主观上主体对事件的信任程度它是建立在对事件的已有知识基础上的。**
比方说当一个球迷提出“明天皇家马德里战胜拉斯帕尔马斯的概率是86%”的时候可以理解成他对皇马获胜有86%的把握程度,要是买球的话自然就会在独胜上下出重注(其实贝叶斯概率正是来源于对赌博的分析)。
**除了对概率的置信度解释之外贝叶斯学派中的另一个核心内容是贝叶斯定理Bayes&#39; theorem用来解决“逆向概率问题”inverse probability problem。**
听名字就知道,逆向概率和前向概率是对应的:假定数据由一个生成模型给出,前向概率是在已知生成过程的前提下来计算数据的概率分布和数字特征,逆向概率则是在已知数据的前提下反过来计算生成过程的未知特性。贝叶斯定理的数学表达式可以写成
$$ P(H|D) = \dfrac{P(D|H) \cdot P(H)}{P(D)} $$
式中的$P(H)$被称为**先验概率**prior probability$P(D|H)$被称为**似然概率**likelihood probability$P(H|D)$被称为**后验概率**posterior probability
抛开乱七八糟的符号贝叶斯定理同样可以从贝叶斯概率的角度加以解读所谓先验概率是指根据以往经验和分析得到的概率可以视为假设H初始的可信程度与假设H相关的数据D会作为证据出现将数据纳入考虑范围后假设H的可信程度要么会增强要么会削弱。但不管增强还是削弱得到的结果都是经过数据验证的假设的可信程度这就是后验概率。
**贝叶斯定理的意义正是在于将先验概率和后验概率关联起来,刻画了数据对于知识和信念的影响。**
纳粹德国的宣传部长保罗·约瑟夫·戈培尔有句名言:“如果你说的谎言范围够大,并且不断重复,人民终会开始相信它。”从贝叶斯定理的角度看,这句话是有科学依据的空穴来风。本来谎言的先验概率$p(lie)$也就是初始的可信度接近于0而$p(\bar{lie}) = 1 - p(lie)$接近于1。可问题的关键在于似然概率——戈培尔这句话的核心是被宣传对象对将谎言说成真理的宣传的信任。宣传对象相信宣传者不说假话意味着似然概率$p(brainwash | lie)$较大,同时$p(brainwash | \bar{lie})$较小。这样一来,经过宣传之后,谎言成立的后验概率就可以写成
$$ p(lie | brainwash) = \dfrac{p(lie) \cdot p(brainwash | lie)}{p(lie) \cdot p(brainwash | lie) + p(\bar{lie}) \cdot p(brainwash | \bar{lie})} $$
稍作分析就不难发现,只要$p(brainwash | lie) &gt; 0.5$,谎言的后验概率就会大于先验概率。更重要的是,本次宣传得到的后验概率$(lie | brainwash)$将作为下次宣传的先验概率$p(lie)$出现。于是,在后验概率与先验概率不断迭代更新的过程中,$p(lie | brainwash)$将持续上升,谎言也就越来越接近真理了。
将贝叶斯定理应用到统计推断中,就是贝叶斯主义的统计学。频率统计理论的核⼼在于认定待估计的参数是固定不变的常量,⽽⽤来估计的数据是随机的变量。**贝叶斯统计则恰恰相反:它将待估计的参数视为随机变量,用来估计的数据反过来是确定的常数,讨论观测数据的概率分布才是没有意义的**。贝叶斯统计的任务就是根据这些确定的观测数据反过来推断未知参数的概率分布。
**相对于频率主义的最大似然估计贝叶斯主义在参数估计中倾向于使后验概率最大化使用最大后验概率估计maximum a posteriori estimation。**
频率学派认为观测数据之所以会出现是因为它出现的概率最大,因此最可能的参数就是以最大概率生成这一组训练数据的参数。最大后验估计则是将频率学派中“参数”和“数据”的角色做了个调换:参数本身是随机变量(服从先验分布),有许多可能的取值,而不同取值生成这一组观测数据(服从似然分布)也是不同的。因而最大后验概率推断的过程就是结合参数自身的分布特性,找到最可能产生观测数据的那个参数的过程。
贝叶斯定理告诉我们,**后验概率正比于先验概率和似然概率的乘积,这意味着后验概率实质上就是用先验概率对似然概率做了个加权处理**。频率主义将参数看成常量那么似然概率就足以描述参数和数据之间的关系。贝叶斯主义则将参数看成变量因此参数自身的特性也会影响到参数和数据之间的关系。先验概率的作用可以用下面的例子来说明本例来自David JC MacKay, Information Theory, Inference, and Learning Algorithms, Example 2.3
“Jo去进行某种疾病的检查。令随机变量$a$表示Jo的真实健康状况$a = 1$表示Jo生病$a = 0$表示Jo没病令随机变量$b$表示Jo的检查结果$b = 1$表示阳性,$b = 0$表示阴性。已知检查的准确率是95%也就是此病患者的检查结果95%会出现阳性非此病患者的检查结果95%会出现阴性同时在Jo的类似人群中此病的发病率是1%。如果Jo的检查结果呈阳性那么她患病的概率是多大呢&quot;
直观理解“检查的准确率是95%”似乎说明了Jo患病的概率就是95%,可事实真是这样吗?根据贝叶斯定理,患病概率可以写成
$$p(a=1|b=1) = \dfrac{p(b = 1|a=1) \cdot p(a = 1)}{p(b = 1|a=1) \cdot p(a = 1) + p(b = 1|a=0) \cdot p(a = 0)}$$
式中的$p(b = 1|a=1) = 0.95$就是似然概率,$p(a = 1) = 0.01$则是先验概率。不难求出Jo患病的真正概率也就是后验概率只有16%!
为什么会出现这样的情况呢对于频率学派来说Jo要么生病要么没病概率的推演是在这两个确定的前提下分别进行的所以似然概率就足以说明问题。可是阳性检查结果既有真阳性也有假阳性两者的比例是不同的。虽然真阳性基本意味着生病但由于先验概率较小1%它在所有的阳性结果中依然是少数16%。相比之下假阳性结果凭借其比较大的先验概率99%占据了阳性结果的大部分84%)。这个例子说明抛开先验概率谈论似然概率,是没有多少说服力的。
不难看出,先验信息在贝叶斯统计中占据着相当重要的地位。可问题在于先验信息从哪里来?
先验信息是在使用数据之前关于分析对象的已有知识,可当这种已有知识并不存在时,就不能对先验做出合理的建模。事实上,指定先验分布的必要性正是贝叶斯学派被频率学派的诟病之处,因为先验分布不可避免地会受到主观因素的影响,这与统计学立足客观的出发点背道而驰。这中间的哲学思辨在此不做探讨,你只需要知道**即使包含某些主观判断,先验信息也是贝叶斯主义中不可或缺的核心要素**。
当已有的知识实在不足以形成先验信息时,贝叶斯主义的处理方式是引入**无信息先验**noninformative prior认为未知参数取到所有取值的可能性都是相等的也就是满足均匀分布。由于此时的先验概率是个常数这个先验概率也被称为**平坦先验**flat prior。**在平坦先验之下,最大后验估计和最大似然估计是等效的**。
不知道你还记不记得上一篇文章末尾的例子如果从频率主义出发可以用最大似然估计求出Alice得分的概率$\hat p = 5 / 8$而Bob赢得赌局的概率就是他连得三分的概率$(1- \hat p) ^ 3 \approx 0.0527$。
可是在贝叶斯主义看来事情并没有这么简单因为已有的投球结果并不能给出关于得分位置的可靠信息5:3的领先可能意味着Alice有较大的得分概率也可能意味着Bob虽有有较大的得分概率却走了背字。因而在贝叶斯学派看来处理未知参数$p$的方式不应该是武断地把它看成一个常数,而是应该从变量的角度去观察,考虑它在[0, 1]上所有可能的取值再计算在所有可能的取值下Bob获胜概率的数学期望从而消除$p$的不确定性对结果的影响。
在这样的思想下Bob获胜的概率就可以写成
$$E = \int\limits_0^1 (1 - p)^3 P(p | A = 5, B = 3){\rm d}p$$
利用贝叶斯定理可以将上式中的条件概率写成
$$ P(p | A = 5, B = 3) = \dfrac{P(A = 5, B = 3 | p)P(p)}{\int\limits_0^1 P(A = 5, B = 3 | p)P(p){\rm d}p} $$
在这个式子中,先验概率$P(p)$是在观察到数据之前$p$的分布,因而是未知的。但由于$p$服从均匀分布,所以是个常数,也就不会对$P(p | A = 5, B = 3)$产生影响。另一方面,$P(A = 5, B = 3 | p)$可以用二项分布计算,其数值等于$8!/(5!3!)p ^ 5 (1 - p) ^ 3$。将这一结果代入$E$的表达式,可以得到
$$ E = \dfrac{\int\limits_0^1 p^5 (1 - p)^6{\rm d}p}{\int\limits_0^1 p^5 (1 - p)^3{\rm d}p} = 0.0909 $$
显然这与最大似然估计得到的结果是不同的。但这个结果却符合频率主义的阐释如果用蒙特卡洛法Monte Carlo method进行数值仿真的话你会发现这个0.0909才是符合真实情况的概率。
将贝叶斯定理应用到机器学习之中,完成模型预测和选择的任务,就是贝叶斯视角下的机器学习。**由于贝叶斯定理大量涉及各种显式变量与隐藏变量的依赖关系,通常用概率图模型来直观地描述**。贝叶斯主义将未知参数视为随机变量,参数在学习之前的不确定性由先验概率描述,学习之后的不确定性则由后验概率描述,这中间不确定性的消除就是机器学习的作用。
**与频率主义不同的是,贝叶斯学习的输出不是简单的最优估计值$\hat \theta$,而是关于参数的概率分布$p(\theta)$,从而给出了更加完整的信息**。在预测问题中,贝叶斯学习给出的也不仅仅是一个可能性最大的结果,而是将所有结果及其概率以概率分布的形式完整地呈现出来。
**除了在预测中提供更加完备的信息之外,贝叶斯学习在模型选择上也有它的优势**。在贝叶斯主义看来,所谓不同的模型其实就是不同概率分布的参数化表示,使用的参数也有它们自己的先验分布,但所有模型的共同点是它们都能生成训练数据集,而模型选择的任务就是从这些概率分布中挑出一个最好的。
这里的“好”的标准就是数据和模型的符合程度也叫可信度model evidence。可信度实际上就是归一化的似然函数$p(D | M)$,表示的是模型$M$生成数据$D$的条件概率。当不同复杂度模型的经验风险接近的时候,就可以利用可信度来筛选模型了。
既然贝叶斯主义能够提供更加完整的信息为什么迟迟没有取代频率主义成为主流呢这就不得不说贝叶斯方法的缺点了一是对未知变量的积分运算会导致极高的计算复杂度computation complexity这从Alice和Bob打赌的例子中就可以看出二是对先验分布的设定prior specification包含一定的主观性因而一直不招老派的统计学家待见。正是这两个原因限制了贝叶斯方法的广泛应用。
今天我和你分享了贝叶斯学派对概率、统计学和机器学习的认识方式,其要点如下:
<li> 贝叶斯学派认为概率是事件的可信程度或主体对事件的信任程度;
</li>
<li> 贝叶斯学派执行参数估计时,视参数为随机变量,视数据为确定取值;
</li>
<li>贝叶斯学派主要使用最大后验概率法,让参数在先验信息和给定数据下的后验概率最大化;
</li>
<li>贝叶斯学派对应机器学习中的概率图模型,可以在模型预测和选择中提供更加完整的信息。
</li>
在这两篇文章中,我和你探讨了频率主义和贝叶斯主义这两个解决概率问题的基本思路,它们也是以后理解不同机器学习方法的基础。虽然两种观点各执一词,争论得不可开交,但两者更像是一枚硬币的两面,在思想方法上没有根本性的对立,各种频率主义下的统计学习方法也可以通过贝叶斯来解释。**将两种方法论融会贯通才是理解机器学习的正确思路**。
最后再回到Alice和Bob赌局的例子基于贝叶斯主义的方法得到了符合频率学派解释的结果基于频率主义的最大似然估计反而做出了错误的判断那么你是怎么看待频率学派的错误呢
欢迎发表你的观点。
<img src="https://static001.geekbang.org/resource/image/54/6b/54aa10e2a8e3c959ceb568766051016b.jpg" alt="">

View File

@@ -0,0 +1,73 @@
<audio id="audio" title="03 | 学什么与怎么学" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/37/d4/37db1eb9b02f6c085622db1a49be35d4.mp3"></audio>
男孩还是女孩?这是个问题!
在中国人的生活中生男生女可谓兹事体大多少幸福与烦恼都因此而起。那么有没有办法提前做出准确的预测呢当然有啦通常在怀孕4个月时胎儿的性别就可以通过B超得到准确的判断了所以只要问一问医生轻松搞定。但是出于职业道德和执业法规的要求医生一般是不会透露胎儿性别的。想要在怀孕的早期判断终归还是要依赖祖辈流传下来的经验。
可祖辈的经验多了去了流传最广的可能就是“酸儿辣女”如果准妈妈突然爱喝柠檬水说明怀了个男孩突然爱吃老干妈就说明怀了个女孩。可实际上“酸儿辣女”只是一种互文的说法表达的是怀孕对饮食口味的影响想要以此为据预测胎儿的性别纯属无稽之谈。相比之下另一条经验还更靠谱一些准妈妈的肚子如果是尖形则胎儿很可能是个男孩肚子是圆形的话就更可能是个女孩。至少在我个人的生活经验之中这条规则的准确率超过了80%。
剥去所有的伦理道德外延所谓的“生男生女”完全可以看成一个纯粹的科学问题。虽然说胎儿性别不可能以决定性的方式影响母体的物理特征但终究会有一定的参考价值。通俗说就是虽说男孩肚子尖女孩肚子圆一定不会以100%的概率发生但70%的置信度恐怕还是有的,这相比于纯属瞎猜的对半概率就是个不小的进步,也就意味着肚子形状的特征提供了一定的信息。除此之外,胎儿性别还可能对母体的其他变化产生一些不起眼但确实存在的影响,比如说民间流传的脚部浮肿或者肚脐突出,这些变化都可以作为预测胎儿性别的特征来看待。
除了肉眼可见的物理特征外,更精确的特征是医学上的定量指标。相关的具体信息在这里我就不班门弄斧了。但可以确定的是,胎儿的性别势必会对母体的内分泌特性产生不同的影响,从而在指标上体现出不同趋势的变化。而这些怀孕早期的指标变化反过来又可以为倒推胎儿性别提供有力的证据,从而实现“生男还是生女”的预测。
那么问题来了,能不能通过机器学习来解决这个问题呢?
能不能用机器学习来解决要从下面这几个角度来分析。首先预测胎儿的性别不是预测婴儿的活动没人能知道婴儿的下一声啼哭会发生在什么时候即使你知道他的血压肺活量脉搏等所有的生理指标还是没有办法去预测。但胎儿的性别不一样它可以体现出一些切实的规律也就是某些特征会表现出固定的变化趋势蕴含着明显的规律性这种规律性被称为“模式”pattern
机器学习能够解决的问题必然会包含某些显式或者隐式的模式,没有模式的问题就不能通过机器学习解决。完全随机的问题是不可能被求解,也不可能被学习的,就像我们永远也没法预测示波器下一时刻的本底噪声一样。
一提到模式,你可能会一下子联系到另一个专业词汇——**模式识别**pattern recognition。模式识别和机器学习实际上有大量的共通之处严格地将两者区分开来既没方法也没必要。如果非要找到些不同的话模式识别是被更广泛地应用在计算机视觉computer vision等专门领域之中的专门概念工程上的意义更浓一些。**如果说机器学习侧重于将预先设定的准确率等指标最大化,那模式识别就更注重于潜在模式的提取与解释**。
是不是有潜在模式的问题都能够被机器所学习呢?也不尽然。流体力学的研究之中有不少复杂困难的问题,但机器学习也没有成为这个学科的主流方法,这意味着机器学习并不适用于易编程问题的解释。**一个具有解析解的问题是完全不需要机器学习的**。即使一个一次方程组中有一万个方程,每个方程中又有一万个未知数,这个看似复杂的问题本质上也无非就是个矩阵求逆,只是矩阵的规模比较大而已。如果将机器学习运用到这种问题上,那就是杀鸡用牛刀了。
退一步讲,**即使问题本身没有解析解,要是能够通过数值计算的方法解决,而不涉及明显的优化过程的话,也无需机器学习的使用**。在流体力学中,仿真是最常用的研究方法,大量的参数与繁冗的边界条件给计算带来了超高的复杂度。但在这样的问题中,机器学习即使被应用,可能也不会发挥出良好的效果,因为这在本质上依然是对等式方程的求解。就像“能用钱解决的问题都不是问题“一样,能用纯计算解决的问题也不是(需要先进方法的)问题。
回到“生男还是生女”这个例子,你可能听说过所谓的“清宫图”——一个依据孕妇年龄和怀孕月份预测生育的表格。可是如果生男生女真的能靠简单的查表操作解决的话,它怎么会直到今天还困扰着为人父母的年轻人呢?正是因为这个问题没有那么简单,机器学习才有大展拳脚的用武之地。
最后,**用机器学习解决问题还需要一个条件,就是大量的可用数据**data。没有数据支撑的机器学习方法就是巧妇难为无米之炊。这是由于问题中的模式可不会像秃子头上的虱子那么明显一方面输出结果会受到多个输入特征的共同影响另一方面特征与特征之间通常也不是完全独立的而是存在着相互作用。因此要精确地描绘出输入与输入、输入与输出之间的定量关系大量的数据是不可或缺的。
总结起来,什么样的问题才能通过机器学习来解决呢?**首先,问题不能是完全随机的,需要具备一定的模式;其次,问题本身不能通过纯计算的方法解决;再次,有大量的数据可供使用**。对于满足这三个条件的问题,机器学习的过程就可以用下图来表示
<img src="https://static001.geekbang.org/resource/image/38/95/386c6af37ec26e2926a663ca28120095.png" alt="">
<center>机器学习的过程</center>
图片来自Yaser S. Abu-Mostafa, et al., Learning from Data A Short Course, 图1.9
在这张图中,目标函数不是通常意义上的正确率等指标,而是指问题的模式,也就是机器学习要发现的对象。这里的目标函数并不具备简单的解析式形式,不能精确求解,只能从不同的角度去近似。近似的方式是什么呢?针对训练数据的特点做出各种不同的假设(线性模型、多项式模型$\cdots$再在假设空间hypothesis space或者假设集合hypothesis set中找到与数据的符合度最高的假设——寻找最佳假设的过程就是学习的过程。**机器学习的任务,就是使用数据计算出与目标函数最接近的假设,或者说拟合出最精确的模型** 。
在不同的机器学习任务中,无论是数据类型还是学习方式都会有所区别,由此就可以从不同的角度对机器学习加以简单的分类。
还是以“生男生女”为例如果真的要依据医学指标进行预测的话那么输入的特征可能既包括像hcg激素水平这样有明确意义的数字指标也可能是B超图像这类需要进一步提取转化的原始资料甚至还可能包括身份证号和病历编号这类每个人独有的信息。
在机器学习中,这三类特征分别被命名为**具体特征**concrete feature、**原始特征**raw feature和**抽象特征**abstract feature在解决实际问题时具体特征可以直接使用原始特征通常需要转换成具体特征抽象特征就需要根据实际情况加以取舍。
看完了输入特征,再来看看输出结果。在第一季“人工智能基础课”中我曾提到,根据输出结果的不同,可以将机器学习的方法分成**分类算法**classification、**回归算法**regression和**标注算法**tagging三类。
显然“生男生女”是个典型的二分类问题binary classification分类的结果只有两种要么正类要么负类。二分类问题是最基础也是最核心的分类问题可以在它的基础上进一步解决多分类问题的求解。
如果训练数据中的每组输入都有其对应的输出结果,这类学习任务就是**监督学习**supervised learning对没有输出的数据进行学习则是**无监督学习**unsupervised learning。监督学习具有更好的预测精度无监督学习则可以发现数据中隐含的结构特性起到的也是分类的作用只不过没有给每个类别赋予标签而已。无监督学习可以用于对数据进行聚类或者密度估计也可以完成异常检测这类监督学习中的预处理操作。直观地看**监督学习适用于预测任务,无监督学习适用于描述任务**。
最后,不同算法的学习策略也有差异。大部分算法是集中处理所有的数据,也就是一口气对整个数据集进行建模与学习,并得到最佳假设。这种策略被称为**批量学习**batch learning。和批量学习相对应的是**在线学习**online learning。在在线学习中数据是以细水长流的方式一点点使用算法也会根据数据的不断馈入而动态地更新。当存储和计算力不足以完成大规模的批量学习时在线学习不失为一种现实的策略。
在学校中,老师可以通过将学生代入学习过程,引导学生主动提问来加强学习效果。这种策略应用在机器学习中就是**主动学习**active learning。主动学习是策略导向的学习策略通过有选择地询问无标签数据的标签来实现迭代式的学习。当数据的标签的获取难度较高时这种方法尤其适用。
今天我和你分享了机器学习所解决的问题特点,以及学习中使用的不同策略,其要点如下:
<li>机器学习适用于解决蕴含潜在规律的问题;
</li>
<li>纯算数问题无需使用机器学习;
</li>
<li>机器学习需要大量数据来发现潜在规律;
</li>
<li>从输入空间、输出空间、数据标签、学习策略等角度可以对机器学习进行分类。
</li>
最后要说明的是,本文中所使用的“生男生女”一例,其作用仅限于解释机器学习这一概念,并无任何其他寓意。如有有意设计算法解决此问题者,一切衍生后果请自行承担(笑)。
机器学习、模式识别、数据挖掘data mining、甚至人工智能这些概念经常被视为等同不做区分地加以使用。可是它们真的一样吗希望你能自己研究每个概念的内涵与外延深入理解它们的区别和联系。
欢迎发表你的观点。
<img src="https://static001.geekbang.org/resource/image/be/8f/be05b6c6e0b5fe77750091db0a15a78f.jpg" alt="">

View File

@@ -0,0 +1,90 @@
<audio id="audio" title="04 | 计算学习理论" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/57/6e/57977768bf49a1e1d9a4522ad919886e.mp3"></audio>
无论是频率学派的方法还是贝叶斯学派的方法,解决的都是怎么学的问题。但对一个给定的问题到底能够学到什么程度,还需要专门的**计算学习理论**computational learning theory来解释。与机器学习中的各类具体算法相比这部分内容会略显抽象。
学习的目的不是验证已知,而是探索未知,人类和机器都是如此。**对于机器学习来说,如果不能通过算法获得存在于训练集之外的信息,学习任务在这样的问题上就是不可行的**。
下图就是来自于加州理工大学教授亚瑟·阿布-穆斯塔法Yaser S. Abu-Mostafa的课程Learning from Data中的一个例子假设输入$\mathbf{x}$是个包含三个特征的三维向量,输出$y$则是二元的分类结果,训练集中包含着五个训练数据,学习的任务是预测剩下的三个测试数据对应的分类结果。
<img src="https://static001.geekbang.org/resource/image/e6/f8/e67715f6dd3b9d6cb1f88a92aa363bf8.png" alt="">
学习任务示意图图片来自Yaser S. Abu-Mostafa, et. al., Learning from Data
横线上方为训练数据,下方为待估计的分类结果,$f_1$~$f_8$代表所有可能的映射关系。
预测三个二分类的输出,总共就有$2 ^ 3 = 8$种可能的结果如上图所示。可在这穷举出来的8个结果里到底哪个是符合真实情况的呢遗憾的是单单根据这5个输入数据其实是没有办法确定最适合的输出结果的。输出结果为黑点可能对应所有只有1个特征为1的输入数据此时三个测试数据的结果应该全是白点也可能对应所有奇偶校验和为奇数的输入数据此时三个测试数据的结果应该是两白一黑或者还有其他的潜在规律。关于这个问题唯一确定的结果就是不确定性不管生成机制到底如何训练数据都没有给出足以决定最优假设的信息。
既然找不到对测试数据具有更好分类结果的假设,那机器学习还学个什么劲呢?别忘了,我们还有概率这个工具,可以对不同假设做出定量描述。**虽然不能对每个特定问题给出最优解,但概率理论可以用来指导通用学习问题的求解,从而给出一些基本原则**。
不妨想象一下这个问题:一个袋子里有红球和白球,所占比例分别是$\mu$和$1 - \mu$。在这里,作为总体参数的$\mu$是个未知量,其估计方法就是从袋子里抽出若干个球作为样本,样本中的红球比例$\nu$是可以计算的,也是对未知参数$\mu$最直接的估计。
但是,用$\nu$来近似$\mu$有多高的精确度呢?
直观看来,两者的取值应该相差无几,相差较大的情况虽然不是不可能发生,但是希望渺茫。在真实值$\mu = 0.9$时如果从袋子中抽出10个球你可以利用二项分布来计算一下$\nu \le 0.1$的概率,由此观察$\nu$和$\mu$相差较大的可能性。
直观的印象之所以准确,是因为背后存在科学依据。**在概率论中有界的独立随机变量的求和结果与求和数学期望的偏离程度存在一个固定的上界这一关系可以用Hoeffding不等式Hoeffding&#39;s Inequality来表示**。在前面的红球白球问题中Hoeffding不等式可以表示为
$$ P[| \nu - \mu | &gt; \epsilon] \le 2e ^ {-2 \epsilon ^ 2 N}$$
这个式子里的$\epsilon$是任意大于0的常数$N$是样本容量,也就是抽出的球的数目。
Hoeffding不等式能够说明很多问题。首先它说明用随机变量$\nu$来估计未知参数$\mu$时,虽然前者的概率分布在一定程度上取决于后者,但估计的精度只和样本容量$N$有关;其次,它说明要想提高估计的精度,最本质的方法还是增加样本容量,也就是多采一些数据,当总体的所有数据都被采样时,估计值也就完全等于真实值了。反过来说,只要样本的容量足够大,估计值与真实值的差值将会以较大的概率被限定在较小的常数$\epsilon$之内。
红球白球的问题稍做推广,就是对机器学习的描述。把装球的袋子看成数据集,里面的每个球就都是一个样本,球的颜色则代表待评估的模型在不同样本上的表现:红球表示模型输出和真实输出不同;白球表示模型输出和真实输出相同。这样一来,抽出来的所有小球就表示了训练数据集,真实值$\mu$可以理解成模型符合实际情况的概率,估计值$\nu$则表示了模型在训练集上的错误概率。
经过这样的推广Hoeffding不等式就变成了对单个模型在训练集上的错误概率和在所有数据上的错误概率之间关系的描述也就是训练误差和泛化误差的关系。**它说明总会存在一个足够大的样本容量$N$使两者近似相等,这时就可以根据模型的训练误差来推导其泛化误差,从而获得关于真实情况的一些信息**。当训练误差$\nu$接近于0时与之接近的泛化误差$\mu$也会接近于0据此可以推断出模型在整个的输入空间内都能够以较大的概率逼近真实情况。可如果小概率事件真的发生泛化误差远大于训练误差那只能说是运气太差了。
按照上面的思路,**让模型取得较小的泛化误差可以分成两步:一是让训练误差足够小,二是让泛化误差和训练误差足够接近**。正是这种思路催生了机器学习中的“**概率近似正确**”Probably Approximately Correct, PAC学习理论它是一套用来对机器学习进行数学分析的理论框架。在这个框架下**机器学习利用训练集来选择出的模型很可能(对应名称中的“概率”)具有较低的泛化误差(对应名称中的“近似正确”)**。
如果观察**PAC可学习性**PAC learnable的数学定义这里出于可读性的考虑没有给出大部分机器学习教材里都会有这个定义你会发现其中包含两个描述近似程度的参数。**描述“近似正确”的是准确度参数$\epsilon$,它将模型的误差水平,也就是所选模型和实际情况之间的距离限制在较小的范围内;描述“概率”的是置信参数$\delta$,由于训练集是随机生成的,所以学好模型只是以$1 - \delta$出现的大概率事件而并非100%发生的必然事件**。
如果问题是可学习的,那需要多少训练数据才能达到给定的准确度参数和置信参数呢?这要用样本复杂度来表示。**样本复杂度**sample complexity是保证一个概率近似正确解所需要的样本数量。可以证明所有假设空间有限的问题都是PAC可学习的其样本复杂度有固定的下界输出假设的泛化误差会随着样本数目的增加以一定速度收敛到0。
但是在现实的学习任务中并非所有问题的假设空间都是有限的像实数域上的所有区间、高维空间内的所有超平面都属于无限假设空间。如何判断具有无限假设空间的问题是否是PAC可学习的呢这时就需要VC维登场了。**VC维**Vapnik-Chervonenkis dimension的名称来源于统计学习理论的两位先驱名字的首字母它是对无限假设空间复杂度的一种度量方式也可以用于给出模型泛化误差在概率意义上的上界。
想象一下如果要对3个样本进行二分类的话总共有$2 ^ 3 = 8$种可能的分类结果。当所有样本都是正例或都是负例时是不需要进行区分的可当样本中既有正例又有负例时就需要将两者区分开来让所有正例位于空间的一个区域所有负例位于空间的另一个区域。区域的划分方式是由模型来决定如果对于8种分类结果中的每一个都能找到一个模型能将其中的正负例完全区分那就说明由这些模型构成的假设空间就可以将数据集打散shatter
<img src="https://static001.geekbang.org/resource/image/d7/2d/d795190d5a49dc4b78e3f81c987f4c2d.png" alt="">
数据集打散示意图(图片来自维基百科)
上图就是一个利用线性模型打散容量为3的数据集的例子。其实对于3个数据来说所有对分类结果的划分本质上都是把其中的某两个点和另外一个区分开来而完成这个任务只需要一条直线而无需更加复杂的形状。可以证明线性模型可以对任何3个不共线的点进行划分也就是将这个数据集打散。
可是一旦数据集的容量增加到4线性模型就没法把它打散了。容量为4的数据集总共有16种类别划分的可能但线性模型只能区分开其中的14种不能区分开的是什么呢就是异或问题的两种情况也就是红色图示中的特例。要将位于对角线位置的正例和负例区分开来要么用一条曲线要么用两条直线单单一条直线是肯定做不到的。
在打散的基础上可以进一步定义VC维。假设空间的VC维是能被这个假设空间打散的最大集合的大小它表示的是完全正确分类的最大能力。上面的例子告诉我们对于具有两个自由度的线性模型来说它最多能打散容量为3的集合其VC维也就等于3。如果假设空间能打散任意容量的数据集那它的VC维就是无穷大了。一个具有无穷VC维的假设空间是$y = sin(kx)$,你可以思考一下这背后的原因。
从可学习性的角度来看一旦假设空间的VC维有限就可以通过调整样本复杂度来使训练误差以任意的精度逼近泛化误差使泛化误差和训练误差足够接近。这个性质取决于模型的特性与学习方法、目标函数、数据分布都没有关系因而是通用的。从这个结论出发就可以得到**任何VC维有限的假设空间都是PAC可学习的**。
在维度有限的前提下VC维的大小也会影响模型的特性。**较小的VC维虽然能够让训练误差和泛化误差更加接近但这样的假设空间不具备较强的表达能力想想上面线性模型的例子训练误差本身难以降低。反过来VC维更大的假设空间表达能力更强得到的训练误差也会更小但训练误差下降所付出的代价是训练误差和泛化误差之间更可能出现较大的差异训练集上较小的误差不能推广到未知数据上**。这其实也体现了模型复杂度和泛化性能之间的折中关系。
由于VC维并不依赖于数据分布的先验信息因此它得到的结果是个松散的**误差界**error bound这个误差界适用于任意分布的数据。要是将数据的分布特性纳入可学习性的框架复杂性的指标就变成了**Rademacher复杂度**Rademacher complexity
函数空间的**经验Rademacher复杂度**empirical Rademacher complexity描述函数空间和随机噪声在给定数据集上的相关性这里的随机噪声以Rademacher变量Rademacher variable的形式出现它以各50%的概率取$\pm 1$这两个值。如果存在多个数据集而每个数据集中的数据都是对同一个概率分布的独立重复采样那么对每个数据集的经验Rademacher复杂度求解数学期望。得到的就是“**没有经验的**”**Rademacher复杂度**,它表示了函数空间在给定的数据分布上拟合噪声的性能。
看到这里你可能不明白了学得好好的为什么要去拟合噪声呢其实引入Rademacher复杂度的初衷是刻画训练误差和泛化误差之间的区别。泛化误差是没办法计算的只能想方设法地去近似而交叉验证就是最常用的近似手段。如果将容量为$m$数据集等分成训练集$S_1$和验证集$S_2$,那训练误差与泛化误差之差就可以写成
$$ E_{S_1}(h) - E_{S_2}(h) = \dfrac{2}{m} [\sum\limits_{x_i \in S_1} e(h, x_i) - \sum\limits_{x_i \in S_2} e(h, x_i) ]$$
其中$h$表示待评价的假设。显然,当$x_i$落入$S_1$时,损失函数$e(\cdot)$的系数为1当$x_i$落入$S_2$时,损失函数$e(\cdot)$的系数为-1。如果用随机变量$\sigma_i$对$\pm 1$的系数进行建模的话,上面的式子就可以改写称
$$ E_{S_1}(h) - E_{S_2}(h) = \dfrac{2}{m} [\sum\limits_{i} \sigma_i e(h, x_i)] $$
如果把$\sigma_i$看成Rademacher变量那这个式子就是Rademacher复杂度。到这儿就不难理解Rademacher复杂度的含义了。在已知的数据分布下Rademacher复杂度既可以表示函数空间的复杂度也可以用来计算泛化误差界其数学细节在这儿就不做介绍了。
今天我和你分享了计算学习理论的一些最主要的概念,并没有深入数学细节。这是评估机器学习的理论基础,也是机器学习理论研究的主要对象,其要点如下:
<li> Hoeffding不等式描述了训练误差和泛化误差之间的近似关系
</li>
<li>PAC学习理论的核心在于学习出来的模型会以较大概率接近于最优模型
</li>
<li>假设空间的VC维是对无限假设空间复杂度的度量体现了复杂性和性能的折中
</li>
<li>Rademacher复杂度是结合了先验信息的对函数空间复杂度的度量。
</li>
和各种具体的模型相比,计算学习理论充斥着各种各样的抽象推导,其内容也显得比较枯燥无味。那么关于学习理论的研究对解决实际问题到底具有什么样的指导意义呢?
欢迎发表你的观点。
<img src="https://static001.geekbang.org/resource/image/98/f8/988c255243bedab7a69692132a9c62f8.jpg" alt="">

View File

@@ -0,0 +1,68 @@
<audio id="audio" title="05 | 模型的分类方式" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/66/be/66c6534be0e0e67f7243de6f6a93eabe.mp3"></audio>
机器学习学的是输入和输出之间的映射关系,学到的映射会以模型的形式出现。从今天开始,我将和你聊聊关于模型的一些主题。
大多数情况下,机器学习的任务是求解输入输出单独或者共同符合的概率分布,或者拟合输入输出之间的数量关系。**从数据的角度看如果待求解的概率分布或者数量关系可以用一组有限且固定数目的参数完全刻画求出的模型就是参数模型parametric model反过来不满足这个条件的模型就是非参数模型non-parametric model**。
**参数模型的优点在于只用少量参数就完整地描述出数据的概率特性,参数集中的每个参数都具有明确的统计意义**。你可以回忆一下常用的典型概率分布,离散变量的二项分布$B(n, p)$只包含两个参数,分别代表独立重复试验的次数和每次试验中事件发生的概率;连续变量的正态分布$N(\mu, \sigma)$也是只包含两个参数,分别代表着随机变量的均值和方差。所以在参数模型的学习中,算法的任务就是求出这些决定概率特性的参数,只要参数确定了,数据的统计分布也就确定了,即使未知的数据无穷无尽,我们也可以通过几个简单的参数来确定它们的性质。
为什么在参数模型中,有限的参数就能够描述无限的数据呢?想必你已经发现,这样的便捷来自于超强的先验假设:所有数据符合特定类型的概率分布。在实际的学习任务中,我们并非对问题一无所知,通常会具有一定的先验知识。**先验知识并不源于对数据的观察,而是先于数据存在,参数模型恰恰就是先验知识的体现与应用**。
先验知识会假定数据满足特定的先验分布,学习的过程就是利用训练数据估计未知参数的过程,一旦得出未知参数的估计结果,训练数据就完成了它的历史使命,因为这些估计出来的参数就是训练数据的浓缩。在这个过程中,先验知识确定了假设空间的取值范围,学习算法(比如最大似然估计或是最大后验概率估计)则在给定的范围内求解最优化问题。
参数模型虽然简单实用,但其可用性却严重依赖于先验知识的可信度,也就是先验分布的准确程度。如果说训练数据和测试数据确实满足二项分布或者正态分布,那么学习算法只需付出较小的计算代价就可以从假设空间中习得一个较好的模型。可如果先验分布本身就不符合实际,那么不管训练数据集的体量多大,学习算法的性能多强,学习出来的结果都会与事实真相南辕北辙,背道而驰。
先贤孔子早在两千年前就告诉了我们一个朴素的道理:“知之为知之,不知为不知,是知也。”当对所要学习的问题知之甚少的时候,不懂装懂地搞些先验分布往数据上生搬硬套就不是合理的选择,最好的办法反而是避免对潜在模型做出过多的假设。**这类不使用先验信息,完全依赖数据进行学习得到的模型就是非参数模型**。
需要注意的是,“非参数模型”不是“无参数模型”,恰恰相反,**非参数模型意味着模型参数的数目是不固定的,并且极有可能是无穷大,这决定了非参数模型不可能像参数模型那样用固定且有限数目的参数来完全刻画**。在非参数模型中不存在关于数据潜在模式和结构化特性的任何假设,数据的所有统计特性都来源于数据本身,一切都是“所见即所得”。和参数相比,非参数模型的时空复杂度都会比参数模型大得多。但可以证明的是,当训练数据趋于无穷多时,非参数模型可以逼近任意复杂的真实模型,这给其实用性添加了一枚重量级的筹码。
参数模型和非参数模型的区别可以通过下面这个实例来简单地体现假定一个训练集中有99个数据其均值为100方差为1。那么对于第100个数据来说它会以99%的概率小于哪一个数值呢?
使用参数模型解决这个问题时,可以假设所有数据都来自于同一个正态分布$N(\mu, \sigma)$。利用训练数据构造关于正态分布均值和标准差的无偏估计量,可以得到相应的估计值$\hat \mu = 100, \hat \sigma = 1$。如此就不难计算出新数据会以99%的概率小于102.365其意义是均值加上2.365倍的标准差,这就是参数模型计算出的结果。
可是对于非参数模型而言它并不关心这些数据到底是来源于正态分布还是指数分布还是均匀分布只是做出所有数据来源于同一个分布这个最基础的假设。在这个假设之上99个训练数据和1个测试数据是一视同仁的。如果把它们视为一个整体那么在测试之前所有数据的最大值可能是其中的任何一个。正因如此测试数据有1%的可能性比之前的99个都要好也就是有99%的可能性小于训练数据中的最大值。
归根结底,**非参数模型其实可以理解为一种局部模型**,就像战国时代每个诸侯国都有自己的国君一样,每个局部都有支配特性的参数。在局部上,相似的输入会得到相似的输出,而全局的分布就是所有局部分布的叠加。相比之下,**参数模型具有全局的特性**,所有数据都满足统一的全局分布,这就像履至尊而制六合得到的扁平化结构,一组全局分布的参数支配着所有的数据。
从数据分布的角度看,不同的模型可以划分为**参数模型**和**非参数模型**两类。如果将这个划分标准套用到模型构造上的话,得到的结果就是**数据模型**data model和**算法模型**algorithm model。相比于参数对数据分布的刻画这种分类方式更加侧重于模型对数据的拟合能力和预测能力。
2001年著名的统计学家莱奥·布雷曼Leo Breiman在《统计科学》Statistical Science的第16卷第3期发表了论文《统计模型两种思路》[Statistical Modeling: The Two Cultures](http://www2.math.uu.se/~thulin/mm/breiman.pdf)),提出了数据模型和算法模型的区分方法。
作为一个统计学家,布雷曼看重的是学习算法从数据中获取有用结论和展示数据规律的能力。从这一点出发,他将从输入$\mathbf{x}$到输出$y$的关系看成黑盒,**数据模型认为这个黑盒里装着一组未知的参数$\boldsymbol \theta$,学习的对象是这组参数;算法模型则认为这个黑盒里装着一个未知的映射$f(\dot)$,学习的对象也是这个映射**。
不难看出,数据模型和算法模型实际上就是另一个版本的参数模型和非参数模型。数据模型和参数模型类似,都是通过调整大小和颜色把一件固定款式的衣服往模特身上套,即使给高大威猛的男模套上裙子也没关系——没见过苏格兰人吗?算法模型和非参数模型则是调了个个儿,充分发挥量体裁衣的精神,目标就是给模特穿上最合身的衣服,至于红配绿或是腰宽肩窄什么的都不在话下——只要穿着舒服,还要什么自行车?
**如果说参数模型与非参数模型的核心区别在于数据分布特征的整体性与局部性,那么数据模型和算法模型之间的矛盾就是模型的可解释性与精确性的矛盾**,这可以通过两种模型的典型代表来解释。
数据模型最典型的方法就是**线性回归**,也就是将输出结果表示为输入特征的线性加权组合,算法通过训练数据来学习权重系数。线性回归的含义明确而清晰的含义:输入数据每个单位的变化对输出都会产生同步的影响,影响的程度取决于这个特征的权重系数,不同特征对结果的贡献一目了然。
可问题是,如何确定输入与输出之间真实的对应关系是否满足特定的假设呢?当某个数据模型被以先验的方式确定后,学习的对象就不再是输入输出之间的作用机制,而是这个数据模型本身。绝大部分数据模型都有简明的解释方式,可如果简单模型不能充分体现出复杂作用机制(比如医学数据或经济数据)时,它的预测精度就会不堪入目。这种情况下,再漂亮的解释又有什么意义呢?
处在可解释性的坐标轴另一端的是大名鼎鼎的**随机森林算法**,这是个典型的算法模型,其原创者正是前文所提到的布雷曼。随机森林是一种集成学习方法,构成这座森林的每一颗树都是决策树,每一棵决策树都用随机选取数据和待选特征构造出来,再按照少数服从多数的原则从所有决策树的结果中得到最终输出。
决策树本身是具有较好可解释性的数据模型,它表示的是几何意义上对特征空间的划分,但是精确度却不甚理想。随机森林解决了这个问题:通过综合使用建立在同一个数据集上的不同决策树达到出人意料的良好效果,在很多问题上都将精确度提升了数倍。但精确度的提升换来的是可解释性的下降。每个决策树对特征空间的单独划分共同织成一张剪不断理还乱的巨网,想要理解这张巨网背后的语义无异于水中望月、雾里看花。
从学习方法上看,上面提到的两种划分方式具有相同的本质。此外,还有另一种针对学习对象的划分方式,那就是生成模型和判别模型之分。简单地说,**生成模型generative model学习的对象是输入$\mathbf{x}$和输出$y$的联合分布$p(\mathbf{x}, y)$,判别模型学习的则是已知输入$\mathbf{x}$的条件下,输出$y$的条件分布$p(y | \mathbf{x})$**。两个分布可以通过贝叶斯定理建立联系。
生成模型和判别模型的区别可以这样来理解:假如我被分配了一个任务,要判断一个陌生人说的是什么语言。如果用生成模型来解决的话,我就需要把这个老外可能说的所有语言都学会,再根据他的话来判定语言的种类。但可能等我学完这些语言时,这个陌生人都说不出话了。可是用判别模型就简单多了,我只需要掌握不同语言的区别就足够了。即使不会西班牙语或者德语的任何一个单词,单凭语感也可以区分出这两种语言,这就是判别模型的优势。
针对生成模型和判别模型的利弊支持向量机的奠基者弗拉基米尔·瓦普尼克Vladimir Vapnik有句名言解决分类问题应该直截了当不要用兜圈子的方式搞一个更难的问题比如求解似然概率做为中间步骤”。一般来说生成模型的求解更加复杂当数据量趋于无穷大时渐进条件下的精确性也更差但其收敛的速度更快在较少数据的训练后就可以收敛到错误的下界。相比之下判别模型的形式更加简单在分类问题上的表现也更出色却不能提供关于数据生成机制的信息。有些情况下生成模型和判别模型会成对出现。例如在分类问题中朴素贝叶斯和逻辑回归就是一对生成-判别分类器。
今天我和你分享了对机器学习模型不同的分类方法,其要点如下:
<li>不同的学习思路对应假设空间中不同的建模方式与学习方法;
</li>
<li>参数模型和非参数模型的区别体现的是全局普适性和局部适用性的区别;
</li>
<li>数据模型和算法模型的区别体现的是可解释性和精确性的区别;
</li>
<li>生成模型和判别模型的区别体现的是联合分布和条件分布的区别。
</li>
当下,参数模型还是机器学习的主流,非参数模型无论在应用范围上还是性能表现上都要略逊一筹。可随着大数据概念的出现,更多更复杂的数据无疑会给参数的拟合带来更大的挑战。在这样的背景下,非参数模型有没有可能发挥更大的作用呢?
欢迎发表你的看法。
<img src="https://static001.geekbang.org/resource/image/96/64/969bb6825efd69d1c5b59a2539764764.jpg" alt="">

View File

@@ -0,0 +1,69 @@
<audio id="audio" title="06 | 模型的设计准则" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c9/57/c9e73a0446e8037fa25c2bf81729b757.mp3"></audio>
上学时你一定过学习新知识的经历:首先要结合老师的讲解进行消化理解,接着要做些练习题找到问题并加强巩固,最后通过考试来检验学习的最终效果。机器学习需要根据问题特点和已有数据确定**具有最强解释性或预测力的模型**,其过程也可以划分为类似于“学习-练习-考试”这样的三个阶段,每个阶段的目标和使用的资源可以归纳如下:
<li>**模型拟合**model fitting利用训练数据集training set对模型的普通参数进行拟合
</li>
<li>**模型选择**model selection利用验证数据集validation set对模型的超参数进行调整筛选出性能最好的模型
</li>
<li>**模型评价**model assessment利用测试数据集test set来估计筛选出的模型在未知数据上的真实性能。
</li>
接下来的三篇文章将分别围绕模型处理这三个阶段展开论述,首先将从模型拟合开始。
虽然模型拟合的任务是计算未知的参数,但它还要解决一个更重要的问题,就是在拟合参数前确定模型的形式,或者说到底要拟合哪些参数。模型拟合本身只是简单的数学问题,交给计算机就可以万事大吉,可**模型设计**却颇有门道,涉及到更多的思考:一方面,模型的合理性很大程度上取决于待解决问题本身的特征;另一方面,模型的复杂度也要和问题的复杂度相匹配。在机器学习中,对这两个基本准则的理解催生了两个基本的规律,分别是**无免费午餐定理**和**奥卡姆剃刀原则**。
“天下没有免费的午餐”是人尽皆知的俗语,这朴素的道理在机器学习中同样适用。通俗地说,**无免费午餐No Free Lunch, NFL定理**证明了任何模型在所有问题上的性能都是相同的,其总误差和模型本身是没有关系的。
这样的结论好像有些反直觉既然大家谁都不比谁好那关于机器学习算法和模型不计其数的研究又有什么意义呢其实这种想法误解了NFL定理的一个核心前提也就是**每种问题出现的概率是均等的,每个模型用于解决所有问题时,其平均意义上的性能是一样的**。
所有模型在等概率出现的问题上都有同样的性能,这件事可以从两个角度来理解:一是从模型的角度来看,如果单独拿出一个特定的模型来观察的话,这个模型必然会在解决某些问题时误差较小,而在解决另一些问题时误差较大;二是从问题的角度来看,如果单独拿出一个特定的问题来观察的话,必然有某些模型在解决这些问题时具有较高的精度,而另一些模型的精度就没那么理想了。
如果把不同模型看成一个班级里的不同学生不同问题看成考试时的不同科目NFL定理说的就是在这个班里所有学生期末考试的总成绩都是一样的既然总成绩一样每一科的平均分自然也是一样的。这一方面说明了每个学生都有偏科数学好的语文差语文好的数学差如果数学语文都好那么英语肯定更差另一方面也说明了每个科目的试题都有明显的区分度数学有高分也有低分语文有高分也有低分不会出现哪一科上大家都是90分或者大家都是30分的情形。
**NFL定理最重要的指导意义在于先验知识的使用也就是具体问题具体分析**。机器学习的目标不是放之四海而皆准的通用模型,而是关于特定问题有针对性的解决方案。因此在模型的学习过程中,一定要关注问题本身的特点,也就是关于问题的先验知识。这就像学习数学有学习数学的方法,这套方法用来学习语文未必会有良好的效果,但它只要能够解决数学的问题就已经很有价值了。**脱离问题的实际情况谈论模型优劣是没有意义的,只有让模型的特点和问题的特征相匹配,模型才能发挥最大的作用**。
相比于1995年提出的NFL定理奥卡姆剃刀可谓历史悠久它诞生于公元14世纪圣方济各会修士奥卡姆的威廉笔下。在机器学习的场景下**奥卡姆剃刀**Occam&#39;s Razor可以理解为如果有多种模型都能够同等程度地符合同一个问题的观测结果那就应该选择其中使用假设最少的也就是最简单的模型。尽管越复杂的模型通常能得到越精确的结果但是**在结果大致相同的情况下,模型就越简单越好**。
奥卡姆剃刀是人类思维的一种直观的体现你我在不经意间都会用到它当看到1248这几个数时对下一个出现的数字你的第一反应一定是16因为这一系列数字里蕴含的最简单的规律是等比数列关系而不是什么包含十几二十个参数的高阶多项式这个复杂的结果直接被头脑中的那把剃刀无意识地砍掉了。
在科学方法中,奥卡姆剃刀对简单性的偏好并非逻辑上不可辩驳的金科玉律,它更多的是基于可证伪性的标准。一个问题存在多个可接受的模型,其中的每一个都可以演化出无数个更为复杂的变体,其原因在于可以把任何解释中的错误归结于某种特例的出现,将这个特例纳入模型就可以避免原来错误的发生。更多特例的引入无疑会降低模型的通用性和可解释性,把薄薄的教材变成厚重的词典,这就是奥卡姆剃刀偏爱简单模型的原因。
**本质上说,奥卡姆剃刀的关注点是模型复杂度**。机器学习学到的模型应该能够识别出数据背后的模式,也就是数据特征和数据类别之间的关系。当模型本身过于复杂时,特征和类别之间的关系中所有的细枝末节都被捕捉,主要的趋势反而在乱花渐欲迷人眼中没有得到应有的重视,这就会导致**过拟合**overfitting的发生。反过来如果模型过于简单它不仅没有能力捕捉细微的相关性甚至连主要趋势本身都没办法抓住这样的现象就是**欠拟合**underfitting
过拟合也好,欠拟合也罢,都是想避免却又无法避免的问题。在来自真实世界的数据中,特征与类别之间鲜有丁是丁卯是卯的明确关系,存在的只是在诸多特征织成的罗网背后若即若离、若隐若现的**相关性**。用较为简单的模型来模拟复杂的数据生成机制,欠拟合的发生其实是不可避免的。可欠拟合本身还不是更糟糕的,更糟糕的是模型虽然没有找到真正的相关性,却自己脑补出一组关系,并把自己的错误的想象当做真实情况加以推广和应用,得到和事实大相径庭的结果——其实就是过拟合。
模型复杂度与拟合精度之间的关系可以这么来理解:过于简单的模型就像给三五百人一起上大课,不管听课的学生水平如何参差不齐,上课的内容都固定不变,或者变化很小。这种教学的效果一定不好:水平高的学生不用听也会,水平差的学生听了也不会,就像欠拟合的模型在训练集上都没有良好的表现,更遑论泛化性能了。
相比之下,过于复杂的模型则是一对一的闭门辅导,针对每个学生不同的问题做出不同的解答,数学不好的补数学,语文不好的补语文。这样因材施教的教学效果固然优良,却因为它的针对性而没法推广,就像过拟合的模型能够在训练集上表现优异,却因为针对性过强,同样不具备良好的泛化性能。
模型的复杂度也可以从误差组成的角度一窥端倪。在“人工智能基础课”的第一季中曾介绍过模型的误差包括三个部分偏差bias方差variance和噪声noise
三者中的噪声也叫作**不可约误差**irreducible error体现的是待学习问题本身的难度并不能通过模型的训练加以改善。噪声来源于数据自身的不确定性如果按照$y = x + \epsilon, \epsilon ~ N(0, \sigma)$生成数据,并对生成的数据进行线性拟合的话,高斯噪声的方差$\sigma ^ 2$就属于不可约误差。噪声的方差$\sigma ^ 2$越大,线性拟合的难度也就越高。
除了噪声之外,偏差和方差都与模型本身有关,两者对误差的影响可以用误差的**偏差-方差分解**bias-variance decomposition来表示。偏差的含义是模型预测值的期望和真实结果之间的区别如果偏差为0模型给出的估计的就是无偏估计。但这个概念是统计意义上的概念它并不意味着每个预测值都与真实值吻合。方差的含义则是模型预测值的方差也就是预测值本身的波动程度方差越小意味着模型越有效。抛开噪声不论模型的误差就等于偏差的平方与方差之和。
偏差和方差之间的折中与模型自身的特性息息相关。偏差来源于模型中的错误假设,偏差过高就意味着模型所代表的特征和分类结果之间的关系是错误的,对应着欠拟合现象;方差则来源于模型对训练数据波动的过度敏感,方差过高意味着模型对数据中的随机噪声也进行了建模,将本不属于特征-分类关系中的随机特性也纳入到模型之中,对应着过拟合现象。
根据上面的理解就不难得到结论理想的模型应该是低偏差低方差的双低模型就像一个神箭手每次都能将箭射进代表10环的红心之内应该避免的模型则是高偏差高方差的双高模型这样的箭手能射得箭靶上到处窟窿却没有一个哪怕落在最外层的圆圈里。更加实际的情形是偏差和方差既不会同时较低也不会同时较高而是在跷跷板的两端此起彼伏一个升高另一个就降低。
一般说来,**模型的复杂度越低,其偏差也就越高;模型的复杂度越高,其方差也就越高**。比较简单的模型像是个斜眼的箭手射出的箭都在远离靶心的7环的某一点附近比较复杂的模型则是个心理不稳定的箭手本来是9环水平却一下射出10环一下射出8环。对模型复杂度的调整就是在偏差-方差的折中中找到最优解,使得两者之和所表示的总误差达到最小值。这样的模型既能提取出特征和分类结果之间的关系,又不至于放大噪声和干扰的影响。
今天我和你分享了在设计机器学习的模型时,需要考虑的一些共性问题,其要点如下:
<li> 无免费午餐定理说明模型的选取要以问题的特点为根据;
</li>
<li>奥卡姆剃刀说明在性能相同的情况下,应该选取更加简单的模型;
</li>
<li>过于简单的模型会导致欠拟合,过于复杂的模型会导致过拟合;
</li>
<li>从误差分解的角度看,欠拟合模型的偏差较大,过拟合模型的方差较大。
</li>
在实际应用中,欠拟合和过拟合是不太可能同时被抑制的,现实的考量是“两害相权取其轻”。那么你认为是应该优先控制欠拟合还是过拟合呢?
欢迎发表你的观点。
<img src="https://static001.geekbang.org/resource/image/f9/e3/f92420771827c3ef2aad604decb6c7e3.jpg" alt="">

View File

@@ -0,0 +1,73 @@
<audio id="audio" title="07 | 模型的验证方法" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/a0/48/a03f0a73c20bb45307c551ea3c12e348.mp3"></audio>
模型本身及其背后学习方法的**泛化性能**generalization performance也就是模型对未知数据的预测能力是机器学习的核心问题。可在一个问题的学习中往往会出现不同的模型在训练集上具有类似的性能这时就需要利用模型验证来从这些备选中做出选择。
由于模型的泛化性能和它的复杂度是直接挂钩的,所以模型验证的任务就是确定模型的复杂度以避免过拟合的发生。原则上说,模型验证应该使用专门的验证数据集。可是当数据集的容量较小,不足以划分成三个部分时,验证集和测试集就可以合二为一,共同来完成对模型的选择和评价。
估计泛化性能时,最重要的依据就是模型在训练数据集上的**精度accuracy**。定性而论,模型在训练集上的精度不能太低。由于模型的拟合和评价都是在相同的训练集上完成的,因此用训练误差去估计测试误差,得到的必然是过于乐观的结果。如果在训练集上都达不到较高的精度的话,模型本身的假设就很可能存在问题(比如用线性模型来建模平方关系的数据),从而导致较大的偏差,这样的模型很难指望它在真实数据上具有良好的表现。
可另一方面训练数据集上的正确率也不是“低低益善”因为过低的正确率往往是欠拟合的征兆。训练数据集中的数据量一定是有限的这些数据共同构成了高维空间上一个点集。只要模型的参数足够多形式足够复杂就必定可以构造出经过所有数据点的曲线或者曲面在训练集上得到100%的正确率。显然,这样的模型对训练数据的拟合能力过强,不可能具备良好的泛化特性。
<img src="https://static001.geekbang.org/resource/image/34/84/3499ccb3cf69c143bd663391a5706884.png" alt="">
<center>过拟合现象(图片来自维基百科)</center>
上图就是一个典型的过拟合例子黑点代表的离散数据可以看成是满足线性关系的原始数据和随机噪声的叠加受噪声的影响即使是生成数据的直线也不能完全拟合数据总归存在一定的残留误差。如果要将残留误差降低为0在训练集上取得100%的正确率,得到的拟合结果就是龙飞凤舞的蓝色曲线。虽然这个多项式模型完美地覆盖了所有数据点,但它所代表的数据生成方式显然和黑色直线并不接近。此时,过高的训练集正确率反而与对模型优良泛化性能的追求背道而驰。
既然训练误差太高了不行太低了也不行那么究竟到什么程度才算合适呢关于训练误差和泛化误差的关系《统计学习基础》Elements of Statistical Learning从理论上给出了略显晦涩的解释。在这里我尝试加以解读。
分析的出发点是误差的分解理论:误差包括噪声、偏差和方差三部分。当模型的训练过程结束后,在训练集上就可以计算出模型$\hat f$的训练误差,在测试集上则可以计算出模型的泛化误差。由于训练数据是已知的,验证数据是未知的,两者之间并不存在交集,所以泛化误差也被称为**样本外误差**extra-sample error
可随后,作者们又引入了一个新的概念,叫**样本内误差**in-sample error这个概念的核心在于刻画噪声的影响。训练集的数据中既包含由潜在的概率分布所决定的确定部分也包含受噪声干扰产生的随机部分。在训练过程中模型$\hat f$将不可避免地把噪声的一部分随机特性也纳入建模的范畴。如果考虑噪声的影响,那么即使当训练数据的自变量不变,它的因变量也会受发生变化。从这个角度来理解,训练数据集就是一个样本,它对应的总体是自变量固定时因变量所有可能的取值。利用样本训练出的模型$\hat f$在样本上的表现和在总体上的表现之间的差值,就是所谓的样本内误差。
看到这里你可能发现了,这个样本内误差纯粹是统计学家想象出来的概念。但好在经过一番处理之后,对测试误差的估计可以转化成对样本内误差的估计,让这个概念终于找到了它能够发光发热的场景。进一步简化的话,由于训练误差是已知的,所以对样本内误差的估计又可以转化成对它和训练误差之间的差值的估计,这个差值在《统计学习基础》中被称为**乐观度**optimism
对于线性模型等特殊形式的模型,乐观度可以以**解析式**来表示,并且直接取决于模型中参数的数目,这时就可以根据**赤池信息量准则**Akaike Information Criterion, AIC或者**贝叶斯信息量准则**Bayesian Information Criterion, BIC来指导模型选择。说白了**在这个理论框架下,模型选择就是计算有效参数的数目**。
上面的理论估计虽然严谨却也太过复杂。在工程上处理误差时哪里需要这喋喋不休的推导直接用数据模拟就什么都出来了。更通用的验证方法是直接估计样本外误差估计的手段则是数据的重采样re-sampling充分利用有限的数据来估算模型的泛化性能这也是实际应用中的惯常技巧。
模型在验证集上的性能是模型选择和评估的依据。无论使用什么样的重采样策略,验证集都需要满足一个基本要求,就是不能和训练集有交集。模型本身就是在训练集上拟合出来的,如果再用相同的数据去验证的话,这种既当运动员又当裁判员的做法就缺乏说服力了。所以在划分时,最**基本的原则就是确保训练集、验证集和测试集三者两两互不相交**。
除了互不相交之外,另一个需要注意的问题是**训练/验证/测试中样例分布的一致性**,也就是三个集合中正例和负例的比例应该大致一致,避免在数据集之间出现不平衡。如果训练集和验证集中的样例分布相差较大,这种分布差异将不可避免地给性能的估计带来偏差,从而模型选择造成影响。
做老师的都知道,一次考试中的学生成绩应该是近似满足正态分布的,所以在评估教学效果时,学生样本的构成就至关重要:如果选的都是成绩较好的学生,那他们在自习室自学的效果可能还比上课更好;如果选的都是成绩较差的学生,那即使老师再苦口婆心掰开揉碎也可能白费功夫。这两种情况的共同特点就是都不能真实反映教学质量。只有当学生样本的构成也是两头尖中间宽的纺锤形时,评估的结果才能忠实于实际情况,具有参考价值。
想要充分利用有限的数据,必须在训练集和验证集的划分方式,或者说验证数据的抽取方式上做些门道。最简单直接的方法就是随机采样出一部分数据作为训练集,再采样出另一部分作为验证集,这种方法就是**留出法**hold-out。如果机器学习过程不使用验证步骤那么这种划分方式就相当于拿出大部分数据做训练剩下的全部留做测试这也是“留出”这个名称的含义。
留出法的一个问题是它所留出的、用于模型验证的数据是固定不变的。即使在满足分布一致性的条件下训练集和验证集的划分方式也并不是唯一的。把所有ID为奇数的数据作为训练集和把所有ID为偶数的数据作为训练集进行模型评估的结果肯定有所区别。通过留出法计算出来的泛化误差本质上也是个随机变量单次留出得到的估计结果就相当于对这个分布进行一次采样这单次采样的结果没办法体现出随机变量的分布特性。正因如此在使用留出法时一般采用多次随机划分在不同的训练/验证集上评估模型性能再取平均值的方式,以此来得到关于泛化误差更加精确的估计。
将留出法的思想稍做推广,就可以得到常用的**$k$折交叉验证法**$k$-fold cross validation。$k$折交叉验证将原始数据集随机划分为$k$个相同大小的子集,并进行$k$轮验证。每一轮验证都选择一个子集作为验证集,而将剩余的$k-1$个子样本用作训练集。由于每一轮中选择的验证集都互不相同,每一轮验证得到的结果也是不同的,$k$个结果的均值就是对泛化性能的最终估计值。
<img src="https://static001.geekbang.org/resource/image/e7/b4/e794df24cab902430a0e0f5551aee4b4.jpg" alt="">
$k$折交叉验证中$k$值的选取直接决定估计结果的精确程度。较小的$k$值意味着更少的数据被用于训练模型,这将导致每一轮估计得到的结果更加集中,但都会偏离真正的泛化误差,也就是方差较小而偏差较大。随着$k$的不断增加,越来越多的数据被用在模型拟合上,计算出的泛化误差也会越来越接近真实值。但由于训练数据的相似度越来越高,训练出来的模型也就越来越像,这就会导致在不同的验证集上产生较大的方差。
$k$折交叉验证一个特例是$k$等于原始数据集的容量$N$,此时每一轮中只有一个样本被用做测试,不同轮次中的训练集则几乎完全一致。这个特例被称为**留一法**leave-one-out。留一法得到的是关于真实泛化误差的近似无偏的估计其结果通常被认为较为准确。但它的缺点是需要训练的模型数量和原始数据集的样本容量是相等的当数据量较大时使用留一法无疑会带来庞大的计算开销。
除了$k$折交叉验证之外,另一种模型验证的方法是**自助采样**bootstrap。在学习概率论时你肯定计算过这样的问题一个袋子里有红球若干白球若干从中抽出一个球查看颜色后放回或不放回再次抽出一个红球/白球的概率是多少。前面提到的$k$折交叉验证执行的就是典型的不放回的重采样,在同一轮验证中某个样本要么出现在训练集,要么出现在验证集,两者必居其一。
相比之下,自助采样执行的则是有放回的重采样。如果使用自助采样生成训练集的话,需要每次随机从原始数据集中随机抽取一个样本并拷贝到训练集中,将这个样本放回到原始数据集,再重复以上的步骤。这种放回重采样的方式会导致某些数据可能在同一轮验证中多次出现在训练集内,而另一些数据可能从头到尾都没有参与到模型的训练当中。在每一轮次的自助采样中,没有被采到的样本会作为测试数据使用。
<img src="https://static001.geekbang.org/resource/image/61/0b/615eb985784b56039661e9439cc8a80b.png" alt="">
自助采样原理示意图(图片来自[https://dzone.com/articles/machine-learning-validation-techniques](https://dzone.com/articles/machine-learning-validation-techniques)
模型验证是模型原型设计的最后完善。一旦完成了模型验证,模型就不能再做调整了。这就像对陶土模型做出最后的修饰定型,至于入窑烧制的效果如何就完全听天由命,出来的成品品相不佳就只能狠心摔碎。同样的道理,即使验证之后的模型在测试集上的表现再差,也只能打掉牙往肚子里咽。若非要调整不可,就只能重启炉灶了。
今天我和你分享了模型验证的实现思路和具体方法,其要点如下:
<li>模型验证的作用是选择最佳模型并确定其性能;
</li>
<li>对数据的重采样可以直接实现对样本外误差,也就是泛化误差的估计;
</li>
<li> $k$折交叉验证是无放回的重采样方法;
</li>
<li> 自助采样是有放回的重采样方法。
</li>
在机器学习中参数parameter和超参数hyperparameter是两个不同的概念。模型的参数是对模型的内部描述超参数则是对模型的外部描述。对于多项式模型$f(x) = \sum\limits_{i = 0}^N \alpha_i x^i$来说,所有的$\alpha_i$都是需要拟合的参数,而多项式的最高次数$N$则是超参数。模型的验证实际上就是通过调整模型超参数来控制模型复杂度,从而找到一组预测能力最强的模型参数。
关于参数和超参数之间的关系,你可以查阅相关的文献,并在这里留下你的理解。
<img src="https://static001.geekbang.org/resource/image/09/ab/092c6829c8466f1d71c77c24b63e6fab.jpg" alt="">

View File

@@ -0,0 +1,86 @@
<audio id="audio" title="08 | 模型的评估指标" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3d/93/3d3ed8b10c2b21cda7701c967a0a7f93.mp3"></audio>
用训练数据集拟合出备选模型的参数,再用验证数据集选出最优模型后,接下来就到了是骡子是马牵出来溜溜,也就是模型评估的阶段了。模型评估中使用的是测试数据集,通过衡量模型在从未出现过的数据上的性能来估计模型的泛化特性。为简便起见,我将以二分类任务为例来说明度量模型性能的不同指标。
二分类任务是最重要也最基础的机器学习任务,其最直观的性能度量指标就是**分类的准确率**。给定一组训练数据,算法不可能完全正确地划分所有实例,而是会将一部分正例误判为反例,也会将一部分反例误判为正例。**分类正确的样本占样本总数的比例是精度accuracy分类错误的样本占样本总数的比例是错误率error rate两者之和等于1**。
在现实生活中二分类任务的一个实际应用就是疾病的诊断。你可以回忆一下在“贝叶斯视角下的机器学习”中提到的例子“Jo去进行某种疾病的检查。已知检查的准确率是95%也就是此病患者的检查结果95%会出现阳性非此病患者的检查结果95%会出现阴性同时在Jo的类似人群中此病的发病率是1%。如果Jo的检查结果呈阳性那么她患病的概率是多大呢
这个例子就是一个典型的二分类问题。根据之前的分析结果即使Jo的检查结果呈现阳性她患病的概率也只有16%如果一个庸医完全按照检查结果判定的话每6个病人里他就要误诊5个这又是频率主义直观的看法但是需要注意的是错误的分类不仅包括假阳性这一种情况假阴性也要考虑在内——也就是确实生病的患者没有被检查出来的情形假阳性和假阴性共同构成所有的误分类结果。
那么在Jo的例子中出现假阴性的可能性有多大呢同样令随机变量$a$表示Jo的真实健康状况$a = 1$表示Jo生病$a = 0$表示Jo没病令随机变量$b$表示Jo的检查结果$b = 1$表示阳性,$b = 0$表示阴性。由此可以计算出Jo的检查结果呈阴性但是她患病的概率
$$p(a=1|b=0) = \dfrac{p(b = 0|a=1) \cdot p(a = 1)}{p(b = 0|a=1) \cdot p(a = 1) + p(b = 0|a=0) \cdot p(a = 0)}$$ $$= \dfrac{0.05 \times 0.01}{0.05 \times 0.01 + 0.95 \times 0.99} = 0.053\%$$
可以看出,虽然这个检查容易把没病的人误诊成有病,但把有病的人误诊成没病的概率是极低的。这符合我们一贯的认知:在现实中,假阳性无非就是给患者带来一些不必要的精神压力,通常不会产生更加严重的后果;可假阴性却可能让患者错过最佳的治疗时机,一旦发现便为时已晚。因此,在医学检查中本着“宁可错判,不能放过”的原则,对假阴性的要求比对假阳性的要求更加严格。
不光是在医学中,在很多情况下将正例误判为反例和将反例误判为正例的代价都是不同的,这也是数理统计将分类错误分为一类错误和二类错误的原因。为了更清楚地体现出不同的错误类型的影响,**机器学习采用了混淆矩阵confusion matrix也叫列联表contingency table来对不同的划分结果加以区分**。
<img style="margin: 0 auto" src="https://static001.geekbang.org/resource/image/4a/5d/4a1f2e9408996808acdbeb2def65845d.png">
如上图所示,**在混淆矩阵中所有测试样例被分为真正例true positive, TP、假正例false positive, FP、假反例false negative, FN、真反例true negative, TN四大类**。真正例和真反例容易理解,假正例指的是样例本身是反例而预测结果是正例,也就是假阳性;假反例指的是样例本身是正例而预测结果是反例,也就是假阴性。
这样的分类能够对机器学习模型的性能做出更加精细的刻画,**查准率**precision和**查全率**recall就是两个具体的刻画指标。
**查准率$P$也叫正例预测值positive predictive value表示的是真正例占所有预测结果为正例的样例的比值也就是模型预测结果的准确程度**,写成数学表达式是
$$ P = PPV = \dfrac{TP}{TP + FP} $$
**查全率$R$也叫真正例率true positive rate, TPR表示的是真正例占所有真实情况为正例的样例的比值也就是模型对真实正例的判断能力**,写成数学表达式是
$$ R = TPR = \dfrac{TP}{TP + FN} $$
通俗地说,查准率要求把尽可能少的真实负例判定为预测正例,查全率则要求把尽可能少的真实正例判定为预测负例。
一般情况下,查准率和查全率是鱼和熊掌不可兼得的一对指标。使用比较严苛的判定标准可以提高查准率,比如医学上对青光眼的诊断主要依赖于眼压值,将诊断阈值设定得较高可以保证所有被诊断的患者都是真正的病人,从而得到较高的查准率。可这样做会将症状不那么明显的初期患例都划分为正常范畴,从而导致查全率的大幅下降。
反过来如果将眼压的诊断阈值设定得较低稍有症状的患者都会被诊断为病人。这样做固然可以保证真正的病人都被确诊使查全率接近于100%,但确诊的病例中也会包含大量的疑似患者,指标稍高的健康人也会被误诊为病人,从而导致查准率的大幅下降。
**将查准率和查全率画在同一个平面直角坐标系内得到的就是P-R曲线它表示了模型可以同时达到的查准率和查全率**。如果一个模型的P-R曲线能够完全包住另一个模型的曲线就意味着前者全面地优于后者。可是更普遍的情况是有些模型查全性能较优而另一些模型查准性能较优这就需要根据任务本身的特点来加以选择了。
除了P-R曲线外另一个对机器学习模型性能进行可视化的方式是**受试者工作特征曲线**receiver operating characteristic curve简称**ROC曲线**。ROC这个名字来源于曲线的原始用途判断雷达接收到的信号到底是敌机还是干扰。在机器学习中这样的场景就演化为所有的样例共同符合一个混合分布这个混合分布由正例和反例各自服从的单独概率分布叠加组成。此时二分类模型的任务就是确定新来的样本究竟来源于哪个分布。数据中的随机变化在分类器中体现为阈值动态取值的随机变化分类器的性能则取决于两个概率分布之间的分离程度。
**ROC曲线描述的是真正例率和假正例率之间的关系也就是收益真正例与代价假正例之间的关系**。所谓的假正例率false positive rate, FPR等于假正例和所有真实反例之间的比值其数学表达式为
$$ FPR = \dfrac{FP}{FP + TN} $$
ROC空间将FPR定义为$X$轴TPR定义为$Y$轴。给定一个二元分类模型和它的阈值就能计算出模型的FPR和TPR并映射成由(0, 0)、(0, 1)、(1, 0)、(1, 1)四个点围成的正方形里。在这个正方形里,从(0, 0)到(1, 1)的对角线代表了一条分界线,叫作**无识别率线**它将ROC空间划分为左上右下两个区域。
无识别率线描述的是随机猜测的模型以0.5的概率将新来的实例判定为正例这种模型的TPR和FPR是处处相等的。在无识别率线左上方所有点的TPR都大于FPR意味着分类结果优于二选一的随机猜测而在无识别率线右下方所有点的TPR都小于FPR意味着分类结果劣于随机猜测。**完美的模型体现在ROC空间上的(0, 1)点:$FPR = 0$意味着没有假正例,没有负例被掺入;$TPR = 1$ 意味着没有假负例,没有正例被遗漏。**也就是说不管分类器输出结果是正例还是反例都是100%完全正确。
不同类型的模型具有不同的ROC曲线。决策树这类模型会直接输出样例对应的类别也就是硬分类结果其ROC曲线就退化为ROC空间上的单个点。相比之下朴素贝叶斯这类输出软分类结果也就是属于每个类别概率的模型就没有这么简单了。将软分类概率转换成硬分类结果需要选择合适的阈值每个不同的阈值都对应着ROC空间上的一个点因此整个模型的性能就是由多个离散点连成的折线。下图给出了ROC曲线和P-R曲线的示意图你可以直观感受一下两者的区别。
<img src="https://static001.geekbang.org/resource/image/70/cf/7099084f10b6fd014b198ef0a13c57cf.png" alt="">
典型的ROC曲线与P-R曲线
(图片来自[https://blogs.msdn.microsoft.com/andreasderuiter/2015/02/09/using-roc-plots-and-the-auc-measure-in-azure-ml/](https://blogs.msdn.microsoft.com/andreasderuiter/2015/02/09/using-roc-plots-and-the-auc-measure-in-azure-ml/)
ROC曲线可以用来衡量习得模型的性能。模型的ROC曲线越靠近左上方其性能就越好。和P-R曲线一样如果一个模型的ROC曲线能够完全包住另一个模型的曲线那么前者的性能就优于后者。但大多数情况下模型之间并不存在全方位的碾压性优势自然不会出现ROC曲线完全包含的情形。这时要评估不同模型性能的话就需要ROC曲线下面积的概念。
**ROC曲线下面积Area Under ROC Curve简称AUC**。由于AUC的计算是在$1 \times 1$的方格里求面积因此其取值必然在0到1之间。对于完全靠蒙的无识别率线来说其AUC等于0.5这样的模型完全没有预测价值。一般来说通过调整模型的阈值可以让模型的最优AUC大于0.5达到比随机猜测更好的判别效果。如果模型的AUC比0.5还小,这样的模型可以通过求解其镜像,也就是将分类结果反转来获得优于随机猜测的结果。
但ROC曲线的意义不仅限于求解面积它还可以提供其他的信息。不同性能的算法对应着ROC空间上不同的点如果能够确定所有样例中真实正例的比例$pos$和真实负例的比例$1 - pos$,那么模型的精度就可以表示为$pos \cdot TPR + (1 - pos) \cdot (1 - FPR)$。根据这个数量关系可以得出,虽然不同的模型具有不同的$TPR$和$FPR$但它们的精度是可以相等的。在ROC空间上这些精度相同的模型都落在同一条斜率为$(1 - pos) / pos$,也就是负例与正例比值的直线上,这样的直线就被称为**等精度线**iso-accuracy lines
由此正例和负例的比例就可以作为已知的先验信息指导模型的选择。如果正例和负例的比例约为2:1那就可以在ROC空间上作一条斜率为1/2且经过(0, 1)的直线并向右下方平行移动。当平移的直线与ROC曲线相交时交点所对应的模型就是适用于这个先验信息的最优模型。此时最优模型的精度是多少呢就是交点所在直线的截距也就是和$TPR$轴的交点。
今天我和你分享了对机器学习模型不同的性能度量方法,其要点如下:
<li> 在二分类任务中模型性能度量的基本指标是精度和错误率两者之和为1
</li>
<li>混淆矩阵是个$2 \times 2$的性能度量矩阵,其元素分别是真正例、假正例、假反例和真反例的数目;
</li>
<li>P-R曲线表示的是查准率和查全率之间的关系曲线在点(1, 1)上达到最优性能;
</li>
<li>ROC曲线表示的是真正例率和假正例率之间的关系曲线在点(0, 1)上达到最优性能。
</li>
关于模型性能的评估我想给你推荐一位学者他就是英国布里斯托尔大学的彼得·弗拉克Peter Flach。这位教授在模型评估研究尤其是ROC曲线分析上的造诣颇深你可以在他的著作《机器学习》Machine Learning第2章和论文中领会模型评估中蕴藏的信息这一定会让你受益匪浅。
对比P-R图和ROC曲线会发现一个有趣的现象那就是当类别的平衡性也就是数据中正例和负例的比例发生改变时这种变化不会给ROC曲线带来变化却会让P-R曲线产生明显的改变为什么会出现这种现象呢
你可以思考一下,并在这里分享你的观点。
<img src="https://static001.geekbang.org/resource/image/de/9e/deeb34b704d9fe4b6d456096f1cd979e.jpg" alt="">

View File

@@ -0,0 +1,48 @@
<audio id="audio" title="09 | 实验设计" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ef/30/efd96d9e601e909a46ec7347cfb90e30.mp3"></audio>
和其他科学学科一样,机器学习也会借助实验获取关于目标的信息。宏观来看,实验的设计与分析正在逐渐脱离具体问题的限定,有成为一门独立学科的趋势。不管是物理学还是经济学,对实验的处理都存在着一些共性的准则。在本篇文章中,我就和你简单谈谈机器学习中有关实验设计与分析的一些原则性问题。
在讨论实验设计之前,先得知道实验设计到底是怎么回事。**实验设计**experimental design或者叫**设计实验**designed experiment指的是在实验之前制定详细的实验计划确定实验目标并选择待研究的过程因子process factor。精心挑选的实验设计可以在给定资源的条件下使实验获得的信息量最大化让实验结果最大程度地接近真实结果。实验设计需要人为改变一个或多个过程因子以观察这种变化对一个或多个因变量的影响其目的是分析获得的数据以产生有效和客观的结论。
在现有的关于机器学习的文献中,对设计实验部分的讨论似乎并不多见,其原因在于这部分工作已经由他人代劳,而不需要放在机器学习的应用层面来解决。在各种各样的图像识别竞赛中,无论是训练集还是测试集都是预先给定的,其中的每张图片都有精确的标注。看起来,设计实验似乎是一项蓝领工作,它被处理高大上算法的白领工作给人为地屏蔽了。可真实情况是什么呢?通过人工数据训练出来的算法,在真实世界中的行为可能完全不同,从“人工智能”变成“人工智障”只是捅破一层窗户纸这么简单。
**设计实验绝非简单的蓝领工作,它甚至比机器学习本身更加注重策略的作用**。机器学习的目标是模拟数据的内在生成机制,取得较低的泛化误差和较强的预测精度。对数据生成机制的学习是建立在足量数据的基础上的,因此机器学习需要的数据多多益善,不会对数据提出这样那样的要求。即使是类别不平衡或者属性有缺失值,机器学习对这些非完美的数据也会来者不拒。这就像一个给啥吃啥的傻小子,只要能填饱肚子就无欲无求了。
相比之下,在设计实验中,数据都是经过精挑细选的,最重要的特性就是**平衡**balance。一般来说“平衡”意味着对于数据来说每个特征可能的取值个数都是相同的而对于特征来说每个取值上的数据比例也是要近似相同的。这种平衡保证了每个特征对结果都会产生同等程度的影响从而回避了特征和因子之间的偏好关系。这就像个讲究生活品质的人不仅要填饱肚子还要通过口味和营养的搭配吃得美味、吃得健康。这在实验中就表现为精确衡量不同因子对实验结果的影响。
**设计实验要完成的任务是对整个机器学习过程的优化**。影响作为一个过程,而不单单是一个模型的机器学习的因子是多种多样的,其中最基本的因子就是**选用的模型形式**。当解决一个分类问题时,主成分分析(通常作为预处理方法出现)、$K$近邻和神经网络都是可用的模型。当模型确定后,**模型的超参数**hyperparameter就是下一个可控因素主成分分析中主成分的个数$d$、$K$近邻算法中$K$的取值,神经网络中隐藏层的数目$n$都属于超参数。超参数会对模型的性能和复杂度产生直接的影响,在不同的超参数配置下,模型训练所得到的参数和性能也会有所区别。
实验中因子的设置取决于实验的目的。如果想要比较不同算法在同一个问题上的性能,算法的类别就是因子;如果要测试固定的算法在不同问题上的性能,算法的超参数就是因子;如果要用算法来区别数据集的数据质量,那么不同的数据集也是因子。设计实验时,要将发生影响的所有因子全部纳入考虑范围并加以调节,从而实现对学习过程的系统性优化。
当实验中的因子数目比较多时,如何唯一地确定单个因子的影响就需要一些技巧。你一定听说过**控制变量法**,这是最简单的实验设计技法之一,它通过将其余变量设置为固定值来观察单一因素的影响效果,以及其背后的因果关系。在机器学习中,这种方法被称为**一次一因子**one factor at a time它首先为所有因子都设定一个基线值再在其他因子保持在基线水平的前提下令单个因子波动观察它对学习性能的影响。
在应用控制变量变量法时需要注意的是,它暗含着一个较强的假设,就是不同因子之间相互独立,互不影响。这个假设在实际的学习任务中显然并不总是成立的,埃塞姆·阿帕丁( Ethem Alpaydin在他的《机器学习导论》Introduction to Machine Learning, 3rd Edition中提到在主成分分析的预处理与$K$近邻分类的级联算法中,主成分数目的每个选择都给后面的$K$近邻定义出一个全新的输入空间,这会使$K$近邻的最优超参数出现变化——在10维输入中计算出的最优近邻数目未必适用于15维的输入。
如果在每次实验中不是控制单个因子,而是让所有的因子一起变化来发现它们之间的协同关系,这就是**因子设计**factorial design的方法。因子设计关注的是不同因子之间系统化的变化对学习效果的影响它的一个特例是**全因子实验**full factorial experiment也叫**完全交叉设计**fully crossed design。在全因子实验中每个因子都有有限个离散的取值实验则覆盖了所有因子所有取值的所有可能组合。如果总共有3个因子每个因子的取值数目分别是3/4/5那么全因子实验的执行次数就是$3 \times 4 \times 5 = 60$。
全因子实验不仅能够研究每个因子对因变量的影响,还能发现因子之间相互作用对因变量的影响,它可以进一步被看成是**连续实验**sequential experimentation的一个阶段。在待分析的因子数目较多时连续实验体现出来的就是“**粗调 + 微调**”的处理方式。它首先执行全因子实验,但只给每个因子赋予较少的可能取值。这种广撒网的做法能够评判所有因子的重要程度,确定哪些是对学习结果影响较大的活跃因子并保留下来,剩下的不活跃的因子就会被放弃。接下来,连续实验会聚焦活跃因子,通过增加取值数目并进行精细的微调来精确刻画它们之间的关系,以及对因变量的影响方式,进而优化学习的设置。
在对筛选出的少量因子进行微调时,可以使用**响应面方法**response surface methodology来降低计算开销。微调的目的是找到最优的因子取值在不可能对所有取值都计算出性能指标的情况下通过**插值**的方法来拟合出因子和性能之间的响应面就是一种更容易操作的办法。在得到的响应面上寻找最值,找到的就是最优的因子取值。
响应面通常被设定为二次曲面,用来拟合初始曲面的数据通常取在因子的基线附近。在初始曲面上找到的因子最优值被应用到学习模型之中,得到的结果作为一个新样本被添加到初始曲面里面,然后继续对响应曲面进行拟合和优化,直到得到的最优结果没有明显的改进为止。
响应曲面其实可以看成一种替代模型。**替代模型**surrogate model是对真实模型的逼近以数据驱动的自底向上的方法构建目标是尽可能地模拟真实模型的行为。如果机器学习中的因子较多的话它们之间的关系可能就是无法用解析式来描述的复杂关系替代模型就是对这种复杂关系的拟合就像机器学习训练模型来拟合输入特征和输出结果之间的关系那样。
今天我和你分享了机器学习中实验设计的一些基本原则,其要点如下:
<li>实验设计的任务是观察一个或多个因子对实验结果的影响;
</li>
<li>机器学习中,实验设计中的因子包括算法类型、超参数、数据集等;
</li>
<li> 连续实验可以用来评估多个因子对实验的影响;
</li>
<li>响应面方法通过二次曲面的拟合寻找可变因子的最佳取值。
</li>
本篇中提到的实验设计类似于机器学习中的模型调参,只不过调参调的是模型内部的参数,而实验设计调的是模型外部的因子。在实际中通常没有得到应有的重视。那么在机器学习的实践中,你是否专门关注过这个过程,又或者掉进过实验设计的坑里,还是历练出什么独门绝技呢?
欢迎分享你的观点。
<img src="https://static001.geekbang.org/resource/image/a0/2c/a06ea57d848d2ca6cdced4ba327f1d2c.jpg" alt="">

View File

@@ -0,0 +1,82 @@
<audio id="audio" title="10 | 特征预处理" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/d5/85/d5369541499aa7c93c2c7024d1c80085.mp3"></audio>
华盛顿大学教授、《终极算法》The Master Algorithm的作者佩德罗·多明戈斯曾在Communications of The ACM第55卷第10期上发表了一篇名为《机器学习你不得不知的那些事》A Few Useful Things to Know about Machine Learning的小文介绍了12条机器学习中的“金科玉律”其中的7/8两条说的就是对数据的作用的认识。
**多明戈斯的观点是:数据量比算法更重要**。即使算法本身并没有什么精巧的设计,但使用大量数据进行训练也能起到填鸭的效果,获得比用少量数据训练出来的聪明算法更好的性能。这也应了那句老话:**数据决定了机器学习的上限,而算法只是尽可能逼近这个上限**。
但多明戈斯嘴里的数据可不是硬件采集或者软件抓取的原始数据,而是经过特征工程处理之后的精修数据,**在他看来特征工程feature engineering才是机器学习的关键**。通常来说,原始数据并不直接适用于学习,而是特征筛选、构造和生成的基础。一个好的预测模型与高效的特征提取和明确的特征表示息息相关,如果通过特征工程得到很多独立的且与所属类别相关的特征,那学习过程就变成小菜一碟。
**特征的本质是用于预测分类结果的信息,特征工程实际上就是对这些信息的编码。**机器学习中的很多具体算法都可以归纳到特征工程的范畴之中,比如使用$L_1$正则化项的**LASSO回归**就是通过将某些特征的权重系数缩小到0来实现特征的过滤再比如**主成分分析**,将具有相关性的一组特征变换为另一组线性无关的特征。这些方法本质上完成的都是特征工程的任务。
但是今天,我将不会讨论这些,而是把关注点放在算法之外,看一看**在特征工程之前数据的特征需要经过哪些必要的预处理preprocessing**。
**特征缩放**feature scaling可能是最广为人知的预处理技巧了它的目的是**保证所有的特征数值具有相同的数量级**。在有些情况下,数据中的某些特征会具有不同的尺度,比如在电商上买衣服时,身高和体重就是不同尺度的特征。
假设我的身高/体重是1.85米/64公斤而买了同款衣服的两个朋友1.75米/80公斤的穿L号合适1.58米/52公斤的穿S号正好。直观判断的话L码应该更合适我。可如果把身高体重的二元组看作二维空间上的点的话代表我自己的点显然和代表S码的点之间的欧式距离更近。如果电商不开眼的话保不齐就会把S码推荐给我。
实际上,不会有电商做出这么弱智的推荐,因为他们都会进行特征缩放。在上面的例子中,由于体重数据比身高数据高出了一个数量级,因此在计算欧式距离时,身高的影响相比于体重是可以忽略不计的,起作用的相当于只有体重一个特征,这样的算法自然就会把体重相近的划分到同一个类别。
**特征缩放的作用就是消除特征的不同尺度所造成的偏差**,具体的变换方法有以下这两种:
<li>**标准化**standardization$x_{st} = \dfrac{x - mean(x)}{stdev(x)}$
</li>
<li>**归一化**normalization$x_{norm} = \dfrac{x - \min (x)}{\max (x) - \min (x)}$
</li>
不难看出,**标准化的方法用原始数据减去均值再除以标准差不管原始特征的取值范围有多大得到的每组新数据都是均值为0方差为1**,这意味着所有数据被强行拉到同一个尺度之上;**归一化的方法则是用每个特征的取值区间作为一把尺子,再利用这把尺将不同的数据按比例进行转换,让所有数据都落在[0, 1]这个范围之内**。虽然实现方式不同,但两者都能够对数据做出重新标定,以避免不同尺度的特征产生不一致的影响,可谓殊途同归。
除了尺度之外,数据的偏度也是值得关注的一个问题。**偏度skewness是用于描述概率分布非对称性的一个指标**。下图给出了两个分别具有**负偏度**和**正偏度**的概率分布示意图,从中可以看出具有偏度的分布的形状都是类似的:一侧是瘦高的形状,占据了概率分布的大部分,另一侧则是比较长的拖尾。
想要理解这个图形所表示的概率分布,只要把正偏度的图形想象成你所在单位的工资分布就可以了:左侧的瘦高形状表示了拿着低工资的绝大部分普通员工,右侧的拖尾则表示了工资更高、但人数更少的中层领导和高级主管。无论机关、事业单位还是企业,工资的分布大抵都是这样。
<img src="https://static001.geekbang.org/resource/image/f3/65/f3156d2ed2acd7f32386931469916265.png" alt="">
<center>不同偏度的概率分布(图片来自维基百科)</center>
数据服从有偏分布意味着什么呢?意味着数据当中可能存在着**异常点**outlier。30个维秘模特的体重应该近似地服从正态分布而正态分布是无偏的对称分布。可是如果把其中一个模特的体重换成相扑运动员的体重这个数据集的均值就会产生明显的上升数据的直方图也会朝新均值的反方向产生明显的偏移。这时偏度就体现为少量异常点对样本整体的拉拽作用类似于用一个董事长和99个普通工人计算平均工资产生的喜剧效果。
**面对偏度较大的数据,第一反应就应该是检查是否有异常点存在**。一般来说,如果少量数据点和其他数据点有明显区别,就可以认为是异常点。在处理异常点时,首先要检测这些数据的**可靠性**,判断异常取值是不是由错误或者失误导致,比如那个混进维秘模特里的相扑选手。
如果异常点本身并没有问题,需要考虑的下一个问题就是异常点和正常点是否**来源于不同的生成机制**,从而具有不同的概率分布。如果对异常点所在的分布的采样数据较少,就不足以体现出分布的特性,导致单个数据点看起来显得突兀。
对于像决策树这类对异常点比较敏感的算法来说,不管来源如何,异常点都需要被处理。最直接的处理办法就是**将异常点移除**,但当数据集容量较小时,这种一刀切的方式会进一步减少可用的数据,造成信息的丢失,这时就需要采用名为“**空间标识**”spatial sign的数值处理方法。
空间标识方法先对所有的数据点进行前面提到的标准化处理再用样本向量的2范数对样本中的所有特征进行归一化其数学表达式可以写成
$$ x_{ij}^* = \dfrac{x_{ij}}{\sum_{j = 1}^N x_{ij}^2} $$
式中的$N$是数据的维度。显然,**空间标识算法将所有的数据点都映射到高维空间的球面上,这个映射和标准化或者归一化的不同之处在于它处理的对象并不是所有样本的同一个特征,而是同一个样本的所有特征,让所有样本呈现一致的尺度**。
当然,即使在没有异常点的情况下,数据依然可能呈现出有偏的分布,这在数字图像处理中并不罕见。有偏分布的一个明显特点是最大值和最小值之间相差较大,通常可以达到**20倍**或者更高。
这种数据尺度的不一致即使出现在单个特征上也不是一件好事情,对它进行修正,也就是**对数据进行去偏度处理的常用方法就是取对数变换log transformation**也就是对特征取值取对数。最大值和最小值之间的20倍差距经过对数变换后变为$\log_2 20 = 4.3$,这就在一个可以接受的范围内了。除了对数之外,**求平方根和求倒数也是移除偏度的常见处理方式**。
异常点也好,尺度不一致的数据也好,它们至少还都是完整的数据。可有些时候,一个样本里的某些特征会压根儿没有取值,而是一片空白,这种情况被称为**缺失值**missing values
数据缺失的可能原因多种多样,在这里就不做展开了,关键还是在于如何处理这些缺失值。最简单粗暴的办法依然是将不完整的数据全部删除,对小数据集来说这依然不是好办法。更主动的处理方式是**给这些缺失值进行人为的赋值imputation**,就像数值计算或者信号处理中的插值方法一样。
人为赋值相当于在机器学习中又嵌套了一层机器学习,里层的机器学习被用于估计未知的属性值,也要使用训练数据。最常用的赋值算法是**K近邻算法**选取离具有缺失值的样本最近的K个样本并以它们对应特征的平均值为缺失值赋值。此外**线性回归**也可以用来对缺失值进行拟合。但可以确定的是,不管采用什么方法,人为赋值都会引入额外的不确定性,给模型带来的性能造成影响。
会做加法也要会做减法,缺失的数据需要添加,多余的数据也要删除。**在模型训练之前移除一些特征有助于增强模型的可解释性,也可以降低计算中的开销**。如果两个特征之间的相关性较强,或者说具有**共线性**collinearity这时就可以删除掉其中的一个这正是**主成分分析**的作用。
除此之外,如果某个特征在绝大多数数据中的取值都是相同的,那这个特征就没有存在的意义,因为它体现不出对于不同分类结果的区分度。这就像在学校里,老师给所有同学的出勤都打满分,这部分平时分是拉不开成绩差距的。
什么样的特征不具备区分度呢?这里有两个经验性的标准:**一是特征取值的总数与样本数目的比例在10%以下**这样的特征在100个样本里的取值数目不超过10个**二是出现频率最高的特征取值的出现频率应该在出现频率次高的特征取值频率的20倍以上**如果有90个样本的特征取值为14个样本的特征取值为2其余取值的样本数目都在4个以下这样的特征就可以被删除了。
今天我和你分享了在模型训练之前对数据特征进行预处理的一些指导性原则,其要点如下:
<li>特征缩放可以让不同特征的取值具有相同的尺度,方法包括标准化和归一化;
</li>
<li>异常点会导致数据的有偏分布,对数变换和空间标识都可以去除数据的偏度;
</li>
<li> $k$近邻方法和线性回归可以用来对特征的缺失值进行人为赋值;
</li>
<li>删除不具备区分度的特征能够降低计算开销,增强可解释性。
</li>
这里介绍的特征预处理技巧可以说是挂一漏万。那么在实际的任务当中,你遇到过哪些不理想的特征数据,又是如何处理的呢?
欢迎分享你的经历。
<img src="https://static001.geekbang.org/resource/image/ee/42/ee7773e41b2173cf2cc244be529d0c42.jpg" alt="">