Datawhale2022年12月组队学习 ✌
我们当然是要学一个好的模型,但是什么模型好?这个问题不易回答。可以希望这个模型能够很好的适用于我们没有见过的样本,很好的适用于 unseen instance。
但是问题是什么叫”好“?可能有一些基本理解,比如错误率低,精度高,做 100 次如果能做对 99 次,这比做对 80 次要好。但这还是不易说出来。
比如我们考虑做推荐。一个淘宝上的电商,希望有一个机器学习的系统能把推荐做好。
我们最希望的结果是一个东西对所有的标准都好,但这不太现实,太困难。所以我们要做的是搞清楚你要的到底是什么,我把你要的给你就好了,我不用关心对别人来说好不好。其实这和我们刚才说的 no free lunch 是同一个思想。
如果只关心前 5 个推荐是正确的,就不用去关心第 6 个开始推荐正不正确。
这实际上是做机器学习的人在看待问题的一个世界观或者方法论 O(∩_∩)O
很多做机器学习的人,会认为给你数据你就去跑,跑个算法,跑个结果,回来把结果给我,我说结果不好,你再给我一个新结果。其实不是这样的。
我们通常会要搞清楚你到底要什么,只有我把你到底要什么搞清楚了,我才知道我要给你什么。
模型评估和选择要解决这个问题,一方面我们要知道你到底要什么,另一方面我还要知道我给你的是不是你要的?这就是我们要解决的关键的背后的这两个问题。而这两个问题从技术上表现来看,它的表现形式可能又要拆解为具体的进几步要讨论的技术问题。
总的来说,一个模型的泛化能力强,就是对新的没有见过的数据的处理能力强。
但是问题是,就算我知道你想要的是什么,我手上没有没见过的数据,我怎么知道我给你的东西恰恰是在没见过的数据上表现的特别好,真的是你想要的呢?
要引进几个概念
嘶,不知道这里课程是不是连续的,听视频有种戛然而止的感觉…
泛化误差:在”未来“样本上的误差
经验误差(训练误差):在训练集上的误差
比如我拿到这么一个数据集,有 4 条样本,全做对了,我的训练误差就是0,训练集精度百分之百。但是这时候泛化误差是多少并我不知道。
我们能控制的是训练集上的结果。但是我们想要的是未来的结果。**我们一定要在这两者之间找到某种联系。**如果彻底没有联系,机器学习学科就不用存在了。因为你做出来的结果和未来完全不发生关系,你根本什么都不用做了。
其实也就是未来的数据和现在的数据符合同样的规律。这时候才能指望做一个好的机器学习模型。
我怎么知道我根据已有数据找出来模型是真正的把规律发掘出来了?
我们能控制经验误差,那么是不是在训练数据上误差最小了,我就真正的把隐含的规律找出来了?
To put it another way,经验误差(训练误差)是不是越小越好?答案是NO!
为什么?这是我们在机器学习中会出现的一个问题,叫 overfitting,过拟合,有的地方把它翻译成过配
现在假设有这么一个训练数据集:上图这两片树叶。现在给一个算法,让它学一个模型,这个模型要做到今后再给一个东西,它判断是不是树叶。
现在训练出一个模型,这个模型能力特别强,它甚至发现有锯齿。然后给它一个新样本,它说这不是树叶,因为没有锯齿。 但是我们看图显然知道这是树叶, 这就是发生了overfitting,它把训练数据里面的特性学出来了,而这个特性恰好还不是一般规律。
比如我们现在拿到这两片训练树叶,正好都有锯齿,这是训练集所满足的一个特性,特有的性质。而这个特有的性质不是一般规律。但是我们这个模型错误的把它当成一般规律了,认为所有的树叶都要有锯齿,他就做错了,这就叫过拟合。
那么欠拟合是啥,重要的东西没学出来。比如它发现这两个树叶都是绿色的,以后,我们拿一个绿色的东西,它认为这就是树叶,这就叫欠拟合,underfitting。
一个事情,一开始我们还什么都没学到,这就是 underfitting,你会犯错误。
但有时候你学到了太多,学到了你不该学的东西,这就是overfitting。
感觉老师讲的好清楚 orz
老师提到了那个曲线
周老师画的这个应该是对应下图的total error和bias
想到了之前看过的这个图
一开始我们还没学到什么东西,误差会非常大,左端是underfitting。随着学习的进步,我们性能会逐渐变好,误差逐渐下降,但是当我们学到一定程度之后,再继续学下去的时候,就有可能是把训练数据里面的特性不该学的东西学出来了,这时候模型就会变坏。到右端发生的就是 overfitting。这是在未来的数据上的表现
而在训练数据上表现是什么?很可能是训练误差一直在下降。
我们真正应该学出来的是什么?是一个理想的平衡点。
wow,从计算理论的角度来解释好棒诶!
但是没有完美的解决方案,也不指望有完美的解决方案。如果有完美的解决方案,也就意味着这个问题我能把确定最好的模型给你了。
这个其实就是把一个甚至比 NP 问题还困难的问题。在多项式时间里面,我这个算法跑出一个结果是能够把最好的结果给你。其实你已经构造性地证明了 p 等于NP,甚至更难的问题。所以只要我们相信 p 和n p 是不等的,就不要指望有完美的解决方案。
所以机器学习始终在和这件事做斗争。不同的算法在用不同的机制跟这件事做斗争。
换一个角度来想,如果 overfitting 这个现象不存在,机器学习学科也不需要存在了。你有一个训练集,你就找一个模型,在训练集上做到 0 误差就 OK 了,这是最好的。这件事情非常简单,你不需要再专门有一个学问要来研究怎么去做到这件事。所以overfitting 是机器学习里面的核心内容。从这个角度来看,可以认为所有的算法,所有的技术都是在缓解,而不是解决overfitting。
学习具体算法的时候,就应该思考几个问题
如果把这个两个问题搞明白。就能明白这个算法应该在什么时候用,什么时候不该用
我们拿到一个模型之后,怎么评估出它在未来可能会怎么样?
感觉这些除了对机器学习本身,对整个人思维也很有启发哈哈哈
为了说明模型在统计意义上表现好,我们最需要考虑**比较检验**
我们只有用户给我们的训练数据,但是我们现在要判断模型在未来会怎么样,怎么做? 关键就是怎样获得”测试集“
测试集是代表了未来我们没见过的东西,训练的时候没见过的东西。
首先要知道测试集应该和训练集互斥。
我训练的时候给了你 30 道题,测试的时候从里面挑 10 道题,你测试出来的结果一定是个对你的能力的过高估计,这不是个恰当的估计,所以一定是和你应该是完全不一样,这时候我才真正能客观的估计你的结果。
但是问题来了,我手上只有一个数据集,我怎么办?常见的方法有这 3 种。
假设这是 100 个样本,割成两部分,左边这一部分用来训练,右边那部分用来测试。比如给我 100 个数据,我拿 80 个训练模型,我拿 20 个来测试模型表现的怎么样。这就是最简单的流出法。
流出法的注意点
保证数据分布的一致性(例如:分层采样)
多次重复划分(例如:100次随即划分)
测试集不能太大,也不能太小。(比如五分之一到三分之一)
要理解这种 hold out 测试的缺陷
hold out 测试还有一个问题。
有数据,可能训练的时候永远没用上,或者测试的时候永远没用上。因为每次都是随机挑20%,假设 1/5 来做测试集,就算挑 100 次,也有可能有数据漏掉。也有可能数据永远没出现在测试数据集里面。而我未来处理的问题里面,这样的问题其实挺重要的。而这样的问题没有测过,有可能未来会很糟糕。
这就好比我们这门课上有 100 个知识点,有 2 个知识点其实挺重要的,以后你们经常用。但是我每次随机猜 10 个,每次猜随机猜 20 个,那两个知识点总归没有考过你们,没考过你们,所以你们在那两个知识点上可能性能非常糟糕,最后得到的是一个过于乐观的估计,最后解决实际问题的时候,发现那两个知识点,原来你们一塌糊涂就有问题了。我们最理想的应该是什么?所有的知识点我都已经全面的检查过你们。希望训练集里面的所有数据,实际上模型性能怎么样都考察过。
k-折交叉验证法则可以把上面的问题解决掉
但是这里面还有一个问题,划分这 10 个子集,不同的切分可能也会导致数据有变化,而这个变化可能会影响估计的性能。
有没有办法在训练的时候就能训练出一个 M100 来,同时还留出一些样本,在未来能够做测试?这种办法就来解决这个问题。
自助法的基础是依赖于有放回采样(可重复采样)
我们想象一个盒子,放了 10 个球,每次摸一个球,再把这个球放回去,下次再取一个球,有的球会多次出现,有的球根本没取到。
但是不管怎么说,原来有 10 个球,现在还可以取 10 个球出来。只不过有的是重复的,有的样本出现了好几次。但是以这种方式,原来假设是 100 个数据做模型,现在就能采样出一个数据集来用 100 个样本做模型,同时里面没有出现的数据,就可以留出来做测试。
没有出现的数据大概会有多少?
这样一种技术它的缺陷是什么?
最重大的缺陷就是它改变了训练数据的分布
我们应该是用这样的一个训练数据的分布结果(slide左图)。结果它用这样来做训练数据了(slide右图)。本来我们这 10 个样本,这 10 个球应该同等重要,结果做的模型可能认为某球更重要。模型在这上面可能得到了一个高估
但是有时候如果我们认为训练分布它稍微变一点,不太重要的时候,这种技术很好。而且有时候数据量不够的时候用也挺好。所以一定要考虑使用场景
嘶,低级错误
同一个算法对同一个数据得出来的模型,对 a 好,可能对 b 不一定好,因为目标可能不一样。
E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E(f ; D)=\frac{1}{m} \sum_{i=1}^{m}\left(f\left(\boldsymbol{x}_{i}\right)-y_{i}\right)^{2} E(f;D)=m1i=1∑m(f(xi)−yi)2
f(x)是hypothesis, y 是我们的 ground truth,它们的差取一个平方,对所有样本 m 取一个均值,这就叫均方误差(有时也叫二次误差,平方误差),有时候也把它叫做,都是一回事,甚至有时候我们前面加个 1/2 都是一样的
前面加上1/2方便求导计算
E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ≠ y i ) \begin{aligned} E(f ; D)= & \frac{1}{m} \sum_{i=1}^{m} \mathbb{I}\left(f\left(\boldsymbol{x}_{i}\right) \neq y_{i}\right) \\ \end{aligned} E(f;D)=m1i=1∑mI(f(xi)=yi)
acc ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) = y i ) = 1 − E ( f ; D ) . \begin{aligned} \operatorname{acc}(f ; D) & =\frac{1}{m} \sum_{i=1}^{m} \mathbb{I}\left(f\left(\boldsymbol{x}_{i}\right)=y_{i}\right) \\ & =1-E(f ; D) .\end{aligned} acc(f;D)=m1i=1∑mI(f(xi)=yi)=1−E(f;D).
P = T P T P + F P P=\frac{T P}{T P+F P} P=TP+FPTP
P = T P T P + F N P=\frac{T P}{T P+F N} P=TP+FNTP
在所有的正样本里面,有多少被找出来了?你看出 positive 是正样本里面你预测为正的。
可以这样理解 precision和recall
有 100 个西瓜,现在预测出有 10 个是好的
如果第一个算法在 p 上更好,第二个算法在 r 上更好。到底谁好?我们把这两个东西合在一起,可以得到一些指标
F 1 = 2 × P × R P + R = 2 × T P 样例总数 + T P − T N \begin{aligned} F 1 & =\frac{2 \times P \times R}{P+R} \quad \\ & =\frac{2 \times T P}{\text { 样例总数 }+T P-T N}\end{aligned} F1=P+R2×P×R= 样例总数 +TP−TN2×TP
1 F 1 = 1 2 ⋅ ( 1 P + 1 R ) \frac{1}{F 1}=\frac{1}{2} \cdot\left(\frac{1}{P}+\frac{1}{R}\right) F11=21⋅(P1+R1)
F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R β > 1 时 查 全 率 有 更 大 影 响 ; β < 1 时 查 准 率 有 更 大 影 响 F_{\beta}=\frac{\left(1+\beta^{2}\right) \times P \times R}{\left(\beta^{2} \times P\right)+R} \quad \\\beta>1 时查全率有更大影响; \beta<1 时查准率有更大影响 Fβ=(β2×P)+R(1+β2)×P×Rβ>1时查全率有更大影响;β<1时查准率有更大影响
1 F β = 1 1 + β 2 ⋅ ( 1 P + β 2 R ) \frac{1}{F_{\beta}}=\frac{1}{1+\beta^{2}} \cdot\left(\frac{1}{P}+\frac{\beta^{2}}{R}\right)\\ Fβ1=1+β21⋅(P1+Rβ2)
我们通常要做一个假设, 说A 算法和 B 算法性能是不是一样,我们来看他们的实验结果。这就是我们的观察。我们来判断能不能把刚才的假设拒绝掉。如果拒绝了,那就说明不一样,如果没拒绝,那就说明性能是一样的。
下面老师举的例子这里没有记录
西瓜书
MOOC