开发者如何掌握机器学习?传统方法可能都走了弯路【转载】

来源: machinelearningmastery

作者: 

译者胡祥杰、张冬君

这篇文章要回答的问题是“我该如何开始机器学习”?

“我是一个开发者。我读了一些关于机器学习的文章和书,也在Coursera上学习了机器学习课程。但我仍不知道如何开始……”

这听起来是不是很熟悉?开发者给我的来信中,问得最多的问题就是“我要怎样开始机器学习?”

本文中,我会尽可能地把我好的思考都呈现出来。

  • 你会发现,为什么传统上学习机器学习的方法对你来说并不适用。

  • 你会了解到如何翻转整个模型。

  • 你会学习到简单但是有效的矫正方法,你可以用于开始机器学习。

一个对机器学习感兴趣的开发者

假如你是一名开发者,并且对进入机器学习领域非常感兴趣,为什么不呢?机器学习是当下热门话题,有着强劲吸引力和快速增长潜力。

你肯定已经看过一些博客了,并且也在尝试走得更远,但是厚厚的书又让你望而生畏,那些书,有一些是聚焦数学的、有一些是聚焦理论的、还有一些是聚焦算法的。

你也尝试了一些线上视频课程。在大家最为熟知的网站Coursera上学习斯坦福机器学习线上课程。但是,这并不比图书和博客文章要好多少。因为你看不到为什么会出错,为什么会把这些东西推荐给初学者。

你甚至可能还尝试了一些小型的数据库,或者是参加了一个入门级的Kaggle竞赛。

问题是,你不能把这些从书或线上课程中学到的理论、算法和数学与实际问题联系起来。

这是一个巨大的鸿沟。

机器学习的3个应用场景

展望未来,一旦你掌握了对机器学习独特的理解,你的工作会变成什么样?你要如何在日常的工作中使用新学到的机器学习技能?

场景1:一次性模型

你的老板走过来说:“你知道机器学习对吧?你能用去年的客户数据来预测目前我们销售渠道客户转化率是多少吗?我希望在下周的董事会报告中使用这一数据……”

我把这叫做一次性模型。要解决的问题是由老板严格定义的,他给了你一些小型数据,这些数据甚至在Excel中就能得到很好的处理。但是他希望有更准确和可信的预测。

你可以用机器学习来完成,并且,更重要的是,你能够解释结果中所有现象。

 

场景2:嵌入模型

你和团队正在就一个软件项目收集董事会的要求。其中一个是,软件要支持用户的手写输入。你会很快发现,最好(也能也是唯一可行)的方法是设计并训练一个预测模型,然后嵌入到你的软件产品中。

我把这叫做嵌入模型,里面有许多变量,比如,模型是静态的还是迭代的,是局部的还是通过API远程调用的,但这些都只是细节问题。

在这一场景中,关键的是,你要有发现问题的经验,这些经验使用预测模型可以得到最好的解决,并且,你需要有制造、训练和部署模型的能力。

场景3:深度模型

你开始了一份新工作,并且,你在开发的系统至少由一个预测模型组成。维护系统或者再增加新特征都需要对模型、输入和输出有一个很好的理解。模型准确度是软件产品的一个特征,而你一部分工作就是提升准确度。

比如,作为预发布测试系统的一部分,你必须证明,模型的精确度(用过往的数据来验证)比之前的模型更好。

我把这称为深度模型。人们会希望你建立用于特定某个领域预测的模型,你的日常工作就是使用自己的经验和技巧来提升和证明其准确性。

这些场景让你可以简单地了解,作为机器学习的开发者你需要面对的是什么。这些都是我自己亲身经历过的。

所有的这三个场景清楚地说明了一件事:虽然机器学习是一个很吸引人的领域,对于一个开发者来说,机器学习算法依然是另一个魔术袋,和多线程或者3D图像编程一样。虽然如此,对一系列经典问题来说,确实也存在一些强大的方法,这些方法都是绝对必要的。

对于“我该如何开始”的传统回答

那么,究竟要怎么开始机器学习?

如果你打开一本关于机器学习的书来为这一问题寻找答案,你会震惊的。书里一般都是从定义开始,然后再用前所未有的复杂性来对相关概念和算法进行描述。

定义和数学概念是清晰、简洁和明确的。问题是,你需要先学会那些枯燥的数学知识来进行理解。有一个理由可以解释为什么机器学习在大学中一半都是研究生课程,因为其中包含的“基本原则”要花费几年学习才能掌握。

比如,你需要在这些方面有好基础:

  • 统计

  • 概率

  • 线性代数

  • 多变量统计

  • 微积分

如果你对一些非主流的算法很感兴趣的话,还会更加复杂。

线上课程,比如MOOC和Youtube上的一些视频,都在模仿大学里的授课方式。如果你自身有一些背景,这些方法确实都还不错。但是没有的话,这些其实帮不上忙。

如果你在问答网站,比如Quaro、StackExchange或者Reddit 提问怎么开始机器学习,你可能会得到相同的回应。通常,这样的答案都是来自那些同样迷茫的人。

难怪,有一些诚实而又勤奋的开发者在思考如何做时,会认为在真正能够“做”机器学习之前,自己需要重新回到学校,拿一个硕士或者博士学位。

传统的学习方法“错得离谱”

花几秒的时间来思考一下传统的教授机器学习的方法,它是严密且系统性的,表面看起来也是正确的。它怎么会错?

基本的编程(或者,如何扼杀编程初学者)

试想,你是一个年轻的开发者,已经学习了各种各样的编程语言,现在开始学习如何独自开发一个软件。你也对家人和朋友说,自己想要从事每天编程的工作。他们会告诉你,要拿到一份程序员的工作,你首先要有计算机科学的文凭。

于是,你进入了计算机科学系。一个又一个学期过后,你见到了越来越多的难懂的代数、计算和离散数学。你使用的是陈旧的编程语言。于是你对编程的热情开始褪减,对开发软件的信心开始动摇。

也许你也会走到另一个极端。回忆过往,你发现自己并没有学到任何实践、语言、工具等等用于开发软件的技术。

看到教授机器学习的缺陷了吧?

有幸的是,编程出现的时间已经很久了,足够流行,也足够重要,能对经济产生影响,我们还是发现了一些别的方法,能让具有潜力的年轻(或者老的)程序员能学到他们真正需要的技能,比如,要开发一个程序,初学者在计算机或者计算机复杂性等相关理论中埋头苦读是没有用的,甚至深入地学习算法和数据结构的细节,也是没有用的。一些有用的材料(来自算法复杂性和数据科学)会在后来自然出现。也许,会随着聚焦的材料一并出现。

可喜的是,我们有专门的软件工程学位,还有一些类似Codecademy的资源,在上面,你可以通过自己动手编程来学习。

如果一个开发者想要“做”机器学习,他应该花上好几年的还是件,和上万美元来学习数学知识,并获得更好的学位吗?

答案当然是不需要!这里有更好的方法。

更好的途径

在计算机科学中,你不能仅仅是反转一下模型,然后从头到尾学一遍相同的材料就可以了。我的理由是,正如计算机科学课程从未真正覆盖那些涉及实际开发软件中难题的主题医院,机器学习课程和图书也差得很远。他们到算法就停止了。

你需要一个自上而下的方法来学习机器学习。在这一方法中,你关注的是自己需要的结果:从端对端的方式来用解决机器学习难题,使用最新的的或者最佳组合的工具。

我认为,你成功的道路应该是这样的:

 

1.用一个系统性的处理流程获得可重复的结果

一旦你了解了一些工具,用一个机器学习算法来处理问题相对来说就会容易很多。

你怎么知道自己已经完成了?你怎么知道结果是好是坏?你怎么知道根据数据库得出的结果是可信的。

在处理一个机器学习难题时,你需要有系统意识。这是一个项目,和软件项目一样,好的处理过程可以获得高质量的结果,并且在不同的项目中重复实现。

策划这样一个处理过程,你需要想清楚一些必要条件,比如:

一个处理过程要能从端到端、从问题种类到呈现再到部署的结果上对你提供指导。和软件项目一样,你可能会认为自己已经做完了,但事实上还没有。从一开始就把对终端的可转化性记在心里,这能为你的项目设置一个清晰的终止条件和聚焦点。

  • 一个处理流程应该是一步接着一步的,这样你就能时刻知道接下来该怎么做。不知道接下来要干什么,这是项目的一大杀手。

  • 一个处理流程应该保证有“好”的结果,例如,要好于平均水平,或者足够好到项目的需要。对于项目来说,需要好的结果,以产生可信的信心水平,但是不一定是要做到最好的准确率。

  • 处理器对于特定的工具、编程语言和流行算法来说应该是不变的。工具会不断变化,处理过程必须要具有可适应性。考虑到领域内大家对算法的痴迷,高校肯定会不断有新的和强大的算法流出。

现在有一些很棒的处理平台,包括一些很旧的,你都可以根据自己的需要使用。

比如:

  • KDD

  • CRISP-DM

  • OSEMN

  • 其他

 

2.在你的处理器中构建最佳组合工具

机器学习工具和数据库有很多,但是,从任何一个角度来看,最后,你都要使用一些东西来最好地呈现你选择的处理器所产出的成果。

你不会希望去测量或者选择任何旧的算法或者数据库,你想要的是所谓的“最佳组合”,能够给你最快、最可靠和最高质量的结果,并且根据你能够提供的处理器,来最大程度地实现自动化。

再次提醒,你将要自己做出这些选择。如果你去问别人,你得到的答案会是带有个人偏见的, 通常是他们最近在使用的那些。

我有自己的偏见,根据不同类型的工作,我喜欢使用不同的工具和平台。比如,根据上文列出的3个场景,我会建议一下的工具组合:

  • 一次性预测模型(One-off predictive model):  Weka platform, 因为我能上传一个CSV,设计一个实验,并且在一行代码都不需要的情况下随时获得最佳的模型。see my mapping onto the process).

  • 嵌入式预测模型(Embedded predictive model): Python 数据库 scikit-learn, 因为我可以在同一种语言中开发模型。 IPython 是向更大的团队展现你的pipeline和结果的一个很好的方法。对于更大的数据, A MLaaS 也是一个很好的选择。

  • Deep-dive model: Deep-dive model:R语言和Caret工具包,因为我可以迅速并且自动地尝试大量的最新模型,建造出更加详细的特征选择、特征变成和算法,并在整个R平台上调试算法。

实际上,在这三个场景中的三个工具组合要取决于实际情况。

和开发一样,你需要研究自己的工具,来最大化的使用他们。你也需要保持对外界的关注,随时选择更新更好的工具,在你的重复性处理过程中采纳。

3.用半正式的产品进行目标实践

通过实践,你的开发能力会得到提高。使用这些熟悉的方法,让你自己在机器学习上变得擅长。在每一个项目中你实践的流程越多,你就会变得越好(最完美的难题是端到端的)。

谨慎选择你的实践数据库

你希望得到的数据库是真实的而非虚构的。在不同的复杂层级上,都有几百个免费的数据库。

  • 我的建议是,从小型的内存数据库起步,比如 UCI的 机器学习数据库。它们都是很知名的,相对来说数据也比较干净。

  • 然后,我会推荐一下稍大的内存数数据库,比如Kaggle 和 KDD 比赛中使用的那些。这些数据更加干净,并且需要你有更多处理能力。

坚持使用列表数据,这也是我对我的所有学生的建议

使用图像和文本数据是新的不同领域(分别对应计算机视觉和自然语言处理),这会要求你学会特定的方法和工具。如果这些类型的问题是你希望或者需要处理的,那么你最好从这开始,也有很多很好的资源可用。

记录自己的结果,并且建立一个公共的合作工作流

创造和保存每一个项目中半正式的成果(我把成果称为“产品”)。我的意思是,在单独的文件中写下你都做了什么,学到了什么,这样以后你就能回顾,并且在未来的项目中使用这些成果。作为开发者,应该有一种从每一个编程项目中进行学习的习惯,重新使用此前项目的代码和创意。这会让你的学习过程加速很多。我强力推荐。

任何的草稿、代码和生成图像都要保存,但是,写下你的发现也同样重要。要习惯对自己的代码进行评价。

在公开的社区(比如,GitHub)上保存每一个项目,这样其他的初学者能跟你学习,并扩展你的工作。把项目和你的博客链接起来,向公众展示你能力的增长。在真正在乎技术的公司,你在Github上的表现已经成为一个重要的录用标准。

是的,这一方法是专为开发者量身打造的

以上所说的是一个开发者在机器学习领起步和进步过程中可以借鉴的学习方法。你可能会怀疑这些方法对你自己是否适用,让我来解答你的困扰。

你不需要写代码

 你或许是一名网页开发者,所以并不需要写很多的代码。你可以使用这一方法来开始应用机器学习。Weka这类的工具让设计机器学习试验变得更加容易,也可以让你在不做任何编程的情况下进行机器学习。写代码能够解锁不同的工具和能力,但这不是必须的,也不是先决条件。

你不需要擅长数学

和开发者一样,你也不需要知道任何关于计算或者“大O符号”的知识,来写代码或者创造出有用可信的软件。在没有统计学、概率学、线性代数知识背景的情况下,你也可以端到端地解决机器学习难题。

重要的是,我们虽然不是从理论开始的,但是我们不能忽略它。要根据需要,在方法或者算法中使用数学知识。事实上,你是不能退却的。原因是,处理机器学习难题是非常令人沉迷的。在追求更好的结果和更加精确的预测上,你会想尽办法获得自己能找到的任何资源,用自己的智慧去解决问题。

如果你的目标是掌握理论,这一办法就会变得很慢,很低效的。

你不需要更高的学位

这种知识没有什么控制者。资源都是开放的,你甚至都可以自学。你并不需要把太多的时间和金钱花费在获得更高的文凭上。

 你并不需要大数据

机器学习算法的开发和理解都是基于少量数据的。需要的数据很少,你可以在 Excel中查看,加载到内存,并通过桌面工作站运行。

大数据不等于机器学习。你可以使用大数据建立预测模型,但这只是你的技能在一个领域的特殊体现。我通常建议我的学生在学习机器学习时,先从与内存小的数据集开始。

如果大数据机器学习是你想工作的领域,那你就从那里开始。

你并不需要一台桌面超级计算机

的确,一些最先进的算法,如深度学习,需要非常强大的多核GPU。它们是强大的、令人兴奋的算法。但是它们也会解决较小的问题,你可以用自己的桌面CPU来解决同样的问题。

你不需要为了等一台运行超快的计算机而推迟学习机器学习。

在你买桌面超级计算机或者租用非常大的EC2实例之前,花一些时间学习如何利用更小、更好理解的数据集来充分运行这些算法是很值得的。

 

你并不需要大量的时间

我们都有的生活都很忙碌,但如果你真的想要做成某件事的话,你的确需要多花时间。我之前说过,研究机器学习的问题是会上瘾的。如果你加入了机器学习竞赛,你会很乐意牺牲一个月晚上看电视的时间来提高你算法的运行表现。

话虽这么说,如果开始时你有明确的流程和同类中最佳的工具,你可以在一两个小时内从头至尾地运行一个数据集,也可能是要一两个晚上。你在已经完成的几个机器学习项目中表现很好,那你就可以开始着手更大、更有趣的问题。

在看板图上把它分解成数个小型任务,制定开始时间。

开发者犯的最大的错误是什么,以及如何避免这些错误?

自我建立Machine Learning Mastery课程后,这两年来,我已经就此给出许多建议。在这段时间里,我已经发现5个常见的陷阱,希望你们能避免。

1. 不采取行动:问题都清楚地摆在眼前了,可是有太多开发者不采取行动。看电视或者读新闻的确要比培养一项有价值的新技能要简单得多。毕竟把马带到河边容易,逼它饮水就困难了。

2. 选的任务太难:我经常看到,开发员选择的第一个或第二个数据集都太难了。他们选的数据集太大、太复杂,他们还没有做好应对挑战的准备。可怕的是,“失败”会扼杀动力,开发员会在过程中就失败。挑几个你能在60分钟内完成的小任务。这样做一段时间,然后再着手大一点的任务。

3. 从头开始实现算法:我们已经做完算法实现了,至少对你来说,未来几年有趣的事情都做完了。如果你的目标是学习如何开发和提供可靠、准确的预测模型,那你就不用从头开始花时间实现算法,使用一个库。相反,如果你想把重点放在实现算法上,那确定你的目标并专注于它。

4. 整个过程不够坚持:比如说敏捷软件开发,如果你从过程中偏离,你的项目结果往往是混乱的。在整个过程中都要坚持下去,这是解决问题的关键。你可以重新关注你在过程中发现的有趣部分,将其作为后续的一个小项目,但是你必须要完成整个进程并发布你的成果。

5. 不使用资源:现在关于机器学习有很多论文、书籍和博客。你可以利用这些资源来改善你的流程,更好地使用工具,提升结果的准确性。使用第三方资源,你能从自己的算法和数据集里得到更多的信息。你能获得关于算法和问题框架的想法。一点智慧能改变你的项目的进程。记住,如果你采取的是一种自上而下的过程,那么理论只有在后期才起作用。花点时间去了解你的最终模型吧。

你的下一步

我们已经介绍了很多,我希望我能使你相信自己可以开始改变,并在机器学习上取得进步。你是能够在未来成为一名具有机器学习技术的开发者。你接下来要做的是:

    • 选择一个进程(或只用这一个)

    • 选择一个工具或平台(或只用这一个)

    • 选择你的第一个数据集(或只用这一个)

      原链接:http://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=2651986001&idx=2&sn=73d592e2678c5353ff6b8b9dc3c72488&scene=0#rd

原文地址:https://www.cnblogs.com/1394htw/p/5834064.html