进入机器学习领域没有正确的方法。我们学习的方式略有不同,并且在利用或为机器学习做什么方面有不同的目标。
一个常见的目标是快速地在机器学习方面取得成效。如果这是你的目标,那么本文重点介绍了程序员在成为高效机器学习实践者的道路上常犯的五个错误。

程序员在机器学习入门时常犯的错误
照片来源:aarontait,部分权利保留。
1. 将机器学习置于神坛之上
机器学习是一种技术集合,你可以用它来创建复杂问题的解决方案。
由于它是一个新兴领域,机器学习通常通过学术出版物和研究生教材进行交流。这给人一种它很精英、难以逾越的印象。
为了在机器学习方面取得成效,需要进行思维转变,从技术转向流程,从精确转向“足够好”,但对于程序员感兴趣采用的其他复杂方法来说,也可能如此。
2. 编写机器学习代码
通过编写代码开始机器学习会使事情变得困难,因为它意味着你正在解决至少两个问题而不是一个:技术的工作原理以及如何将技术应用于特定问题。
一次只解决一个问题,并利用机器学习和统计环境及算法库来学习如何将技术应用于某个问题,会更容易。这可以让你相对快速地抽查和调整各种算法,并调整一两个看起来有希望的算法,而不是花费大量时间解释包含算法描述的模糊研究论文。
实现算法可以被视为一个单独的项目,稍后完成,例如作为学习练习,或者如果原型系统需要投入使用。一次学习一样东西,我建议从基于GUI的机器学习框架开始,无论你是否是程序员。
3. 手动进行操作
应用机器学习涉及一个流程,包括问题定义、数据准备和结果呈现等任务。这些流程以及算法的测试和调优都可以并且应该被自动化。
自动化是现代软件开发中构建、测试和部署的重要组成部分。通过脚本化数据准备、算法测试和调优以及结果准备,可以获得严谨性和改进速度的好处。记住并重用在专业软件开发中学到的经验教训。
未能从自动化(例如Makefile或类似的构建系统)开始,很可能是因为许多程序员来自书籍和课程,这些书籍和课程对该领域的应用性质关注较少。事实上,为应用机器学习带来自动化是程序员的一个巨大机遇。
4. 重新发明常见问题的解决方案
在你实现你正在实现的算法之前,很可能已经有数百甚至数千人实现过该算法,或者解决了与你正在解决的问题类型类似的问题类型,请利用他们已有的经验教训。
在解决应用机器学习问题方面,有大量知识可用。诚然,其中很多可能包含在书籍和研究出版物中,但你可以访问它们。做好你的功课,搜索Google、Google图书、Google学术,并联系机器学习社区。
如果你正在实现一个算法
- 你必须实现它吗?你能重用库或工具中现有的开源算法实现吗?
- 你必须从头开始实现吗?你能代码审查、学习或移植现有的开源实现吗?
- 你必须解释规范的算法描述吗?是否有其他书籍、论文、学位论文或博客文章中有你可以回顾学习的算法描述?

照片来源:justgrimes,部分权利保留
如果你正在解决一个问题
- 你必须测试所有算法来解决这个问题吗?你能利用关于这个或类似问题实例的研究来发现哪些算法和算法类别表现良好吗?
- 你必须自己收集数据吗?是否有可用的公开数据集或API,你可以直接使用或作为你问题的代理来快速了解哪些方法可能表现良好?
- 你必须优化算法的参数吗?是否有可以用来配置算法的启发式方法在算法的论文或研究中被提出?
如果一个编程库或特定类型的数据结构有问题,你的策略是什么?在机器学习领域使用相同的策略。联系社区并寻求可以利用的资源,以加速你的学习和项目进展。首先考虑论坛和问答网站,然后联系学者和专家。
5. 忽视数学
你不需要数学理论就能入门,但数学是机器学习的重要组成部分。这是因为它提供了一种最有效、最明确的方式来描述问题和系统的行为。
忽视算法的数学处理可能导致问题,例如对某个方法理解有限或对算法的解释有限。例如,许多机器学习算法的核心是优化,它被渐进式地更新。了解所解决优化的性质(函数是否是凸函数)可以让你使用利用这些知识的高效优化算法。
内化算法的数学处理需要时间,并且随着精通而积累。特别是如果你从头开始实现高级算法,包括内部优化算法,请花时间从数学角度学习算法。
总结
在这篇文章中,你了解了程序员在入门机器学习时常犯的5个常见错误。这五点经验教训是:
- 不要将机器学习置于神坛之上
- 不要编写机器学习代码
- 不要手动进行操作
- 不要重新发明常见问题的解决方案
- 不要忽视数学
更新:在HackerNews和DataTau上继续讨论。
摘要中的错别字
“Don’t put machine learning is put on a pedestal”
谢谢,已修正。
你是指第5点“不要忽视数学”吗?
好吧,我会试试——即使我数学不好,听起来也挺有动力的“你不需要完整的理论”:)
我百分之百同意第三点,特别是你评论说这是软件工程师的一个巨大机遇。二十年前的统计学和今天的机器学习之间的一个区别是,它已经成为一个软件工程问题,就像它是一个统计问题一样——当然,自动化可以省去很多麻烦,即使只是因为它允许你以后复制结果。我曾有过一些非常不愉快的经历,因为模型没有被脚本化而“丢失”了,几天后我无法复制导致某个结果的步骤。
我犹豫是否同意第二点。一方面,我同意从头开始实现算法是浪费时间的绝佳方式;另一方面,你可以说,就像你需要深入研究数学才能真正理解一个算法一样,了解实现的工作原理是理解真正发生的事情的另一种角度(对软件工程师来说可能比数学更容易)。我总是有点担心人们在不完全理解发生了什么的情况下使用现有的实现。我想说,默认情况下,如果存在现有实现并且你对算法有很好的了解,就使用它,但否则,如果你想学习一种方法,就深入研究数学和实现——在你尝试自己编写它之前,你无法完全理解一个算法;)
“If that is your goal than this post highlights.. ” – 应该是 “then”。
谢谢,已修正。
另外两点
“learning by writing code can be make things difficult”
和
“Hundreds and thousands of people have likely implemented the algorithm you are implemented “
非常感谢 Martin,已修正。我需要花更多时间校对(或者雇佣你!)。
几年前我开始研究机器学习算法时得出了类似的结论,来自重度数据库/开发背景,这似乎是一项艰巨的任务。
有了所有可用的库和框架,数学模型在多大程度上被抽象化了,这真令人惊讶。
我确实推荐订阅一些关于该主题的Coursera课程,这些课程对基准测试、度量以及构建机器学习系统的整个“研究式”方法(设计 => 构建 => 度量 => 迭代)提供了深刻的见解。
写得很好!
很好的观点列表。来自纯计算机科学背景,我认为我犯了这样的错误:深入研究了例如机器学习中使用的前10种算法,它们的内部工作原理和机制,而不是使用各种工具包中现有的ML库来解决现实生活中的问题。
一个非常常见且容易犯的错误!
你好…你提到了QA ML网站和ML论坛。你能推荐几个吗?
谢谢
你有一个拼写错误:“Starting in machine learning by writing code can make things difficult because it means that you are solving at least two problems rather than one: how a techniques so that you can implement it and how to apply the technique to a given problem。” 我认为你想说的是“how a technique works”。
谢谢 Jamieson,已修正。
“rather than investing large amounts of time interpreting ambiguous research papers containing algorithm descriptions”
哈哈哈哈。是的,没错。天哪,你应该看看金融界产生的那些矫揉造作的垃圾。无休止的学术论文,承诺通过晦涩的技术带来诱人的利润,结果却只是那样。“学术”。
谢谢 Anthony。
嗨,读一下这些细节很有趣。但我曾想过“机器学习”这个术语?
在这个数字世界里,每个人都在从事系统/计算机应用。
这个机器学习术语,乍一看,会不会让人混淆于汇编语言学习,或者学习关于其他旧的/遗留的机器是如何工作的,以及如何对其进行调整以提高性能?
细节很重要,但可以稍后处理。
用编程类比,你可以从Python开始,然后学习C,然后学习ASM。你不需要(也不应该?!)从ASM开始,你很可能会因为沮丧而放弃,而且在同样的时间里,用Python可以取得更大的进步。
Java有支持机器学习的库吗?
是的,看看这篇文章
https://machinelearning.org.cn/java-machine-learning/
你推荐哪本书?还有哪种语言更合适?
Python是一个很好的入门平台 adio。你可以在这里开始
https://machinelearning.org.cn/start-here/#python
机器学习入门的好文章。
此处已添加本文的引用链接。
https://artofengineer.com/ds/machine-learning/machine-learning-introduction/
谢谢,希望它有帮助。
谢谢你的文章。我想补充一点,另一个常见的错误是等待最佳时机来开始实现和“玩弄”概念和算法。许多人报名参加了这个或那个课程,读了成千上万的书,一直在不同来源之间切换,但未能付诸实践。
是的!
我称之为“准备开始”。这只是漂亮的拖延。
应用机器学习中最难的部分是什么?看起来你只需要几行代码,数据准备和结果检查。
我写了一篇关于这个主题的文章
https://machinelearning.org.cn/applied-machine-learning-is-hard/
谢谢!