引言——机器学习是数学?程序设计?还是...与现实世界有着千丝万缕的联系的哲学?我将背起我的小背包,在机器学习的海洋中探索冒险,然后筑建一个属于我的世界or城市。maybe你想和我一起吗?
本系列博客参考书:大名鼎鼎的西瓜书!(周志华机器学习)
机器学习的海洋有它自己的语言,学习术语当然是生存的第一步啦!
First,初来乍到,这片海洋中有各种各样的新事物,于是我就得从不同维度观察它们的属性特征来认识这些新事物——这就产生了“特征向量”,我观察的属性特征的个数就是“维数”。那我们观察新事物肯定不会只盯着一个看吧,我肯定看看这个,再看看那个,慢慢我就能用大脑这个学习器对它们去分类啦,那在这之前被我观察的那些事物就是训练样本,加在一起就构成了一个数据集,也是我的训练集。
既然已经说到了分类这件事,那就从这里继续下去吧。不管你这么想,分类绝对不是件简单的事。举个栗子,我们如何定义一个人的好坏?有的人认为诚实的就是好的,而也可能有人反驳说乐于助人才算好人。当然我们去定义的时候肯定不止有一个标准,也许我们观念里"好人"的品质是一样的——诚实,乐于助人,有所贡献,balabala......但是!这些品质在我们每个人的评价体系里肯定是不同的,就像刚刚说到的那样,那也就是说,不同的品质在不同的评价体系里有着不一样的权重,也就体现着我们各自的“归纳偏好”。maybe我们可以认为,不同的归纳偏好就形成了不同的评价体系,但这有时候是件麻烦事,比如我们去评判一个人是否有罪,那就是一万个人眼里一万个哈姆雷特的事情啦,所以我们需要法律来制定一个规范的标准是吧。在机器学习的海洋里也有一个类似的标准,虽然并不绝对,但大多数时候我们都会去遵循,就是Occam's razor(奥卡姆剃刀),听名字好像很高大上,其实就是一切从简的意思。西瓜书的原文是这样说的“若有多个假设与观察一致,选最简单的那个。”
这里就该有一个新的问题了。我要在机器学习的海洋里构建我的世界,那为了维持秩序我肯定要建立这样那样的法则呀,那我怎么知道我制定的这些法则是否可行,还有如果我有多个法则,我应该选择哪一个?——这不就是所谓的模型评估与选择嘛!
我的具体开工思路参照了我的西瓜书大宝典——经验误差与过拟合-评估方法-性能度量-比较检验
首先来说经验误差和过拟合。先甩个原文。
这段话其实很好理解呀,就和概率论是很接近的思路,相当于你在对新事物的认识中认对了和认错了分别是两个基本事件,然后对应了两个概率,加起来就是1。只不过说在机器学习海洋里我们给它分别起来名字——"精度","错误率"。
要怎么理解这个误差呢,本领航员认为,误差其实是对错误率的进一步解释和划分。你看它被细分成了训练误差(经验误差)和泛化误差,对应着我后文中会提到的经验错误率和泛化错误率。
我们假设机器学习海洋里马上要有一场海洋大作战,初来乍到的explorer在参与这场大战前需要一些训练——至少得知道敌方“来者何人”吧!于是乎我们就开始了紧张的战前准备,这时候我们一个个的都变成了学习器。那如果我们消极怠工,选择躺平,这在机器学习当中就会造成“欠拟合”,不过想要成为成功的explorer肯定是不能这样的啦,这个问题也很容易解决,只要强化我们的学习能力就可以了。比较难解决的是和欠拟合相对的——"过拟合"。过拟合是什么呢,就是说你的学习能力太强啦,关注了一些过于刁钻的细节,这就有一丝"白马非马"的意味了,就是说你忽略了事物的特异性,导致你这个泛化的能力变差了。
继续说我们的机器学习海洋大战。前面说我们在大战前做准备,这个属于什么呢——属于训练。那怎么知道我们训练的效果怎么样呢?这就需要测试,对吧。那这样一来我们就认识了两个新概念:训练集和测试集。我们要讨论的是怎么划分这两个东西。
留出法就很简单啊,直接固定地拿一部分出来当测试集。不过为了保持数据分布的一致性——这个怎么说呢,我们先跳出这个海洋大战的情景,想想你学生时代和考试的无数场大战。刷题你得所有题型都练吧,考试它也不能专挑一个章节的内容考叭,如果你只拿着前7章的资料复习,考试却只考你后三章的内容,那就凉凉了,当然这肯定是不合理的,所有就要有数据分布一致性啦。为了达到这个目的,我们一般会用“分层抽样”的办法划分,一般会选择留2/3~4/5作为测试集,这个还得具体情况具体分析啦。
留出法感觉不是那么聪明的话,就看看k折交叉验证吧!其实也很简单,k折交叉验证就是把数据集划分成了k个子集,然后把它们依次作为测试集,其余的作为训练集去训练。
还有一个自助法,一般在数据集较小且难以有效划分时使用。(这里我就不多说啦)
哎呀是不是有偏题了,我们还在海洋大战呢。大战这件事不可马虎,我们肯定得挑选所谓“精英部队”出战叭,那要用什么标准来选择所谓“精英”呢,当然是性能度量啊!
对回归任务的性能度量不难(是不是没有说过回归任务的概念,补充一下,你预测的是连续值那就是回归任务,比如说你要预测敌方的战斗力,那如果在此基础上你要对战斗力划分区间和等级,去判断它的战斗力属于哪个级别,这就是分类)。对于回归任务最常用的就是均方误差。
对于数据分布D和概率密度函数p(·),它还能表示成:
对分类任务的性能度量就没有那么简单啦。错误率和精度前面已经提过啦,就先从查全率查准率开始说叭。
这里我们画一个混淆矩阵
很好理解的。还是用我们挑选精英部队作为例子,假如说客观上确实存在一个分层标准,这时候你主观地去划分。查准率是什么呢,是你挑出来10个精英,其中有9个是真的精英,那你的查准率就是9/10。而查全率是说,这些人里面有11个精英,被你挑出来的有10个,那你的查全率就是10/11。
一般来说查全率和查准率这东西就是鱼和熊掌不可兼得。
我说什么来着,指定法则和标准是个很重要的事情嘛,既然查全率和查准率不可兼得我们就得对它们进行综合度量,综合度量不就有需要有指标了嘛。这里我挑比较常用的一个讲:
当β=1的时候其实就是F1度量,只不过(还记得我们的归纳偏好嘛?)实际情况下查全率和查重率的重要程度是不一样的,所以就需要给它加一个权重。
AUC-ROC曲线是针对各种阈值设置下的分类问题的性能度量。ROC是概率曲线,AUC表示可分离的程度或测度,它告诉我们多少模型能够区分类别。AUC越高,模型在将0预测为0,将1预测为1时越好。
假设检验应该是个很耳熟的概念,好像哪里都有它(那当然是因为他真的很重要啦!)让我先来bing一下统计学中假设检验的概念(搜索)(复制)(黏贴)——“假设检验(hypothesis testing),是用来判断样本与样本、样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法。显著性检验是假设检验中最常用的一种方法,也是一种最基本的统计推断形式,其基本原理是先对总体的特征做出某种假设,然后通过抽样研究的统计推理,对此假设应该被拒绝还是接受做出推断。”
那我在机器学习大海洋里假设的是什么呢?在完成前面的任务后我得到了一个叫做测试错误率的东西,还记得吧,现在我要在这个基础上,去猜泛化错误率。年少无知的我当然也曾误以为会找到泛化错误率的值,然后发现无路可走无砖可搬——在又一个天才出现之前,我们能探索的大概暂时只是泛化错误率的分布可能情况。
熟悉吧,学过概率论的little_explorer应该都认识它,二项分布示意图。有了它下一步就很明确啦,我们可以用二项检验去检验我们的假设。
当然我们不止有二项检验一个工具,t检验也是很好用的!关门放公式!
一个优秀的explorer该具备什么品质呢——观察啊!(所谓万物皆可观察法,我说的。)k值增加,代表交叉验证的次数增加,从上图就看到临界值随之降低,图上体现出来的就是泛化错误率的分布趋于集中了。
本explorer有些疲倦(bushi),休息一下再来继续探索吧!下一期是线性模型!