台大《机器学习基石》课程感受和总结---Part 1(转)
期末终于过去了,看看别人的总结:http://blog.sina.com.cn/s/blog_641289eb0101dynu.html
接触机器学习也有几年了,不过仍然只是个菜鸟,当初接触的时候英文不好,听不懂课,什么东西都一知半解。断断续续的自学了一些公开课和书以后,开始逐渐理解一些概念。据说,心得要写下来才记得住。据说,心得要与人分享。这里是自己一点非常粗浅的感想或者遇到的问题,不一定对,请自带滤镜。有大牛的看到了请指出错误,求轻拍,求指导。
先说说台大这门课,总体来说偏理论一些。本来是抱着学学实际应用就行的心态去听的,后来还是感觉到不能只知其然不知其所以然。耐着性子听完后,真的有融会贯通的感觉,比如...之前我连regularization大概是个什么意思,里面的lambda和C又是个什么关系都弄不清楚...现在也算清楚了,虽然不一定用到。讲课的林老师备课非常好,也很负责的亲自回答同学的问题,推荐大家听一听。可惜有两个作业没完成,证书拿不到(因为...中间回老家结婚,你没看错,这种flag我都敢插),不过学习到东西才是最重要的嘛,至少和各种专业词汇混个脸熟,再听别的课程或者阅读书籍的时候不至于茫然。
下面就总结一下从这门课里学习到的一点东西(东西比较杂)。
能够应用机器学习的情况要满足以下几个特点:
- 有pattern,比如银行如何决定是不是给用户发信用卡。
- 这个pattern说不太清楚,没有明确的公式或者过程(要有了就直接用,还学个什么劲儿)
- 要有数据,没数据从哪里学...
机器学习要做的事情就是通过使用Learning Algorithm,基于训练数据(数据由目标函数target function),去假设集合H当中找到一个最合适的假设h,用h来近似target function。target function就是那个神奇的东西,产生了各种数据。
机器学习的模型Model = Learning Algorithm + Hypothesis Set (算法 + 假设集合)
============================================================================================
这门课前半部分都在讲学习是否是可能的,具体怎么做的,就不写了(必须可以啊,不然后面还讲什么呢)。Take away message就是说,要想学习成为可能,就需要Eout(Test)和Ein(Training)之间的差别不能太大。有一个叫做霍夫定不等式的东西,说明了Eout,Ein和假设集合H复杂度之间的关系:
- H复杂度越高,Ein越小,但是Eout有可能就很大。(Overfit)
- 反过来H复杂度不够,Ein可能较大,但是Ein和Eout之间的差别可能不大。(Underfit)
从数据量N的角度来看,要想学习成为可能,理论上N需要是dvc的10000倍;不过实际中,一般来说10倍就OK了。dvc是对假设集合H的复杂度的衡量(值越大,能力越强,越能fit复杂的数据)。在实际应用中,dvc的值大概等于自由度(但并不总是这样;比如你有100个feature,自由度99,那你至少需要1000条数据)。
对于feature,有以下几个种类:
Concrete具体型:有较清晰的物理意义且与问题相关(领域知识)
Raw初级型:只有一些较为简单的物理意义
abstract抽象型:没什么物理意义
...
================================================================================
PLA,Linear Regression, Logistic Regression.三个其实都可以拿来做分类,各有各的优缺点。具体见课件11.
在做PLA,Logistic Regression之前,先用Linear Regression找到一个w,作为初始值。
线性不可分的数据,pocket PLA和Linear Regression,我们在实际中更倾向于使用后者。
Logistic Regression输出值是0到1之间,属于linear classification的一种。这不就和分类概率一样咩。
================================================================================
有时候,我们的model因为underfit表现不好,我们需要加入更多的feature,这可以是其他feature或者是已有feature的transformation,比如加入多项式的feature。但是,如果我们加的过猛,可能就会overfit。
比如target function是由50次的多项式产生的,你用10次的多项式去建模,那就可能overfit了。实际上,即使是target function就是10次多项式产生的,你用10次多项式,还是会overfit。课件中,使用二次多项式建模反而效果更好。
这其实感觉更像一个哲学问题:天之道,损有余而补不足。是故虚胜实,不足胜有余。 --- 《九阴真经》。俗话说,过犹不及,也是这个道理。所以在尝试模型的时候,从最简单的线性模型linear model开始,即使要加入多项式项,也请从低次方项开始加。
Overfitting出现有三个条件:
- 数据集太小,没几个点可以学。
- 数据的noise太大(stochastic noise,随机噪声)
- 使用的模型太复杂(这也是一种noise,叫做deterministic noise)
- 模型相对数据来说太复杂(叫做excessive power,这一点可以和第三点合二为一)
============================================================================================
当然,如果我们就是想用复杂一点的模型,也不是不可以,那就要加入regularization。这样既可以享受复杂模型的能力,又可以保证让模型的能力不太过头。
Regularization的作用在于step back from complex hypothesis to simple ones (for example from H10 to H2)。H10和H2的关系(从w0开始考虑):
- H2 = H10从3次方开始系数都是0 (这看上去貌似是多次一举);
- 放宽条件-> H10任意3个系数不是0,其余是0;
- 继续放宽条件->H10的系数的平方和小于C(wTw <= C)(这样,既可以享受H10的能力/复杂度,又不会太过)。
虽然我们选用比较复杂的模型H10,但是可以通过设定lambda来加入Regularization。记住,从很小开始加。a little regularization goes a long way. 加多了可能underfit(具体参考课件)。
============================================================================================
很多时候,我们尝试了不止一种模型,而是由很多种。那么怎么才能做出选择呢?这里需要用到的就是Validation。记住,我们要做的是Model Selection,而Model = Algorithm + 对应的Hypothesis Set.
要做Validation:
- 我们需要将数据分成三个部分(训练,检验,和测试三个数据集)。各个模型在训练数据上进行训练,会从自己的Hypothesis set中选出一个最佳的假设g作为这个假设集合的代表。
- 然后,各位代表再到检验数据上试一下效果如何,最后我们选择在检验数据上表现最好的g所对应的那个模型M。
- 再将训练和检验数据合并起来,让M在这个合并的数据上再去得到一个最终的假设g*,作为最终用来近似target function的结果。
- 那么这个g*到底表现怎样,我们可以在测试数据上测一下,作为g*能力的评判。
这里有一个问题,之前纠结了一下。在第二步中我们选出了表现最好的g以及其对应的模型M。可是第三步,又把训练和检验数据合并起来,重新用M得到了一个g*。问题是,有没有可能在合并的数据集上,其他模型表现反而更好呢?
这个其实是个陷阱。你想知道其他模型在合并的数据上是不是更好,那我们就需要另外再找一个检验集合去衡量,可是我们没有(测试数据是绝对不能动的哦!),而我们又不能用训练数据上的表现来衡量(因为这一个过度乐观的估计)。如果我们能找到新的检验数据,那这个过程就可以没完没了的进行下去,我们永远都可以想是不是合并后别的模型效果更好...
所以,我们没办法知道上面那个问题的答案。而理论上来说,g*因为是从更大数据中学习出来的,它的效果理论上来讲会比g更好一些。
============================================================================================
最后三点指导思想:
1、simple is good. 大道至简。
2、小心Sampling Bias, class matches exam. 你的训练数据和测试数据要是从同一分布得来的。要思考一下,真的是吗?比如说银行信用卡问题:银行的数据是那些银行给了信用卡的人,他们是否有乱花钱。但是我们不知道被我们拒绝的人,如果真要是给了,他们会不会乱花钱。所以这个数据是已经被筛选过了的。而真正实际应用的时候,可不会有这样的区分的,所以有bias(怎么解决没讲,查查文献吧)。那就是说,我们还要考虑,一个问题它面向的数据应该包括哪些方面,现有的数据是不是biased。
3、不要Data Snooping,你这是在把自己脑子里的complexity加到模型中。还有,人们习惯性的把数据集拿到后就做一下exploratory data analysis,看看统计数据什么的。但是如果这个分析过程使用的数据包含了你的test data,那其实就有可能间接的data snooping了。简言之,不管你做什么处理,请你先把数据集分割成train和test以后再做,并且只在train上做。再确定方案后,再将同样的方案apply到test上(比如在train上选定了特征或者做了什么变换)。
============================================================================================
Part 1就这样吧。