程序员初学机器学习的四种方式

http://blog.jobbole.com/67621/

本文由 伯乐在线 - XiaoxiaoLi 翻译。未经许可,禁止转载!
英文出处:Jason Brownlee。欢迎加入翻译组

学习机器学习有很多方法,大多数人选择从理论开始。

如果你是个程序员,那么你已经掌握了把问题拆分成相应组成部分及设计小项目原型的能力,这些能力能帮助你学习新的技术、类库和方法。这些对任何一个职业程序员来说都是重要的能力,现在它们也能用在初学机器学习上。

要想有效地学习机器学习你必须学习相关理论,但是你可以利用你的兴趣及对知识的渴望,来激励你从实际例子学起,然后再步入对算法的数学理解。

通过本文你可以学习到程序员初学机器学习的四种方式。这是给技术人员设计的实用方法,并以实验为依据,你需要做调研并且完成实验才能建立自己的感性知识。

这四种方法分别是:

  1. 学习一个机器学习工具
  2. 学习一个机器学习数据集
  3. 学习一个机器学习算法
  4. 实现一个机器学习算法

你应该通读一下这些方法的策略,然后选择你觉得最适合自己的一个,并且有选择性地执行。

1. 学习一个机器学习工具

选一个你喜欢的工具或者类库,然后学着用好它。

我推荐你从一个自带数据预处理工具,机器学习算法并且能呈现结果的工作平台开始学习。学习这样一个工作平台能让你更熟悉机器学习从头到尾的整个过程,这比学习一个特定的数据处理技术或者一个机器学习算法更有价值。

或者,也许你感兴趣的是一个特定技术或者一类技术。你可以利用这个机会更深入地学习一个提供这些方法的类库或工具,掌握了提供这些技术的类库能帮助你掌握相应的技术。

一些你可以采取的策略有:

  • 比较一些可选的工具。
  • 总结你选定的那个工具的能力。
  • 阅读并总结这个工具的文档。
  • 完成学习这个工具的文字或视频教程,并且总结每个教程中你重点学到了什么。
  • 制作关于这个工具的功能或者特性的教程。选一些你不太了解的功能,然后写下得到结果的过程,或者把如何使用这个功能的过程录个五分钟的截屏视频。

一些值得考虑的工作平台有:RWekascikit-learnwaffles, 和 orange.

2. 学习一个机器学习数据集

选一个数据集,然后深入地理解它,发掘究竟哪类算法最适合处理它。

我推荐你选择一个中等大小的,内存能放下的,可能被很多人研究过的数据集。现在有很多非常好的包含数据的类库,你可以浏览它们并且从中选择。你的目的是尝试理解这个数据集背后的问题,它的结构,和哪些种类的解决方法最适合这个问题。

用一个机器学习或者统计的工作平台来研究这个数据集。这样你能专心解答关于这个数据集你要研究的问题,而不是分心去学习某个特定的技术或者如何写代码来实现它。

一些可以帮助你学习实验性的机器学习数据集的策略有:

  • 清晰地描述这个数据集所呈现的问题。
  • 用描述性的统计数据来总结数据。
  • 描述你从数据中观察到的结构,并且提出对数据间关系的假设。
  • 简单地在这个数据集上测试一些常用的机器学习算法,然后发掘哪些类别的算法比其他的表现好
  • 调整表现好的算法的参数,然后发掘什么算法及算法参数设置在这个问题上表现得好

你可以从这些包含高质量数据集的库中选择: UCI ML Repository,Kaggle 和 data.gov.

3. 学习一个机器学习算法

选择一个算法,深入理解它,发掘什么样的参数设置在不同数据集上都稳定。

我推荐你从一个中等复杂度的算法开始学起。选一个已经被人充分理解了的,有许多可选的开源实现,并且需要你探索的参数数目较少的算法。你的目的是建立有关这个算法在不同问题和不同参数设定下表现如何的直觉。

使用一个机器学习平台或者类库。这样能让你把这个算法当成一个“系统”,专心研究它的表现,而不是分心研究数学公式描述或者相关论文。

一些学习你选定的机器学习算法时可采取的策略有:

  • 总结系统的参数,及它们对算法可能有什么影响
  • 选一系列适合这个算法,可能导致不同表现的数据库
  • 选择一些你认为能导致不同结果的算法的参数设置,然后列出你认为系统可能的表现
  • 考虑在迭代过程或不同时间段内能被监察到的算法表现
  • 用一个或多个数据集,算法设置和结果衡量方式来设计解决特定问题的小实验,并且汇报结果

你可以学简单点,也可以学复杂点。想多学一点的话,你可以探索所谓的启发式规则或经验法则来使用算法,并且以实验为依据来展示它们好不好用,及如果好用的话在什么条件下他们与成功的结果有关联。

一些你可以考虑学习的算法有:最小平方线性回归,逻辑回归,K最近邻分类算法,感知器算法。

4. 实现一个机器学习算法

选一个算法,然后选一个编程语言来实现它,或者把一个已有的实现移植到你选定的编程语言上。

你应选择一个中等复杂度的算法来实现。我推荐你仔细研究你想要实现的算法,或选择一个你喜欢的已有实现然后把它移植到你选定的编程语言。

从头开始实现一个算法,是学习那些关于把算法描述转换成一个可行的系统的过程中必须要做的无数的小决定的好方法。在不同算法上重复这个过程,很快你就能对读懂论文和书里面算法的数学描述有感觉了。

五个能帮助你从头开始实现机器学习算法的策略有:

  • 从代码移植开始。把开源的算法实现从一种语言移植到另外一种语言能教会你算法是如何实现的,并且你能拥有并掌握它。这是开始学习的最快的途径,非常值得推荐。
  • 从一个算法描述开始,然后采集一些其他的描述来帮助你排除歧义并且理解主要的那个参考材料。
  • 多读该算法的不同实现。学习不同程序员是如何理解算法描述并且如何把它转换成代码的。
  • 不要陷入过炫的方法太深。许多机器学习算法的内核用的都是高级优化算法。不要尝试重新实现这些方法,除非这就是你做这个项目的本意。你应该用一个提供优化算法的类库,或者用一个更容易实现的或者类库里就有的简单点的优化算法(如梯度下降算法)。

小型项目方法论

以上四个策略属于我称为“小型项目”的方法论。你用这个方法可以很快建立在技术领域(比如机器学习)方面的实用技能。大意就是你设计并且亲手完成解决特定问题的小项目。

小型项目在几个方面应该足够小,才能保证你能完成它们并且从中学习,然后好步入到下一个项目中去。下面是一些你应该考虑加在项目上的一些限制:

  • 时间短:一个项目从头到最后能有可展现的结果不应超过5-15小时。这样利用一周中不上班的晚上和周末时间你就能完成一个小项目。
  • 范围小:一个项目应该有意义,但同时应该是你感兴趣的问题的范围最小的版本。举个例子,与其解决广义的“写一个能告诉我微博是否会被转发的程序”,还不如去研究这个问题在一个特定的账号在一个特定的时间段内的表现。
  • 所需资源少:一个项目应该能用你的可联网的台式或者笔记本电脑完成。你不应该需要奇葩的软件,网络架构,或者第三方数据或者服务。你应搜集需要的数据,读入内存,用开源工具来解决你那个小问题。

额外有关项目的小贴士

这些策略的原则是让你利用你的程序员技能开始行动。下面是三条帮助你调整思维模式,有助你开始行动的小贴士:

  • 写下你学到的东西。我推荐你每个步骤都产生一个有形的劳动成果。它可以是本子里的笔记,微博,博客文章或者是开源项目。每个劳动成果都可以作为一个里程碑或锚。
  • 除非项目的目的是写代码,否则不要写。这条不是那么显而易见,但却是最能帮助你加快理解机器学习的速度的建议。
  • 目的是学到东西,而不是产生独一无二的资源。不要管是否有人读你关于一个算法的研究、教程或是笔记。这些都是你的观点,是你的劳动成果,他们证明你现在掌握到了知识。

总结

下面是这些策略的一句话清晰总结,可以帮助你选择适合自己的那个。

  1. 学习一个机器学习工具:选择一个你喜欢的工具或类库,学习如何很好的使用它。。
  2. 学习一个机器学习数据集:选择一个数据集,深入地离家它,发掘哪类算法处理它最有效。
  3. 学习一个机器学习算法:选择一个算法,深入理解它,发掘什么样的参数设置在不同数据集上都稳定。
  4. 实现一个机器学习算法:选择一个算法,用你选定的语言实现它或者是把已有的实现移植到你选定的语言上。

选一个吧!

PDF指导手册

如果你喜欢这篇自学策略文章,作者创建了一个32页的有关学习并实践应用机器学习的PDF指导手册。看这里:

小项目方法论:学习并实践应用机器学习

作者还创建了一个包含90个项目想法的清单,作为附加福利加在这个指导里面了。

时间: 2024-10-14 10:58:21

程序员初学机器学习的四种方式的相关文章

程序员初学机器学习算法

英文原文:4 Self-Study Machine Learning Projects 学习机器学习有很多方法,大多数人选择从理论开始. 如果你是个程序员,那么你已经掌握了把问题拆分成相应组成部分及设计小项目原型的能力,这些能力能帮助你学习新的技术.类库和方法.这些对任何一个职业程序员来说都是重要的能力,现在它们也能用在初学机器学习上. 要想有效地学习机器学习你必须学习相关理论,但是你可以利用你的兴趣及对知识的渴望,来激励你从实际例子学起,然后再步入对算法的数学理解. 通过本文你可以学习到程序员

黑马程序员——创建线程的两种方式

java中创建线程有两种方式: 1.继承Thread类 步骤: (1)定义一个类继承Thread类 (2)复写Thread类中的run()方法 (3)调用start()方法:启动线程及调用run()方法 2.实现Runnable接口的方式 步骤:(1)定义一个类实现Runnable接口 (2)覆盖Runnable接口中的run()方法,将线程要运行的代码放到该run方法中 (3)通过Thread类建立线程对象 (4)将实现Runable接口的类对象作为实际参数传递给Thread的构造函数. (5

程序员浪费生命的几种方式

1.开发一个质量和性能很差的系统程序员经常会碰到这样的项目,做出来的系统质量很差,操作无反馈,失败无提示,而且速度很慢,操作时不时要等一会儿.然而,关键是程序员没有机会或者不想参与实施和维护,失去了学习和诊断问题的机会.2.花费大量人力财力开发一个一次性的项目这是从事应用开发程序员经常碰到的情况,为某个客户定制化开发一个一次性的项目,然而这个项目要花费巨大的人力成本,最终开发维护周期很长,以巨大亏本收尾或无法收尾.3.开发一个很漂亮花哨的无人用的系统这也是当前常见的情况,客户要做一个亮点政绩工程

程序员的奋斗史(四十一)——大学断代史(五)——我的娱乐方式

文/温国兵 忙碌的大学生活总要有属于自己的娱乐方式,琴棋书画也好,游戏运动也罢. 上大学开通了人人网.新浪微博.腾讯微博,再到后来的微信.陌陌.来往.易信.米聊.Line.WhatsAPP,加上最开始的QQ.QQ空间.朋友网,太多的SNS使我不得不放弃其中的一些.现在,微信成为我现在使用最频繁的SNS应用,偶尔登下新浪微博,弃用其他提及的所有SNS网站或者应用.常说人生而孤独,我们渴望与他人的结交,迫不及待的渴望与他人的世界产生交集.使用SNS的原因,大抵有如下几个:打发时间.内心空虚.搪塞孤独

程序员的奋斗史(四十四)——大学断代史(八)——大学的友谊

文/温国兵 我不是一个善于表达的人,但很庆幸大学里结实了几个知己. 原本我是其他寝室的,缘分使然,让我和现在的室友相聚.和好友A.好友B.好友C之间发生了太多太多,以至于太多回忆从脑海中隐隐浮现.A在我的正前方,无数个夜晚不知道他在被窝里做些什么,我睡了很久还依稀可以听见他的声音.大学和A同学谈得最多,每次都是相当长的时间,在我的心里,一直把他当做大哥.每一次谈话都从中收获颇丰,增长不少见识.也是A同学让我变得比以前开朗.同一件事情,他比较乐观,我比较悲观:他看到最多的是希望,我看到最多的是绝望

程序员必须掌握的6种软技能

程序员必须掌握的6种软技能 如果你想要开启作为 web 开发人员的职业生涯,那么你需要涉及的不仅仅是知道如何写代码. 有一些通用的软技能几乎可用于每个领域——包括技术行业. 成为软件开发人员涉及的不仅仅是编写代码.自从我开始我的第一份作为软件开发人员的工作之后,我很快就知道了这一点.如果你想要在这个领域茁壮成长的话,那么你需要学习“特定的技能系列”. 你看,每一家公司都有一个大局.除了写代码,你需要利用其他技能,使自己更有影响力,从而赚取更多的 money. 在我作为一名开发人员的任职期间,我学

程序员的奋斗史(四十二)——大学断代史(六)——我与图书馆

文/温国兵 作为一个爱读书之人,图书馆简直是人间天堂.反之,不过地狱. 读书的好处在于,可以穿越古今中外,超越时间和空间的界限,到达你想到达的地方.你可以回到唐朝和诗仙酌酒言欢,可以回到战国和庄子高谈庄周梦蝶.鲲鹏之硕,可以回到18世纪的法国聆听哲人卢梭的教导,可以回到19世纪的德国瞻仰尼采的智慧,可以回到20世纪的中国感受王小波的特立独行,可以回到春秋时期领略老子的道,可以回到20世纪感受徐志摩的唯美诗歌--书中自有黄金屋,书中自有颜如玉,从书中可以获取到广阔的精神食粮,指引着我们前进,教导我

webservice调用的四种方式

因为数据在网络上传输都是通过xml形式的,本质都是把数据封装然后通过xml传输,接收到的也是xml文件,1 和 4 让程序员屏蔽了处理xml文件,而2 和3需要程序员自己写请求体 ,还要处理返回的xml文件 1.通过 wsimport命令 生成了 java代码 然后导入工程 调用,屏蔽了 数据在网络上xml形式传输的细节,利用代理对象让调用远程方法好像本项目工程调用代码一样 :缺点 可能java代码文件过多 2.ajax 需要 自己 指定请求的xml文件,还要接受的 xml文件进行解析,比较麻烦

程序员的奋斗史(四十五)——大学断代史(九)——独自南下的岁月

文/温国兵 2014年2月,独自踏上了南下的路. 对于一个13岁就独自到过广州的我来说,出远门并不陌生.话虽如此,但还是感到了独自南下的那份孤独.到了广州,找房.买生活用具,沉重的包袱压得我喘不过气来.大把大把的金钱瞬间就流入他人的口袋,才知道生活的不易和挣钱的艰辛.以前享受着高枕无忧的生活,每个月父母按时打来生活费,每天在学校过着安逸的生活,却不知父母在外打拼的艰辛.是的,父母在外承受了太多,为了我的幸福生活牺牲了太多,而我很多时候却不知道知足,有时在不经意间说伤害父母的话,现在想来很是不应该