作者:Mikio Braun编译:ronghuaiyang
不知道你有没有有听说过,数据科学现在特别疯狂,课程,博客,培训机构,到处都是。每次我看到这些东西,我发现很多都是把重点放在几个特定的算法上。当然了,理解逻辑回归,深度学习是挺酷的,但是一旦你要开始真正使用实际数据做点东西了,你发现还有其他的重要的事情,甚至是更加重要。
我不会说这些课程不好,我在大学里教了很多年的机器学习,这些课程总是聚焦于几个特定的算法。你学习了支持向量机,高斯混合模型,k-means聚类,等等,但你在做研究所论文的时候,你学过如何正确的使用数据吗?
所以,“正确”到底是什么意思?不是用结果来评价方法么?不是只要我预测准确率高就完事了吗?这当然是对的,但是关键是,确保你是真的在特征数据上取得了很好的性能。就像我在别处写的一样,,当你看到训练数据上的结果的时候,很容易就会让自己上当,认为自己的方法很有效。
所以,这里有几个主要的想法,你在书里是很难找到的。
1、评估是关键
数据分析/机器学习/数据科学(或者你想叫什么都可以)的主要目的是构建一个系统,可以在未来的数据上表现的很好。因为监督学习和非监督学习的差别,很难说明白这是什么意思。但是任何情况下,你都会收集一个数据集,你基于这个数据集来设计你的方法。但是,最终你需要在未来的数据上应用你的方法,你想要这个方法给出的结果和你使用原始的数据集的到的结果类似。
初学者经常回犯一个错误,只看可用数据上的表现,假设在未来数据上也可以work。倒霉的是,这只是极少数情况。现在,我们只讨论监督学习,任务是基于你的输入预测一些输出,例如,分类垃圾邮件。
如果你只考虑训练数据,机器只要记住所有的东西,就可以得到完美的预测,这很容易。实际上,对人来说也比较常见。当你学外语,记单词的时候,你测试的时候,会把所有的单词打乱顺序,不然的话,你的大脑只是基于顺序记的单词。
机器有大量的存储能力,记住大量的数据是轻而易举的。这会导致过拟合,缺乏泛化性。
所以,正确的方法是,划分你的数据集,模拟你已经有了未来的数据,在一个部分训练,在另一个部分上预测。通常情况,训练集比较大,这个过程会重复几次,得到几个结果,看看我们的方法是否稳定。这个过程叫做交叉验证。
这样做了之后,还是会有问题,特别是数据是非静止的,也就是说,数据的潜在的分布是随时变化的,这在实际场景中是经常发生的,销售的数据一月和6月会有很大的不同。
或者,数据点之间会有很大的相关性,意味着如果你知道了一个数据点,那你也知道了许多其他的数据点。例如,如果你用股票的价格,通常相邻的两天不会跳动的非常厉害,所以在用天来随机分割训练集和测试集的时候,可能会导致训练数据集和测试数据集高度的相关。
但这些发生的时候,你会得到一个过于优化的数字,你的方法也不会在未来的数据中工作的很好。最坏的情况下,你终于说服人们去试试你的东西了,结果不工作了,所以说,学习如何正确的评估是关键!
2、全都在特征提取里了
学一个新的方法很激动,但是真相是,大部分的复杂的方法实际上表现都差不多,真正的区别在于原始数据是如何转变成特征用来学习的。
现在的学习方法非常的强,很容易就能处理成千上万个特征,成千上万个数据,但是到了最后,这些方法都傻眼了。特别是线性模型(比如逻辑回归,线性支持向量机),基本上就像你的计算器一样。
这些方法非常适合于处理带有明确信息的特征,使用足够的数据,但是如果没有足够的信息,或者是不能用输入特征的线性组合来表示,这些方法就无能为力了。
你可以很大程度的减小数据量,你需要找到正确的特征,假设说,如果你把所有的特征都去掉了,就没什么可学的了,是吗?这就是特征提取有多么强大!
这意味着两件事:第一,你应该确保你精通那些差不多的方法的其中一个,但是之后你可以一直用它。所以,你不需要逻辑回归和线性SVMs两个都会,你可以选一个。这还包括了理解哪些方法是差不多的,这些模型的关键点在哪里。深度学习有点不一样,但是线性模型大体是差不多的,但是训练时间,方案的稀疏性,等等,可能不一样,但是对于大多数的案例,应该可以得到差不多相同的预测。
第二,你需要学习所有的特征工程。不幸的是,这就是艺术,书里基本不会说,因为没有什么理论的东西。归一化非常有用。有时,特征需要取对数。有时候你可以排除某些自由度,也就是说,去掉数据可以变化的一种方式,这种变化和预测任务是无关的,你可以显著的降低训练时的数据量。
有时候发现这些变换很容易。例如,你在做手写字符识别,很显然,颜色没什么鸟用,你已经有了前景和背景。
我知道书上常常在描述方法的时候,会说的很厉害,你只要把数据丢进去,剩下的就给你做好了。从理论上说,使用无限多的数据是可以的,但是实际情况是,数据和时间都是有限的,找到有信息量的特征很显然是本质。
3、模型选择最花时间,而不是数据集大小
在大数据时代,这些东西不用太强调,大多数的数据集可以完全放到系统内存里。你的方法不会花很多时间去跑数据。但是你会花很多时间去做特征提取,跑交叉验证,对比不同的特征提取方案和参数。
对于模型选择,你遍历很多的参数组合,拷贝相同的数据,同时运行,评估一下结果。
这个问题就是组合的探索。比如,你只有两个参数,训练模型只要1分钟,然后在保留的数据集上评估性能。如果你对每个参数有5个候选值,你做一个5折交叉验证,折意味着你需要跑125次找到哪组参数最好,你需要等1个小时,而不是1分钟。
有个好消息就是并行化,由于训练时完全的不相干的,完全可以同时跑。
有个坏消息主要是针对做大数据的同学的,由于所有的这些意味着复杂对于可扩展性的实现的需求很少,在内存中并行运行非分布式算法在大多数情况下也是很有帮助的。
最后,有大量的数据并不意味着需要这么多数据,在于背后的学习问题的复杂性到底有多少。如果可以用一个简单的模型就搞定了,你就不需要这么多的数据。这样的话,随机选取一个数据子集就可以了。就像我上面说的,有时候,正确的特征表示可以大大帮助减少需要的数据数量。
总结
总结一下,知道如何正确的评估很有帮助,能够减少不能再未来数据使用的风险。正确的进行特征提取可能是最有效的。最后,并不是所有的时候都需要大数据,尽管分布式计算可以帮助我们减少训练时间。
英文原文:https://www.kdnuggets.com/2015/05/3-things-about-data-science.html
本文为专栏文章,来自:AI公园,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/66976.html 。