经常听到这样的话:
“我是一名软件开发工程师,阅读过一些关于机器学习方面的书籍和博客文章,也学习过一些在线的关于机器学习的公开课。但是,我仍然不知道怎么应用到工程实践中……”
在这一篇文章中,我分享一下对这个话题的深入思考:
你是一名软件开发工程师,现在,机器学习、大数据很热门、快速增长,你想进入这个领域。
你阅读过一些关于机器学习方面的博客,现在,你想做的更深入一点,但是,大部分书籍和论文,要么是侧重理论研究,要么是侧重算法、数学公式推导。
你可能参加过一些在线公开课,比如Coursera、Edx,但是,除了完成课后练习,获得毕业证书,对你的工程实践来说,也帮助不大。
你可能参加过一些竞赛,比如,Kaggle,使用过一些小型的数据集。最大的问题是,你不能把书籍、论文中学到的理论知识和实际工程问题连接起来。那么你应该怎么做才能突破这个障碍?
当你思考未来,你掌握了目前最热门的机器学习,你的工作将会发生什么样的变化?如果,在你的日常生活中,可以熟练应用机器学习的技能,你的生活将会发生什么改变?
试想一下,这种“自下而上”教授机器学习的方法,是严格而且系统化的。听起来表面上是正确的,它怎么可能是错误的呢?
假如你原来对机器学习很感兴趣,但是,学完那些晦涩难懂的理论,枯燥无谓的数学推导,你对机器学习的兴趣大打折扣,而面对实际的问题,你又不知道如何入手?对开发更智能化的系统畏惧。
与计算机科学一样,它不能只是自上而下转换模型和教授相同的材料。
究其原因,就像计算机科学一样,它们从来不讨论涵盖软件开发和交付的实际问题。机器学习课程和书籍,仅仅停留在算法讨论层面。
你需要一种“自上而下”的学习机器学习的方法。这种方法是,专注于你实际想要的结果,借助合适的机器学习工具解决你的实际问题。
一旦你了解一些工具,简单的调用里面的算法,然后,你就认为完成了任务。这可能是一种很危险的想法。
你怎么知道你做了什么,你怎么知道结果好么?你怎么知道结果是建立在可靠的数据集上的呢?
当你解决实际机器学习问题时,你需要系统化。这是一个项目,就像软件项目一样,一个规范化的流程,可以实现高质量的、结果可重复性的项目。
考虑这样一个流程,比如:
下面列举一些常用的流程,有些已经过时,但是,根据你的需要,选择合适的处理流程。比如:
机器学习工具和库,比较多,更新比较快,选择一个最合适你工作流程的工具,首先,调研工具和库的优缺点,根据你目前要解决的问题,选择合适的工具。
通常,你去咨询你的朋友,他们建议你选择最新的工具。但是,我喜欢用不同的工具,解决不同的实际问题。
比如,在这些场景下,我建议选择这些工具:
我建议选择,像R的工具包,它是统计学家最喜欢的工具包,里面集成好多,最新的学术的算法。Python的机器学习库,scikit-learn也是目前和热门的机器学习库,它的社区比较活跃,也有完整的可以参考学习的文档,它可移植性也强,可以部署到实际生产环境中。
我建议选择,像mahout,Spark这样的工具,它是分布式处理,对于海量数据处理是一个不错的选择,它的缺陷是,算法迭代速度慢,机器学习库还不是很完善。
实际上,在工作中,这些工具都有需要:
你应该通过解决一些实际的问题,反复的练习,熟悉工具包,更好的使用自上而下的方法,提高你在解决问题中应用机器学习的技能。
首先,你应该选择一些实际生产环境好的数据集,如果,没有,选择一些公开的数据集也不错,比如:UCI Machine Learning Repository、KDD比赛提供的数据集。
然后,你申请GitHub帐号,分享自己的项目,对提高自己也是不错的选择。在你的博客中,指明你的github链接。
对程序员来说,这是一个很好的方法:
你不需要写太多的代码,因为有Weka这样的工具包;你不需要懂太多的数学理论知识,已经有实现好的库;你不需要很高的学历,因为这不是做科研工作;你不需要很大的数据集,Excle的数据就可以;你不要很高性能的计算机,有一台笔记本就可以;你不需要大量的时间,你每天抽出半个小时就OK。
我经常给人们提上面这些建议,但是,实际中,还是犯这些错误,希望你能避免:
下面一幅图结束本文:
希望通过这篇文章,解答大家对机器学习的畏惧和疑惑