1. 首页
  2. 数据分析

数据科学教材没有教给你的三件事

有问题直接微信我吧!

大家好,PPV课大数据微信开通了人工客服,大家有问题可以在工作时间:9:00-18:00直接通过微信与客服联系!

如果你还没有听说的话,那么我告诉你,数据科学简直太疯狂了。相关的课程、帖子、培训都如雨后春笋般出现。但是,每次我看到这些资料的时候,我发现人们把过多的注意力放在了具体的学习算法上。诚然,理解逻辑回归(logistic regression)或者深度学习(deep learning)的原理是很了不起的,但是一旦你开始与数据打起交道,你会发现除了算法之外,还有很多事情同样、甚至更为重要。

我当然不是怪罪这些课程。我已经在大学里讲授机器学习很多年了,并且我的课一直着重讲解具体的算法。你理应透彻地学习并理解支持向量机(support vector machine)、高斯混合模型(Gaussian mixture models)、k均值聚类(k-Means clustering)等等具体的方法,但只有当你动笔写你的硕士论文的时候,你才能学会如何正确地处理数据。

那么,什么才是“正确地”?结果都正确了,过程能错得离谱吗?只要得到好的预测效果不就万事大吉了吗?这固然没错,但关键在于你所得到的不错的效果是基于未来数据的。正如我在其它地方提到过的,当你看的是基于训练数据得到的结果时,你是无法骗自己相信你的方法是可行的。这个道理再简单不过。

这里,我来告诉你三条你在教科书里通常找不到的见解。

1、关键在于测试结果的评估

数据分析也好,机器学习也好,数据科学也好,(或者随你怎么叫),其主要目的都是建立一个可以应对未来数据的系统。这个其实难以一下子说清楚,因为有监督学习(比如分类器)和无监督学习(如聚类)毕竟有所不同。但在任何情况下,你都能够在收集来的数据集上构建和设计你要用到的方法。但到头来,你还是要把你的方法应用在未来数据上,并且你也要确定你的方法可行,可以得到与你起初所用的数据集所得到的一样的结果。

新手常常在看到现有数据得到的结果不错,就错误地设想未来数据得到的结果也一定不错。但事实往往不是这样的。现在我们以有监督学习(即基于你的输入值预测相应的输出值)举例,比如将邮件分为垃圾邮件和非垃圾邮件。

如果你只考虑训练数据,那么机器可以非常容易地得到完美的预测结果,因为只要把数据全部记下了就行了(除非数据本身是自相矛盾的)。事实上,哪怕是人类也常常做这样的事。想一想,你在背一组单词的时候,你是不是必须打乱这些单词的顺序才能测试出你到底掌握这些单词了没有?否则的话,你的大脑可能只是记住了这些单词的顺序。

机器凭借其强大的存储和检索海量数据的能力能够轻易地犯同样的错误。这样的错误会导致过拟合(overfitting),使得模型缺乏泛化能力(generalization)。

所以正确的评估结果的方法就是通过把数据集切分成训练集和测试集来模拟未来数据得到的效果。一般而言,训练集的数据量要相对大些,而且这个切分数据集的步骤要迭代几次后才能判断这个方法够不够稳定。这个步骤被称为交叉验证(cross-validation)。

数据科学教材没有教给你的三件事

为了模拟未来数据的效果,你要把现有的数据集切分成两部分,一部分作训练集,另一部分作测试集来评估模型的效果。

然而,还是有很多情况会出错,特别是当数据是非平稳的时候。也就是说,数据的分布随着时间的变化而变化。现实生活中,很多领域的数据都有这个特点,比如一月份和六月份的销售数据总是差别很大。

也有可能是数据点之间存在相关性,也就是说如果你知道了某个数据点,你就会知道很多关于其它数据点的事情。比如你看股票价格,如果每天的价格都变动不大,那么拆分后训练集和测试集的数据也会高度相关。

这种情况发生的话,你会得到非常、甚至过于乐观的结果,但真的带入未来数据的话,你的模型和方法就不能奏效了。最坏的结果是,你好不容易说服别人去尝试你的方法的时候,它就失效了。所以学会如何正确地评估测试结果非常重要!

2、全看特征提取的了

学习一个新的方法令人兴奋,但事实是对于同样的数据,那些最复杂的模型运行出来的结果其实也差不多,而真正产生不同之处的就在于你是如何将原始数据转变为可供学习的特征(features)。

很多新的机器学习方法都很强大,可以轻松搞定成千上万个特征和几十万个数据点,但事实是,归根结底,这些方法都很愚笨,特别是那些线性模型(比如逻辑回归、线性支持向量机)其实和你手中的计算器一样愚笨。

这些模型和方法能够在数据充足的情况下识别出有用的特征,但如果没有得到足够的信息,或者无法以线性组合的形式把这些有用的特征表达出来,模型本身的作用其实非常有限。这些方法也同样无法对数据产生“洞察力”而简化数据。

换一种说法就是,只有你才能通过找到合适的特征而简化数据,而模型不能。假想你把所有有用的特征都剔除了,还能剩下什么呢,对吧?这就是特征提取(feature extraction)的强大之处!

这意味着两件事:第一,你应当确保掌握至少一种同类型的方法,然后就坚持用这个好了。所有你不需要逻辑回归和线性支持向量机等等线性模型全部掌握,你只需要选择其中一个即可。当然这也表示你需要了解哪些方法是同类型的,以及模型有哪些关键点是需要注意的。深度学习的模型有时会不一样,但就解释力而言,线性模型几乎都差不多。虽然模型的训练时间,稀疏解的问题等可能会有不同,但大多数情况下,你都会得到相同的预测效果。

第二,你需要学习关于特征工程(feature engineering)的一切。遗憾的是,特征工程更像一门手艺,而且几乎没有一本教科书涵盖这项内容,因为目前还鲜有关于特征工程的理论问世。特征工程的规范化还有很长一段征程。有时候要对特征取对数。有时候要对特征减少一些自由度,也就是规避那些对预测无关紧要的数据给模型造成的影响,届时你将明显降低了你需要训练的数据量。

有时候特征工程很容易,该对数据做怎样处理或变换一目了然。比如你在做手写字符识别,很明显,只要你有背景色和前景色,字符的颜色根本无关紧要。

我知道很多教科书常常喜欢兜售那些复杂的方法,好像强大到只要你把数据丢进去,剩下的就可以交给它们了。从一个纯理论的视角来看,如果有无穷多的数据,那么这样的说法确有可能成立。但现实中,数据和时间都是有限的,所以找到有信息量的特征极其重要。

3、筛选模型才会占用你大多数时间,而不是运行数据集

其实大多数的数据集都不会溢出主内存的空间,虽然在“大数据”时代,人们不太情愿大声地承认这一点。你的模型和方法也应该不会占用你太多的时间去运行数据。但你必将花费大量的时间从原始数据中提取特征然后进行交叉验证,并对比分析不同的特征和参数所得到的结果。

为了模型筛选,你要带入同样一批数据,计算和对比大量不同的参数组合所得到的结果。

这样做的问题就是这些特征和参数可能形成的组合数量会非常之大。假如说现在你只有两个参数,并且你需要一分钟时间去训练你的模型并评估结果(就像上文中所说的那样)。如果每个参数有五个备选值,你需要做一个5段(5-fold)交叉验证,也就是把数据集分为五个部分,每个部分轮流作为测试集进行验证,共循环五次。这意味着你需要运行125次才能找到最优的模型,也同时意味着你要花费的不是一分钟,而是两个小时。

好消息是这个问题很容易并行处理,因为不同的指令之间完全独立。特征提取也一样,你可以把相同的运算(解析、提取、变换等)应用于不同的数据集之上,这被称为“尴尬并行(embarrassingly parallel)”(是的,这是个并行计算的术语)。

坏消息主要是针对大数据玩家们。因为这意味着我们很少需要那些复杂方法的扩展式应用,在绝大多数情况下,在内存中并行运行非分布式的算法就已经足够了。

当然,有一些应用确实需要特殊对待,比如利用TB级的用户登录数据做广告投放的优化,或是面向几百万用户的个性化推荐等等。但上文所描述的还是针对大多数人而言的、最基本的机器学习应用。

最后,拥有很多数据也不意味着你就真的需要那么多数据。你更要关注的是你研究的问题本身的复杂度。如果一个简单的模型就可解决,你大可不必用那么多数据去训练过多的参数。选取数据中的一个子集也不失为一个好办法。还有就是我上文中说的,有时候,正确的特征表达能大大降低你所需的数据量。

总结

总而言之,明白如何正确的评估测试结果能够降低你的模型风险。恰当的特征提取也许是能让你得到满意结果的最有效的方法。最后就是,不必过于迷恋“大数据”,虽然分布式计算能帮你降低训练时间。

原文作者:Mikio L. Braun

原文链接:http://blog.mikiobraun.de/2015/03/three-things-about-data-science.html

翻译:郭小贤 (微博@郭小贤,知乎ID:郭小贤)PPV课原创翻译文章,禁止转载,转载请与PPV课QQ:800098648 或者作者的授权。

投稿须知

①稿件可以是原创文章、原创翻译文章等等,优秀的原创文章可以申请PPV课博客专栏,获得相应稿酬。

②凡是投稿的学员均可获得PPV课社区积分奖励3000积分,用于下载其他资料。

欢迎大家积极投稿,投稿请联系PPV课编辑 lily QQ:2941275750

大家好,PPV课大数据微信开通了人工客服,大家有问题可以在工作时间:9:00-18:00直接通过微信与客服联系!

原文始发于微信公众号(PPV课数据科学社区):数据科学教材没有教给你的三件事

原创文章,作者:ppvke,如若转载,请注明出处:http://www.ppvke.com/archives/19698

联系我们

4000-51-9191

在线咨询:点击这里给我发消息

工作时间:周一至周五,9:30-18:30,节假日休息