原文:http://machinelearningmastery.com/machine-learning-for-programmers/
编译:微信号 - AI科技大本营
学习机器学习,但无从下手怎么办?尝试过各种学习方法,为什么依然是个门外汉?为什么传统的学习机器学习的途径收效甚慢?如何开启机器学习之路呢?
很多同学都问我:我该如何开始学习机器学习?
做过各种尝试,但依然无从下手
根据我以往的经历,我可以想象的出你做过哪些尝试,比如海淘各种博客帖子,学习斯坦福大学的机器学习公开课,尝试深入理解机器学习的相关概念和模型,尝试处理一些小数据集,不过依然会觉得不得其门而入。
做过各种尝试,但依然无从下手
在我看来,问题在于你还没有将从课本和视频中学习的理论、算法和数学形成一个知识体系。
在真实工作场景中加深理解
假设你已经掌握了很多个分散的知识点,那么要考虑将其形成一个体系,最好的办法是在真实的场景中思考这些知识。比如下边列举的几个场景:
场景1:一次性模型
某天你的老板跟你说:小李啊,你懂机器学习吗?你能不能使用去年的客户数据来预测一下在我们销售渠道中哪些客户有可能继续跟我们续约?
我把这种情况称之为一次性模型。
问题由你的老板来提出。他给的数据非常小,甚至可以在微软Excel中打开。但他却需要精确并且稳定的预测。你可以交付,你还可以对最终结果进行相关补充说明。
场景2:嵌入式模型
你和你的团队对甲方软件项目进行需求收集。你了解到解决某个问题最好(或者唯一切实可行)的方法是设计并训练一个预测模型,并把它嵌入到你们的软件产品中。
我把这种情况称之为嵌入式模型。
这当中还有一些变体(比如这个模型是固定的呢,还是以后会自动定期更新?是在本地运行呢?还是通过API远程访问?),但这些都是只是细节而已。
这个场景中的重点是你具有的经验:识别一个需求,它的最好解决方式是使用一个预测模型,并且你具备设计、训练和部署这个模型的能力。
场景3:深度模型
你开始了一项新工作,工作的系统至少由一个预测模型组成。不管是维护系统,还是添加功能,都需要具备对这个模型的理解,它的输入是什么,输出是什么。
模型的预测精度是软件产品非常重要的一个指标,而你的工作职责包括提升模型预测精度。比如,测试预发布系统时,你展示的模型的准确度不能低于上个版本,或者要高于上个版本。
我把这种情况称之为深度模型。
你需要建立对一个特定预测模型的深入理解,并且用你的经验和技能来提升并且验证它的准确度。
以上这三个场景都是我曾经经历过的。
它让一件事情非常明确——虽然机器学习是一个非常吸引人的一个领域,但对一个软件开发者来说,机器学习只是另外一堆技巧,就像多线程编程或者3D图形编程。然而,机器学习是针对特定类别的问题进行设计的。
传统方法如何开启机器学习之路
找几本机器学习相关的书,你会发现这些书往往从基本的定义开始,然后是相关的数学公式阐述,最后是非常复杂的算法。
传统的解答是自下而上的
基本概念的定义和数学理论的表述都是非常清楚、简洁并且绝不模棱两可。但是,它们非常枯、无聊,并且需要具备一定的数学背景来分析和理解。
这也是大学将机器学习放在研究生课程中的原因?因为教授机器学习的基本原理需要具备多年基础积累。
比如,它建议你具备如下基础:
统计
概率
线性代数
多元变量统计
微积分
如果你误入了某些奇怪的、有趣的算法,那你的机器学习之路将会更糟糕。
这个学习机器学习自下而上和基于算法的方法无处不在。
MOOCs和YouTube上的在线课程也是仿效大学的方式来教授机器学习,如果你具备相关基础或者你已经投入了大量的时间来学习这些高级课程,这没什么问题。但是,这对于大多数的软件开发者并不管用。
如果你到Quora, StackExchange, Reddit这些网站求助如何开始机器学习,你大概会收到同样的答复。
难怪一些软件开发者会不断寻求正确的方法,但结果是不得不回到学校并获得研究生或者博士学历,只有这样他们才觉得可以开始学习机器学习了。
仔细思考一下这个自下而上的机器学习学习方法。它非常缜密、也更系统化,听起来没什么问题,但怎么可能出错呢?
为什么传统的学习方法是错的?
当你开始计算机学位的学习。一学期又一学期,你在学习着难解的线性代数,微积分和离散数学。你使用着过时的编程语言。这些都在消磨着你对编程和软件开发的热情。
传统的学习方法与成为一名实践者之间有一个鸿沟
或许你成功的完成了学业,但回过头才发现你并没有学习到任何一个关于现代软件开发的技能、语言、工具,或者其它任何你能够用来开发软件的知识。
对于一个正在学习的程序员没有必要让他学习计算理论或者计算复杂度理论,或者算法和数据结构的细枝末节。这些知识(算法复杂度和数据结构的细节内容)可以晚点再学。或许应该关注一些特定组合的工具,站在一个从事编程工作且能够交付软件的工程师的角度来看这件事。
如果一个软件开发者想要进行机器学习,他们真的有必要花费多年的时间和大量的金钱去获得数学和更高的学位吗?
答案肯定是否定的!还有更好的方式
以正确的姿势开始机器学习
对于机器学习,你需要自上而下的学习方法。这个方法更关注结果:采用最佳的工具组合和平台,解决真实的机器学习问题。
自上而下学习机器学习
以下是我推崇的学习方法
1.通过系统化流程迭代结果
使用机器学习解决相关问题时,你需要系统化。这是一个项目,和软件开发一样,通过良好的处理可以获得高质量的结果,通过不断地迭代得到进一步提升。
仔细思考这样一个系统的流程,你可以想到一些明确的要求,比如:
一个系统的流程可以带你贯穿始终,从特定的问题到结果的呈现或者部署。与软件开发项目一样,你可能认为你已经完成了,但是你很可能没有。
一个系统的流程可以带着你一步一步地完成你的任务,这样你就明确地知道下一步该做什么。不知道下一步该做什么简直就是项目的克星。
一个系统的流程可以保证良好的结果,也就是说这个结果会比一般的好,或者远超项目的需求。在项目中经常要求提交有一定可靠度的结果,而并不一定是那个最好准确度的结果。
一个系统的流程不拘泥于特定的工具、编程语言、算法模型。使用的工具在不断更新,因此这个流程必须具备适应性。考虑到学界对于算法的追求,时常会出现新的,更好的算法。
有非常多的高质量的系统流程,包括一些比较老的系统流程,你都可以稍加调整使之能够满足你的要求。
2.为你的系统流程选择最佳的工具组合
机器学习的工具和库在不断地更新迭代,但在任何时候你都得选择与所选系统流程最适合的工具组合。
你不用验证和选择任何老的算法或者库,你需要所谓的最好组合,它可以给你快速的、可靠的、高质量的结果,并且能够尽可能地自动进行。
但是,你得根据自己的需要选择工具组合。
比如,对于以上三种场景,我建议使用的工具组合如下所示:
一次性模型:使用Weka平台,可以在很短的时间加载CSV,设计一个实验,并获得最好的模型,并且几乎不同编程(请参考我对这流程的整理)。
嵌入式预测模型:通过python使用Scikit-learn库,我可以使用同样的语言来开发模型。IPython是一个非常好的方式,可以向团队展示你的模型运行情况。MLaaS对于大数据而言是个很好的选择。
深度模型:R语言,在R平台上,我可以快速并且自动地尝试很多最高水平的模型。
实际上,这三种情况下的三种工具组合也要依赖于特定的应用场景。
和软件开发一样,你需要学习如何使用这些工具,从而可以最大程度地利用它们。此外,你也需要随时关注业界的发展,并且使用更好的工具。当更好的工具发布后,你可以不断调整工具来适应你那个系统流程。
3. 有选择性地开放你的项目
软件开发技能是通过开发大量软件产品得到的。对于机器学习,你可以使用类似的方法。
仔细选择练习数据集
你最好选择一个真实的数据集,而不是人为杜撰的数据集。现在外面有大量的各种复杂度的数据集合。
我建议从一些小的数据集开始,可以从UCI机器学习库中获得。它们都非常有名,相对简洁,适合新手学习使用机器学习算法系统流程和相关工具。
之后,非常推荐使用一些更大的数据集,比如Kaggle和KDD比赛提供的数据集。它们相对会有点乱,要求使用更多不同的技能。
处理图像和文本数据(分别是计算机视觉和自然语言处理)是一个新兴且不同的领域。它们会要求你使用该领域里面特定的某些方法和工具。如果你是想处理这类型的数据,那么你最好从那里开始。
在另外一篇博客中,对于如何把练习做成开放式作品集进行了详细的阐述。“如何练习机器学习算法,从UCI机器学习数据库的小数据开始”
记录结果,并建立公开项目集
在一个单独的文件中记录你做了什么,学到了什么。以便于你在其他项目中作参考。
这类似于软件开发者经常把每一个软件项目放在一个文件夹中一样,并使用以前工程中的代码和想法。这可以很大程度上加快研发速度,强烈地推荐这种方式。
整理好你的笔记、代码和生成的图片,但写下你的发现也是非常重要的。把这想成是对你代码的注释。一个独立的文档可以是一个简单的PPT或者文本文件,也可以制作得像演讲那种那么精致,或者像YouTube上面的视频一样好。
把每一个项目都提交到一个公开的版本管理库中(比如Github),这样其它新手就可以学习你的经验,并进行一定的拓展。可以把项目链接放在你的博客,LinkedIn或者以其它任何公开的形式来展示你的精湛技能和能力。
关于这个想法更多的信息请参考我的另一篇博客“建立一个机器学习公开项目集:专注于完成一些小的项目并展现你的相关技能”
对于开发者来说,在Github上发布和维护项目已经成为简历中必不可少的一部分,尤其是特别关注技能和项目经验的公司。
以上是为软件开发者定制的学习方法对于以上学习方法,你可以将其应用在机器学习领域。
还是不懂如何开启学习机器之路?
「机器学习集训营」第四期即将开课!在第三期的基础上,除了直播答疑、作业批改、在线考试之外,特地增加开课前的入学测评,基于每一个人的测评数据量身定制个性化的不同学习路线。且线下在北京、上海、深圳的基础上新增广州和杭州两个线下点,五城同步开营。
限120个名额,历时3个月,10多个BAT级工业项目,高效开启你的机器学习之路!