原文:Pedro Domingos, A Few Useful Things to Know about Machine Learning
1. 泛化效果是机器学习的唯一目标
训练集上的效果无关紧要,泛化效果是机器学习的唯一目标。稍极端的例子,如果训练集准确率为0%,但随机取的新数据集上准确率为60%。也好过训练集80%,新数据40%的结果。这点不仅对机器学习重要,即使是人工规则,也要审视选定的规则有没有泛化意义,仅仅让标准集效果更好或更差一样没有意义。
2. 机器学习算法的三维
算法除参数可设外,还有其它维度可改。任何一个机器学习算法都由三维组成:模型假设、误差评估方法(cost function)、求解方法。除第一维不可变动外(那就换模型了),后两维都是可变的。
1)模型假设(Representation)。KNN,SVM中假设特征距离近的instance是一类的;NaiveBayse假设特征条件独立;Logistic Regression假设feature对结果贡献都是线性的;等等。假设如果不对就不该选此模型,或选这些feature。
2)误差评估方法(cost function,Evaluation),即使一个模型也可以用多种cost function,决策树用熵(信息增益),或用均方差,其实也可以用准确率和错误率。哪种效果好呢?也许我们并没有考虑过,只知道C4.5是用信息增益就以为它就是唯一答案。不同的应用场景可能有不同答案。
3)求解方法(Optimization)。最优化的问题都有多种求解方法:贪心、动态规划、梯度下降、Quadratic计算。一个模型可以有多个求解方法,例如C4.5用的是贪心,贪心一定是最好的方法吗?也许出于性能考虑我们最终仍倾向于它,但每到此时不妨问问。
3. No free lunch
模型是一个杠杆,人的经验+data产出任一前者无法达到的能量。如果一个模型不引入任何假设就退化为记忆+统计,全赖data。但哪怕是最简单的bool型feature,有N个feature就有2^N个要学的feature种类,对应至少这么多的data,20个feature就要1024*1024个data,100个feature呢?实际中uniq的data根本没有那么多。对于那些没被data覆盖的坑,任何模型算法的效果都不会比抛硬币随机猜的效果更好(无论在训练集上拟合好坏,其泛化效果都和抛硬币一样)。这就是"no free lunch"。
即使一个模型隐含了某个假设,若输入feature无法和这些假设契合,对模型来说同样什么都学不到。因此我们必须加入人的经验,这就体现在我们利用人类知识选取哪些已知有用的feature(而不是罗列所有原始feature让模型自己挑、自己组合),同时我们知道这些feature能够直接地满足我们所选模型的假设。或者反过来,我们选择模型的一个标准是,我们是否知道该选哪些feature来很好地支持这个模型假设。
4. 过拟合的帮凶
既然泛化能力为唯一目标,过拟合就是最大的罪人。当training和testing的个体(尤指features)很不一样,或者使用了一些非常灵活的模型(决策树),或者即便是不太灵活的线性模型但feature个数很大(导致train--test的features的差异更大,泛化能力变弱)时,过拟合非常容易发生,training set 和 testing set 必须严格隔开。
1)不具代表性的训练集
不过拟合才怪。训练集要尽量随机抽取。
2)模型灵活。
在数据有限的前提下,学习能力强的模型不一定比能力差的模型结果好。决策树是最强学习能力的模型(它能穷举所有feature取值组合),朴素贝叶斯则受诸多假设限制。所以只要想学到底,前者训练可以做到100%准确率0 bais,而后者则只能做到一定准确率,bais始终存在;但在数据不充分的基础上,强学习模型学得很充分,只能是依靠了很多“随机巧合”的经验,没被数据覆盖的坑的数量就是过拟合的程度。所以这个时候决策树反而不如feature符合贝叶斯假设的学习效果好,因为假设的正确性提供了额外的杠杆信息。
3)feature过多
Curse Of Dimensionality. 泛化能力会随着feature的增加而降低(确切的说是降低的可能性在增大)。增加feature能带来好处,但同时也会带来坏处。增加无关或过多feature可能让模型变得更差。因为数据集不足以cover所有feature,罕见的feature导致过拟合更容易产生,过多常见的feature会淹没真正有用的feature。而人类的直觉也只能理解到3维空间,高维空间的直觉往往是错误的。
5. cross-validation的正确用法
cross-validation不是用来train N个模型然后取平均做最终模型的。(大部分模型也没法取平均融合)cross-validation是用来调整模型的外部参数的。即CV是一种利用Training Set tune外部参数的方法。10-fold cross-validation实际上使用同一组外部参数train了10个模型实例,得到10个泛化准确率(分别在1/10的切片上test的准确率,而不是9/10上的training准确率),反应了当前参数setting的效果。当然也可以不用cross-validation,直接用一个独立的test set来tune参数,但是相对较小的test set更容易导致tuning的过拟合。
原创博文,转发请注明出处。
苏冉旭的博客,http://hi.baidu.com/hehehehello/item/99de18188408a8f8dceecaad