关于机器学习你需要知道的

来源:互联网 发布:数据采集卡和plc对比 编辑:程序博客网 时间:2024/05/17 14:30

转自公众号:新智元

机器学习著名研究者 Pedro Domingos 教授写了篇文章《机器学习那些事》(A Few Useful Things to Know about Machine Learning)。这是一篇极好的文章,首先作者是在机器学习方面有着深厚功底、非常擅长教人的老师,其次内容丰富全面,更何况他只用了 9 页纸就写完了。

对于学术研习来说,9 页纸算轻松读物,但用其他标准就难说了。因此,我在这里尝试用简单的话、更多例子、更少术语阐释 Domingos 的文章。直接引用原话时我会说明。

机器学习的原理是什么?

我们知道,监督机器学习模型能够从输入数据中预测输出,但模型构建过程究竟是怎么一回事呢?所有的机器学习算法(建模的材料)基本上都由以下三部分组成:

一组可行的模型,有待检验
一种测试模型是否好用的方法
一种聪明的方法,只用为数不多的几次测试就能检验模型是否好用

这就像在你家附近找一家好吃的餐馆:先选出一些备选来,然后测试那里的饭是否好吃。不过,第三项要稍微难办些,你得在不在每家餐馆都就餐的前提下,挑选出一家好的餐馆。或许你可以看一下菜单,或者周围环境。或者你问一些人。总之,有很多种方法不全部就餐也能作出判断。最终你选出来的,可能不是最好的一家;选出最好的一家需要花费很多功夫,而且有可能完全没有必要。你会选出不错的一家,这样就行了。

回到机器学习上来,事情会更加复杂:对于真正的机器学习算法而言,可能的模型数量十分巨大,很多时候甚至是无限的。好在我们已经知道了很多聪明的判别方法,最终能够找到合适的模型。

而一旦你找到了好的模型,成败也在接下来的实践过程之中。我们都希望这个模型也适用于原始数据库以外的数据,这样你就能在不清楚目标的时候从输入中进行预测。然而,就连这么简单的一点,学习模型失败的方式也有很多,当然,你也有很多种方式确保它们不会失败。

Domingos 在论文中总结了最常见的一些问题。

过拟合有很多面

论文的这一节主要讲了一定要用样本以外的数据评估分类器的性能。也就是说,要弄清楚你的模型是不是好用,你至少得用训练数据以外的数据做一次测试。即使这次测试通过了,要真正弄明白,你最好做几次(每次都以不同的方式拆分数据)。如果你的数据是按照时间分布的(比如每周销售额),那么你最好这样做测试:用一周以外的数据做训练,然后用那一周的数据做测试,最好每一周都这样来一遍。

再怎么拆分数据做训练和做测试也不为过。你甚至应当自己想象一些数据,然后预测结果,检验模型在特定情形下是否可靠。只有这么做,你才能明白模型是否好用,模型出错了是错在什么地方。

Domingos 重点介绍了一种分析模型错误的方法,叫做偏置方差分解(bias-variance decomposition),这里有一个77页的 PDF 详解。

直觉不适用于高维空间

假设你有一个模型,输入一些字段会输出一些字段,结果没有你期望中好。你首先想到的是要不要增加一些输入字段。毕竟,在现有输入的基础上,模型得到的数据更多,结果不应该更好吗?

先别急。这种方法要是你增加的输入字段是有用的(能够很好地预测结果)还好,要是你增加的输入字段是没用的,或者信息冗余,那么你将得到一个比原先还糟糕的模型。原因之一是,你输入的字段越多,模型发现它们之间存在某种关联的可能性就越大,而实际上这种关联并不存在,只是噪音罢了。因此,这种情况下模型就会将原本不重要的输入字段误判为很重要,当然性能就比原来的还糟糕了。

在实践中,这意味着当你增加输入字段的时候,你的训练数据也必须增加,从而抵消输入字段增多而引起的误差。

这在机器学习里也被称为维度灾难(curse of dimensionality),它只是输入字段过多而引发的众多问题里的其中一个。你可以通过只选择那些有关的字段作为输入解决这个问题,也可以在建模时开放配置面板,取消不大相关的字段。

理论保证与看上去不一样

许多机器学习论文都会给出炫酷的数学公式,然后说只要你的训练集达到一定规模,就能确保模型的错误率好过某些值。问题是,这些理论保证往往并没有用,因为它们保证的值在实践中根本不会有算法达到。

我从事机器学习这些年,见过类似的现象。“算法 X”不好因为它不是神经网络,或者不是支持向量机,或者你能想到的例子。我们的 CEO 曾经说过一家大公司机器学习项目失败的例子,他们失败的原因是一位高管认为当时用的分类器比他在大学本科时听过的一种分类器要差一些。人家是高管,证据不足也只能听他的,结果就是项目到后期打散重来,浪费公司好几千万美元。

这种对算法的偏见还可能引发更严重的后果。现在我们知道了,要看一个算法是否适合你的数据,唯一的方法是做测试。没有先入之见,才能找到最好的答案。

特征工程是关键

这个话题十分重要,实际上,Domingos 将其称为决定机器学习项目成败“最重要的因素”。一个机器学习项目大部分时间都花在特征工程上面,这句话说得很对。根据我的经验,70%的时间做特征工程,20% 用于想出如何评估算法,只有 10% 花在选择算法和微调上面。

那么,如何做出一个好的特征来呢?一条经验是尽量设计特征,当某一类值上升时,整个字段的值也上升。不过,通常来说不会发生单一的一个数据变化就导致学习的容易程度大增。但一般你总有可做的事情。机器学习厉害之处在于,当你了解你手头的数据,当人和机器顺利合作时——人利用知识找出相关的特征,机器则发挥它擅于优化的特长。

数据多胜过算法好

数据是王道。不只是 Domingos 这么说;越来越多的证据表明,解决很多问题时,一个简单的机器学习算法加上庞大的数据量能够胜过一个强大的分类器。

很大部分原因是由于,一定你确定好了输入字段,能够做的分析就非常有限了。学习模型的计算机算法能够做的事情不多,大多数相差并不巨大。因此,算法跟算法之间的性能差距通常并不明显。所以,如果你要好的分类器,你应该把时间花在:①特征工程,②找到更多高质量的数据。

学很多模型,别只学一个

在这一节,Domingos 讨论了模型集成的力量。一般来说,在不同的随机数据集上学习多个分类器能够建立更强大的模型。这种做法的坏处是会丢失一部分可解释性;比起单一的一组问答序列,现在每个模型都有一个序列,最终投票的模型也有一个序列。不过,若是你的应用非常注重性能,丢失部分可解释性是值得的。

简单不一定意味着准确

著名的奥坎姆剃刀原理说:若无必要,勿增实体。如果你想不起来昨天晚上做了什么,一个解释是你被外星人绑架了,它们还在你脑子里植入了芯片,另一个解释是你喝醉了。由于后者更加简单,因此我们选择相信后者。

机器学习也一样,要是有两个模型都很好地匹配数据,那么一般会选择更加简单的那个。经验告诉我们,更加简单的那个模型由于参数少,在样本数据以外的训练也会更好,也即过拟合的可能性低。

但这一原则并非任何情况下都适用。很多时候,额外的复杂度会对性能有好处。此外,要说是复杂程度导致了过拟合是不准确的。因此,你可以因为简单模型规模更小、更容易解释、适合度更高而选择它,而不是因为它性能好;判断模型是否好用的唯一标准是做测试检测它。

可表示并不意味着可学习

算法有可能在你数据的基础上建立一个好的模型,然而建立一个好的模型可能需要更多的数据,或者算法根本找不到好的模型——存在好的模型并不意味着算法能够找到这个好的模型。

这是另一个做特征工程的好理由:如果算法找不到好的模型,但你确信好的模型是存在的,那么你做特征工程,会让这个好的模型更容易被算法找到。

相关不等于因果

由于常被提起,相关不等于因果似乎已不值得赘述,但 Domingos 还是花了一节讨论它,可见其重要性。在解释模型时,不能因为 A 表明 B 就认定 A 导致 B,这一点要尤其当心。

结论

机器学习是十分强大的工具,因此误用的后果也很严重。因此,有必要了解机器学习的原理及其可能存在的陷阱。如果你觉得有找到了一个好的模型,首先尽全力找出可能的漏洞来,尤其注意过拟合或特征太多。要是模型表现不如意,也别灰心!特征工程加上大数据,通往成功的道路比你想的更近。