机器学习如何入门?

 

问题:我是一个开发者。我已经读过关于机器学习的相关书籍和一些文章。我也看过一些Coursera上的机器学习课...



问题:我是一个开发者。我已经读过关于机器学习的相关书籍和一些文章。我也看过一些Coursera上的机器学习课程。但是我仍然不知道如何开始…

这个问题大家听起来是不是很熟悉呢?

Frustrated with machine learning books andcourses?How do you getstarted in machine learning?
Photo by Peter Alfred Hess, somerights reserved
在本文中你会有如下收获:

  1. 你会发现为什么传统教学机器学习的方式对你不起作用。
  2. 你会发现如何拂去机器学习的面纱。
  3. 你也会发现你如何开始机器学习之旅的简单的但是非常有效的方法。
下面我们开始吧。

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

你是一个开发者,你对机器学习感兴趣,因为现在机器学习是一个热门的、迷人的、并且快速发展的领域。

你读了一些博客,你试着更深入的了解,但是你发现书本是晦涩难懂的。一大堆数学、一大堆理论、一大堆算法。

Sound familiar? Have you tried books, MOOCs,blog posts and still not know how to get started in machine learning?
你试了一些视频课程。你注册了Coursera上的机器学习课程。但是效果不比书籍和博客好多少。你不明白为什么大家都推荐初学者这样学习。

你可能已经尝试了一个小的数据集合,可能是Kaggle竞赛的初级水平。

问题出在你不能把从书本和课程中学到的理论、算法和数学与问题联系起来。

那么你应该如何开始机器学习之旅呢?

机器学习工程师

让我们往前想象一下,当你已经掌握了机器学习这门技术,你的工作将会是什么样的?你是如何在你的日常工作中使用新学到的机器学习技术的呢?

Do you want to transition from developer to a developer that can do machine learning?
场景1:一次性模型(one-offmodel

描述:你的老板走过来,对你说:“hey,你懂得机器学习,对吧?你可以使用去年的用户数据来预测在我们的销售渠道里哪些现在的用户有可能转换成我们的客户?我想在下周把这个结果汇报给董事会…”

我称这为一次性模型(one-offmodel)。

这个问题已经被老板很好的定义好了。他给了你数据,这些数据量比较小,如果需要的话,你可以用微软的Excel来查看和处理它。老板想要的是准确的和可信赖的预测,你可以在结果中给许相关的解释。

场景2:嵌入式模型(Theembedded model

描述:你和你的团队在收集一个软件项目的需求,其中有一个需求是这样的:用户可能在软件上徒手画一个形状,软件可以识别出这个形状是什么,并且把它转成一个清晰明确的版本并且适当的给予标注。

你很快明白解决这个问题的最好方法是设计和训练一个预测模型,并且把它嵌入到你的软件产品中。

我称这个模型为嵌入式模型。有一些变量是需要注意的,比如:这个模型是静态的还是更新的,这个模型是本地的还是需要通过API来远程调用的,但是这些都是细节问题了。

这个场景的关键所在是:你遇到了一个可以用预测模型解决的问题,以及你有能力设计、训练和部署它。

场景3:深层次模型(Thedeep model

描述:你工作的系统由至少一个预测模型组成。系统维护、系统特征的增加都需要对模型、输入以及输出的理解。模型准确性是软件产品的一个特征,而且你的部分工作是优化它。

比如,作为系统发行前测试工作的一部分,你必须证明现在模型的准确率和以前的版本相比要持平或者更高。

我称这样的模型为深层次模型(thedeep modle)。你工作的职责就是:构建一个深入理解的特定的预测模型,运用你的经验和技术来提高模型的准确率。

这些场景可以让你大概了解一个机器学习开发者的工作。这是真实的例子,因为这些例子都是基于我经历过的事情改编的。

通过这些场景可以清楚一件事情:尽管机器学习是一个迷人的领域,对于开发者来说,它仅仅是类似于多线程、3d图形编程的另一个工具。不过,机器学习对于某些特定类别的问题来说,它是一个强有力的解决方案。

如何入门机器学习的传统回答

       如果你打开一本关于机器学习的书来寻找这个问题的答案,你会很震惊的。需要先从定义开始、再进行概念的数学描述和逐渐复杂的算法。

The traditional answer to the question “how do I getstarted in machine learning” is bottom-up.
定义和数学描述都是清晰的、简洁的和无歧义的。但是它们是枯燥的,需要必要的数学背景才能理解。

在大学里为什么机器学习经常是做为一个研究生级别的课程进行教授的,是因为在教这个课程之前需要学习几年的基础课程。

比如,机器学习建议你有下面扎实的基础:

1. 统计学

2. 概率论

3. 线性代数

4. 多元统计

5. 微积分

如果你因为一些奇异有趣的算法而偏离正题,这会更糟糕。

这种自底向上的方法是很普遍的。

在线课程,MOOCS和YouTube上的视频都是模仿大学教授机器学习的方式。当然如果你有背景知识或者你已经在这上面花了大量的时间来学习了,那么这个非常好的。但是对于普通的开发者来说这是没有帮助的。

如果你到问答论坛比如:Quora、StackExchange或者Reddit上询问如何入门机器学习,你会得到同样的回答。经常这种回答来自于和你一样迷失的同类开发者中。

诚实的和努力的开发者就会想他们必须回到学校,在他们具备机器学习之前拿一个博士学位。

传统的方式是严重错误的!

这种自底向上的方式,看起来是严谨的、系统的,那么它为什么是错误的呢?

想象一下你是一个年轻的开发者。你想要开始学习如何开发一个独立的软件系统。你告诉你的朋友和家人,你想成为一名程序员,他们告诉你在得到一份程序员的工作之前你需要得到一个计算机科学的学位。

你开始学习计算机科学。一个学期一个学期你接触到越来越深奥的线性代数、微积分和具体数学。你使用过时的编程语言,你对编程的热情也在动摇。

The traditional approach to getting started in machine learning has a gap on the path to practitioner.
即使你走过去了,回首往事,你意识到你没有被教授现代软件开发实践、语言、工具或者任何你在创造和交付软件时可以用到的东西。

机器学习的教学同样如此。

幸运的是,编程已经出现很久了,我们可以找到其他的方式来教授程序员初学者在开发中需要的技能。

让初学者脑袋里装满计算理论或者计算复杂度或者更深奥的算法以及数据结构的细节是不明智的。这些有用的东西可以在后面再学习。可能是你用到了什么知识再学习,而不是把这些知识作为孤立的知识来学习。

幸运的是,你可以学习软件工程学位,也可以从codecademy这样的网上上学习编程。

所以,当一个开发者想要做机器学习的时候,他们没有必要花费大量的时间和金钱来学习数学或者获取更高的学位。我们有更好的方法。

更好的方法

       top-down的方法:使用现代的、最佳的工具和平台从端到端的解决真实的机器学习问题。

A better approach to learning machine learning that starts with working machine learning problems
end-to-end.


1.       使用系统的流程来实现结果的可重复性

当解决一个机器学习问题的时候,你需要是有系统的。好的系统流程可以得到一个高质量的结果,并且从一个项目到另一个项目都可以重复实现高质量的结果。

在考虑这个流程的时候,你可以考虑一下下面几点清晰的需求,比如:

(1)      一个流程可以从端到端、从问题的定义到结果的展现和部署指导你。

(2)      一个流程是从一个步骤到另一个步骤的,你可以从中知道下一步要做什么。

(3)      一个流程可以保证项目得到好的结果。项目需要通过已知的置信度可靠地交付好的结果。

(4)      一个流程相对于特定的工具、编程语言、流行的算法来说是不变的。一个好的流程必须适应变化的工具和编程语言等。


Select a systematic and repeatable process that you can use to deliver results consistently.
有许多优秀的流程,你可以参考使用。

比如:KDD,CRISP-DM,OSEMN等。

2.       给你的流程匹配上最佳的工具

从我的角度来看,对于不同的工作类型,我偏向于使用不同的工具和平台。

比如,对于上面提到的场景,我建议下面最佳的工具:

(1)      一次性预测模型(One-off predictive model):Weka平台,因为可以加载CSV,设计一个实验并且不用编一行代码就可快速得到最好的模型。

(2)      嵌入式模型(Embedded predictive model):scikit-learn,可以用模型部署到的系统使用的语言来开发模型。IPython可以展现你的工作流以及向团队展现结果。对于大数据来说MLaas是一个选择。

(3)      深层次模型(Deep-dive model):有caret package的R。因为使用R可以快速和自动地尝试最先进的模型,使用越来越精致的特征选择、特征工程、调参算法。

Map your preferred machine learning tools onto your chosen systematic process for working through 
problems.


像开发一样,你需要学习这些工具,你也需要保持对新技术和工具的了解,并在合适的时候使用新的工具。

3.       在半正式的产品上实践

你练习的越多,你就越擅长机器学习技术。

认真选择你的练习数据集

有数以百计的免费数据集供你选择。

(1)我建议开始的时候使用一些小的内存数据集合,比如:UCI Machine Learning Repository。

(2)接着,你可以选择大点的内存数据集合,比如:Kaggle 和KDD cup比赛中的数据集。

使用表格数据,这是我给学生的建议。

在计算机视觉和自然语言处理中要处理图片和文本数据,这需要学习特定的方法和工具。如果有这类问题你需要或者想要处理,那么也有很多这类的资源。

记录你的结果并且构建一个公开的工作资料集

记录你做过的和学到的东西到一个单独的文件中,可以使得在未来的项目中你可以参考之前的方法和结果。你可以为每一个编程项目保留一个目录,这样就可以重用以前项目的代码和想法。它会加速你的机器学习之旅,我强烈建议你这么做。

保留任何脚本、代码和生成的图形,同样,记录你的发现也是很重要的,它可以是一个简单的PPT、文本文件、一个会议中精致的展现、或是YouTube上的视频。



Work through and complete discrete projects,write up results and build a portfolio of projects.

把每一个项目保存在公共的版本控制库里(比如GitHub),这样其他的学习者可以从你的工作中学习或者扩展你的工作。可以在你的blog、LinkedIn或者其他地方链接你的项目,来展示你不断提高的技能和能力。

公共GitHub库里的作品集在注重技术和交付的公司面试中可以作为你的简历。

上面的方法就是为开发者量身定制的。

你可以采用上面的方法来进行机器学习的入门和提高。

你可能疑惑上面的方法是否真的适合你呢?让我来说一下你关心的事情。



It is so very easy to come up with excuses to not get started in machine learning.

你不需要写代码

像Weka这样的工具可以使你不用编码就可以很容易进行机器学习实验的设计,以及模型的构建。

写代码可以使用更多更复杂的工具,但是如果是刚开始的话,写代码是不被要求的。

你不需要擅长数学

就像开发者一样,不需要知道计算理论、计算复杂性这些东西也可以写出代码并且交付有用的和可靠的软件;你也可以解决端到端的机器学习问题而不需要统计、概率和线性代数的背景。

要注意,我们这里说的是不要一开始就学习理论,但是我们不是要忽略理论。当你需要的时候,你可以深挖相关的算法。

如果你的目标是要掌握理论,本文中的方法是缓慢的和效率低下的。但是如果你的目标是成为一个机器学习开发者,本文中的方法就是有用的。

你不需要一个更高的学位

知识是永无止境的,你完全可以自学机器学习,你不需要花费大量的时间和金钱来获取一个学位才能开始机器学习相关的工作。

如果你的目标就是要得到一个更好的学位,为什么不先开始进行机器学习的工作,在你完成了几个项目的几周或者几个月之后再考虑学位的问题,你会对这个领域有个更清晰的认识,也会更了解你喜欢的部分。

我很想使开发者相信你们具备开始的条件。

你不需要大数据

在小的数据集上,机器学习算法可以被更好的理解。小的数据集可以使你使用Excel表格来查看,加载到内存中,在你的机器上运行。

大数据不等于机器学习。你可以用大数据构建预测模型,但是你可以把这看作你的某项技能。我通常会建议我的学生当开始学习机器学习的时候要使用小的内存数据集。

如果大数据是你的领域的话,你也可以从大数据开始。

你不需要一台超级计算机

像深度学习这样最先进的算法需要成千上万的GPU来进行计算,但是当处理小点的问题的时候,你也可以用你的桌面计算机来运行它。

你没必要等你有了一个又大又快的计算机了才开始学习机器学习。

在你拥有超级计算机之前,你也可以在一些更小但是更好理解的数据集上学习这些算法。

你不需要很多时间

你可以把你的任务分解成小的任务,从简单的任务开始,逐渐深入到复杂的任务上。

开发者犯的最大错误以及如果避免它们

        下面是初学者常犯的五个常见错误:

1.       不付诸行动。

2.       挑太大的问题来解决。

3.       从头开始实现算法。

算法已经实现了,这个算法足够你在未来几年内做有趣的事情了。如果你的目标是学习如何开发和交付可靠的和准确的预测模型,那么就不要花费时间来从头实现算法,要学会使用库。另一方面,如果你想要专注于实现算法上,那么你就把它当作你的目标并且专注于它。

4.       不坚持一个流程。

在敏捷软件开发的过程中,如果你脱离了流程,结果常常会很糟糕。坚持一个流程从始至终是很关键的。

5.       不使用资源。

   有许多关于机器学习的好的论文、书籍和博客。你可以使用这些资源来提高你的流程、工具的使用以及结果的准确率。

你的下一步工作

本文已经讨论了很多,我希望我已经使你相信你可以开始入门机器学习了。

你的下一步工作是:

  1. 选择一个流程
  2. 选择一个工具或者平台
  3. 选择你的第一个数据集
  4. 整理结果
下面这张思维导图总结了本文的重要概念:



A hand mind map that summarizes the important concepts in this post.

注:本文翻译自MachineLearning Mastery, 英文原文:http://machinelearningmastery.com/machine-learning-for-programmers/

程序员茅庐:分享编程、数据挖掘、机器学习、以及计算机前沿知识,本文由程序员茅庐原创,转载请注明出处。

长按二维码关注程序员茅庐。


    关注 程序员茅庐


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册