摘要: 一份机器学习过来人的经验清单分享,主要是包含一些关于构建机器学习工做流以及Apache Spark应该注意的一些事项,但愿这个清单可以帮助那些正在学习机器学习的相关人员少走一些弯路,节约一些时间。算法
当咱们学习任何一个新的内容或遇到新的事情时,随着时间的推移,可能回过头来会发现,当时要是怎样结果又会怎样。身边不少人包括我本身在读完大学后,发现若是高中再努力一些或从新把大学时间利用好,人生的路途是否是能更顺利些……曾经听一位老师说过“青春就像这样,无论你怎样过都会过得一团糟”。事实上,大多数学生没有利用好时间是因为没有明确的方向。同理,对于新入职的员工而言,有一个师父在平时的工做中以他过来人的经验引导一下,新员工的发展也会更顺利些。那么对于学习机器学习而言,这里有一份过来人的经验分享清单,但愿这个清单可以帮助那些正在学习机器学习的相关人员少走一些弯路,节约一些时间。数据库
这份清单主要是包含一些关于构建机器学习工做流以及Apache Spark相关的具体内容。编程
预测是困难的json
对于任何未知的事情,很难对其作出一个准确的时间预测,但咱们会朝着目标前进。然而随着时间的推移,在努力的过程当中逐渐会出现错误,这是因为咱们没法预测采用哪一种方法就可以得出好的结果,可以作的只有确保项目组能够快速地迭代更新。网络
项目有很大的未知数,请确保团队可以进行快速迭代更新框架
在开始以前验证数据是否完整机器学习
当开始使用机器学习管道时,咱们已经收集了大约3年时间的原始数据。但没有对原始数据作任何处理,只是将其存储以防万一。原始数据采用CSV文件形式,此时没有注意到这些数据存在问题,另外编写这些文件的代码会随着时间的推移而致使一些错误。所以在构建机器学习管道的同时,还须要修复形成错误的数据问题,最终在Apache Spark中编写相关的代码来清理历史数据。在进行到中间时刻才发现问题,而不是在最初,这无疑增长了项目的难度。分布式
**在开展工做以前,请确保数据正确工具
对数据进行一次预处理,对构建模型进行一百万次训练学习
在最初训练机器学习模型时,咱们尝试加载全部的数据。而采用的数据大小是TB级别,若是每次训练都加载全部数据会致使训练速度很慢。所以,每次训练时不须要加载全部的数据,能够对其作一些预处理,建立一个新的小数据集。此外,并无删掉原始数据集,将其做为备份以防后续过程当中出现新的错误。
不要将ETL和模型训练混淆。若是你正在训练1000个模型且不想执行1000次预处理,能够只作一次预处理并保存,而后将其用于全部的模型训练需求。
为不一样的团队成员提供轻易的访问途径
在上文说过,咱们将原始数据存储在AWS S3中备份。当开始使用机器学习开展工做时,发现为每一个人提供轻松地访问途径显得相当重要。只给予读取权限是不够的,科研人员不会经过笔记本下载TB级的数据,且不会随身携带笔记本电脑来处理TB级的数据,这只会浪费每一个人的时间。咱们发现使用支持像Apache Spark这样环境的Notebook能够达到这个目的,好比Jupyter、zeepelin等,读者能够根据本身的平台选择合适的Notebook。
为小组人员提供访问TB级数据的途径,此外必须提供合适的工具使其可以从中很好的理解这些数据,好比Jupyter、zeppelin等这些基于spark集群的Notebook。
对于大数据而言,监控是必须的
当处理大数据时,传统的软件工程方法是不起做用的。通常的程序可能花费几分钟就能够运行完毕,但大数据可能须要几小时到几天的时间。与传统软件编程相比,如何在大数据状况下减小批量处理做业的完成时间这一问题更为复杂。使用云计算能够水平下降机器要求以及缩短运行时间。可是,咱们应该增长机器的数量仍是彻底改变机器的类型?分布式环境中的瓶颈在哪里?等等这些问题都是减小执行时间时须要解决的问题。
对于Apache Spark而言,很难弄清楚须要的机器类型。Amazon EMR带有Ganglia,这让咱们一眼就能够监视集群内存/CPU。但有时候也不得不去检查底层的EC2实例监测,由于Ganglia并不完美,将两者结合起来使用是很不错的方法。此外,与训练机器学习模型的做业相比,ETL做业具备不一样的执行配置文件。ETL占用了大量的网络和内存,机器学习须要更多的计算,能够为这两种类型的做业选择不一样的实例类型。
须要从CPU/内存/网络/IO监控方面优化成本,此外发现不一样的工做(ETL、机器学习)有不一样的机器要求。
在一开始就须要对机器学习预测进行基准测试
对机器学习模型的预测有没有延迟要求?若是有的话,在选择任何具体框架以前,请肯定该框架的训练模型是否能够知足你的延迟要求。对于基础模型而言,很容易就能掌握其中包含的数学基本理论,并理所固然的认为它会运行得很快。但事实证实,还有一些其它因素可能会致使预测的速度不如理论上预期的那样快。创建一个简单的模型并进行基准测试。若是在创建管道后才发现问题,这可能会浪费大量的时间。当发现Spark不能知足延迟要求时,可使用mleap库提高预测延迟。
若是有延迟需求,请从要使用的框架中制做出一个简单模型,精度、准确率或其它指标都可有可无,只须要以预测延迟为基准点。
不管AWS如何显示,S3都不是一个文件系统
使用AWS的GUI或CLI很容易忘记S3不是一个文件系统,S3是一个对象存储库,存储的对象是json、图片等内容。这个区别很重要,由于在S3中重命名内容并不像在真正的文件系统中那样快。若是在一个文件系统中移动一个对象,它可能会很快地移动,但这在S3中是没法实现的。为何这个显得很重要呢?由于当经过Apache将数据写入S3时,Apache Spark会产生临时文件,而后将其移动到新的秘钥中。基于以上缘由,Apache Spark有一个设置,能够告诉它不写入临时文件,而是写入最终输出。咱们使用了这种设置,在写入AWS s3上节约了大量的时间。
Apache Spark主要是基于Scala
若是使用的是Apache Spark,你应该知道它主要是基于Scala的。Java和Python等应用接口也能够工做,可是网上的例子大可能是基于Scala的。而咱们使用的是Java,这是因为以前的技术栈使用的是Java。在刚开始时,对于机器学习和Scala等方面都没有任何专业知识,咱们简单地认为机器学习对于项目而言相当重要,而Scala不是。所以,没法让团队像处理机器学习问题那样处理Scala曲线。将Scala翻译成Java并不难,但将Spark Scala翻译为Spark Java很困难,由于这些应用接口在Java中难以使用。
若是你不了解Scala而且还想使用 Spark Mllib,那么可能须要在选择语言方面考虑妥协。这种解决方案不是理想的工程解决方案,而是一个实用的解决方案。
知识分享对于团队合做而言很重要
若是将机器学习与现有系统集成在一块儿,那么将不得不与其余开发人员打交道。此外,还须要与业务、操做、营销等人员进行交流。可是这些人员中的大多数人不会对机器学习有很好的理解,所以他们须要这方面的知识,可是他们又不能坐下来学习机器学习相关课程。这个时候就应该作一些机器学习方面的知识分享,只须要解释一些涉及外行常见的术语便可,好比训练集/测试集/验证集、模型等,而没必要教他们相关算法等深奥的内容。
对于专业人员来讲,很容易忘记机器学习中充满了术语,虽然你可能彻底熟悉这些术语,但对于团队中的其余人而言,这些可能会是彻底陌生的词语,由于不是全部人都参加过机器学习课程。
对数据库构建版本控制多是一个好的想法
可能须要对数据库构建版本控制方案,而且能够在不从新部署整个软件的状况下切换不一样的模型训练代码以使用不一样的数据集。咱们建立了一些模型,并用一些数据对其进行了尝试,结果发现数据量不够,模型工做得不够好。所以,为数据库创建版本控制方案,以即可以在V1版本上训练模型并继续生成下一个版本。新版本中足够的数据后,就能够切换模型训练代码以使用新数据集。此外,还制做了一个UI界面,以便控制机器学习的参数、指定用于训练的数据量等。基本上能够经过UI能够轻松地配置一些参数,以确保对用于训练的数据进行更改时不须要从新部署相关参数。
文章标题《Things I wish we had known before we started our first Machine Learning project》,做者:Aseem Bansal
详细内容请查看原文