# 软件工程师必备的机器学习技能

原文链接：[Machine learning skills for software engineers](https://www.infoworld.com/article/3223688/machine-learning/machine-learning-skills-for-software-engineers.html?from=hackcv&hmsr=hackcv.com&utm_medium=hackcv.com&utm_source=hackcv.com)

### 也许你做机器学习不是为了成为数据科学家，但是你确实需要学习一些数据分析的技能。让我们从这里开始吧

![Machine learning skills for software engineers](https://images.techhive.com/images/article/2017/04/1_proven-skills-development-100719359-large.jpg)

Thinkstock

*Ted Dunning是MapR Technologies的首席应用架构师。*

很久以前，在20世纪50年代中期，Robert Heinlein写了一个名为“进入盛夏之门（A Door into Summer）”的故事，其中一位称职的机械工程师利用“Thorsen记忆管”和一些用于判断的“集成电路”催生出一个整个智能机器人行业。为了使这个故事更加合理，作者将故事的背景设定在1970年，那时候这些机器人可以通过完成别人洗碗这个任务，完美地复制它，即“学会”洗碗。

可能我需要告诉你，事实并非如此。这个故事可能在1956年看起来似乎很合理，但真到了1969年，很明显智能机器人不会出现在1970年。过了一段时间，人们发现很明显故事不会发生在1980年，也不会发生在1990年或2000年。每10年 ，普通工程师建造人工智能机器的能力似乎至少和时间一样快。 随着技术的进步，问题的巨大难度变得清晰，因为发现了一层又一层的困难。（译者注：《进入盛夏之门》是一本1950年左右关于智能机器人，时空穿越的科幻小说）

**[评论：TensorFlow，Spark MLlib，Scikit-learn，MXNet，Microsoft Cognitive Toolkit，and Caffe机器学习和深度学习框架。| 综述：13 frameworks for mastering machine learning。|借助 InfoWorld Daily newsletter了解尖端企业技术的关键新闻和问题。]**

机器学习并非不能解决重要问题;它其实可以解决。例如，到90年代中期，基本上所有的信用卡交易都是使用神经网络进行诈骗扫描。到了90年代末，谷歌正在分析网络上的高级信号以帮助搜索。但是软件工程师是没有机会建立这样一个系统，除非他们回到学校攻读博士学位并找到了一群志同道合的朋友才会做这样的事情。机器学习很难，每个新领域都需要打破大量的新瓶颈，即使是最优秀的研究人员也无法解决现实世界中的图像识别等难题。

我很高兴，如今已经发生了巨大变化。虽然我们中的任何人都很难在不久的将来建立一个Heinlein风格的，自动神奇的，全机器人的工程公司，但现在，对于没有经历过特殊培训的软件工程师依然可能做出很棒的东西。其中令人惊讶的不是计算机可以做这些事情（毕竟从1956年我们就知道未来的每一天都可以做到），而是在过去十年里我们走了多远。 10年前可以获得一个好的博士学位的项目，如今可能只需要一周就能完成。

## 机器学习变得越来越容易（或者至少更容易获得）

在我们即将出版的“Machine Learning Logistics”一书中（2017年9月下旬由O'Reilly著），Ellen Friedman和我讲述了一个名为TensorChicken的系统，这个系统是我们的朋友和软件工程师Ian Downard已经建成了一个有趣的家庭项目。要解决的问题是，蓝鸟总会进入我们朋友的鸡舍并偷吃鸡蛋。他想建立一个可以识别蓝鸟的计算机视觉系统，以便采取某种行动来阻止他偷吃。

在看到TensorFlow团队的Google工程师深入学习演示之后，Ian开始破解并构建了这样一个系统。 他首先构建了一个名为[Inception-v3](https://www.tensorflow.org/tutorials/image_recognition)的局部模型，然后通过他的鸡舍中的网络摄像头拍摄了几千张新照片，并进行模型训练。最后把训练结果部署在树莓派上，但是为了使得响应速度快，我们需要更强大的功能，例如英特尔酷睿i7处理器。


而Ian并非一个人。现实中有各种各样的人，其中许多人 *没有* 并非数据科学家，但他们做出了很酷的机器人来做各种各样的事情。越来越多的开发人员开始研究各种不同的，严肃的机器学习项目，因为他们认识到机器学习甚至深度学习变得更容易获得（利用）。开发人员开始以“数据操作”的工作方式担任数据工程师，即开发人员将聚焦数据的技能（数据工程，架构师，数据科学家）与开发程序的方法想结合来构建机器学习系统。

使用图像识别模型居然可以很容易地训练计算机发现蓝鸟,这真的令人深刻。在许多情况下，普通人可以坐下来做这种事情甚至更多，而所需要的只是指向有用技术的一些指导，并在脑海框架中稍微重构一下，尤其是如果你主要用它进行软件开发。



建模不同于开发普通软件，因为它是数据驱动而不是设计驱动的。你必须从经验的角度来看整个系统，同时你需要的是数学方程的实验证明，而不是努力实现那些具有有单元测试和集成测试的良好设计。另外，在机器学习中有一些本不困难的问题，它可能可以变得非常容易。然而，可能其他的问题无论怎么变都仍然非常困难，因为它需要更复杂的数据科学技能，包括更多的数学知识。因此，解决方法就是测试一下，即在你确认问题属于简单类别之前，不要赌上你的农村或鸡舍（不要钻牛角尖，投入使用）。甚至在它看起来第一次起作用之后，依然不赌上农场。就像所有优秀的数据科学家一样怀疑好看的结果，并多次测试。

## 机器学习初学者的基本数据处理技能

本文接下来部分主要讲述了开发人员学习使用机器学习所需的一些技能和策略。

### 从数据开始

在良好的软件工程环境中，通常你可以推断设计，编写软件，并直接和独立地验证解决方案的正确性。在某些情况下，你甚至可以在数学上证明你的软件是正确的。 在现实世界特别是涉及人类时，解决方案可能会受到影响，但如果你有良好的规范，你可以实施正确的解决方案。

对于机器学习，你通常没有严格的规范。你拥有过去的经验数据（数据集），你必须构建一个系统（学习模型）来适用于将来的数据。要判断你的系统是否真的有效，你必须在实际情况下测量性能。让你切换到这种数据驱动的，规范较差的开发风格可能很难，但如果想构建内部具有机器学习的系统，那么这是一个关键步骤。



### 学会发现更好的模型

比较两个数字很容易，假设它们都是有效值（不是NaN），你检查哪个更大就行了。然而，当谈到机器学习模型的准确性时，它并不那么简单。 对于你要比较的模型，你会有很多结果，但这些结果并不容易比较。在构建机器学习系统中，最基本技能就是能够根据两个模型所做出的决策（所得到的结果），确定哪种模型更适合你的情况。这种判断最基本的方式是权衡各个方面的参数而非某个特定的值。它通常还要求你能够很好地可视化数据，即需要你具备画出直方图和散点图等相关能力。

### 怀疑你的结果

除了能发现更好的模型，另一个必备的能力是要学会怀疑自己的结果。你的结果是不是运气好获得的，换组数据是否会得到其他结果？当你评估时系统是否发生了变化，进而改变哪个系统更好？亲自建立一个机器学习系统意味着你必须密切关注系统，以确保它始终能按照你的想法做。在这个不断变化的世界中，有很多模糊比较需要处理，因此需要这种可疑的性质。

### 建立许多模型然后扔掉

在软件开发中有一个陈旧的格言，你需要构建一个版本的系统然后舍弃他。 其核心思想是：在你真正构建一个工作系统之前，由于不能很好地理解这个问题，无法一下子就构建一个完美的系统， 因此你需要构建一个版本才能学习，然后使用该学习来设计和构建真实系统。

对于机器学习来说也是这样的，但不止是这样。你必须准备好构建数十个或数百个系统，而不是只构建一个一次性系统。其中一些系统可能会使用不同的学习方法，甚至仅仅是学习模型的参数进行不同设置。其他系统可能是问题的完全不同的重述或你用来训练模型的数据。 例如，你可能会确定存在可用于训练模型的替代数据集，即使该数据集实际上不是你想要预测的数据集。这可能会为你提供10倍以上的数据量，或者你可以重构这个问题然后以简单的方法解决他。

世界可能会发生变化。特别是当你构建模型以试图获取欺诈者时，这种变化显得更加明显。 即使你构建了一个成功的系统，你也需要在将来进行更改，因为欺诈者会发现你的对策，他们会改变他们的行为。你将不得不采取新的对策。

因此，对于成功的机器学习，计划建立一堆模型然后扔掉。不要指望找到一个永恒正确的答案。

### 不要害怕改变游戏

你尝试通过机器学习解决的第一个问题通常是不完全正确的问题，通常它会有显著的不足。因为这个问题可能会得到一个几乎不可能训练的模型，或数据无法收集，或者可能是即使找到了问题对应的模型，但这个模型仍然没有什么价值的情况。

有时候，重构问题可以帮助你构建一个非常简单的模型，同时这个模型还具有非常高价值。我曾经就有一个需要我去推销产品的问题，即使采用一些重量级的技术，也很难获得收益。事实证明，在推销中高价值的问题是确定 *什么时间* 出售好的物品。一旦你知道 *时间* ，推荐 *哪些* 产品的问题变得不再重要，因为有很多好的产品值得推荐。在错误的时间，无论如何都没有值得推荐的东西。改变问题使问题变得更加容易。

### 从小处开始

在构建原始系统的时候，如果可以只涉及少数几个情况或只有一个子问题是很好的一种方法。这使你可以集中精力并获得相关领域的专业知识，并在构建模型时获得公司的支持。

### 从大数据开始

确保你获得足够多的训练集数据。事实上最好可以确保你获得的数量超出你认为需要的10倍。

### 领域的知识仍然很重要

在机器学习中，弄清楚模型如何做出决定或做出预测是一回事，但找出真正重要的问题更为重要。因此，如果你已经掌握了很多领域知识，那么你更有可能提出恰当的问题，同时能够将机器学习融入可行的产品中。领域知识对于确定哪些需要做出判断以及哪里需要增加判断至关重要。

### 编码技巧仍然很重要

有许多工具旨在让你只使用拖放工具来构建机器学习模型。事实上，构建机器学习系统的大部分工作与机器学习或模型无关，而是与收集训练数据和构建使用模型输出结果的系统有关。这就要求有良好的编码技能，能够编写不同的风格（语言）的代码用于操作数据，但这并不难学会。因此，开发人员的基本技能在许多机器学习中都是有用的技能。

许多工具和新技术正在变得容易使用，几乎所有软件工程师都可以构建使用机器学习来做一些惊人事情的系统。基础软件工程技能在构建这些系统时非常有价值，但你需要通过一些数据集中来增强它们。掌握这些新技能的最佳方法是从今天开始建立一些有趣的东西。

\---

*Ted Dunning是MapR Technologies的首席应用程序架构师，也是Apache Software Foundation的董事会成员。 他是PMC成员和Apache Mahout，Apache Zookeeper和Apache Drill项目的贡献者，也是各种孵化器项目的导师。 他是MusicMatch（现为雅虎音乐）和Veoh推荐系统的首席架构师，并为ID Analytics（LifeLock）构建了欺诈检测系统。 他在谢菲尔德大学计算机科学获博士学位，迄今已发布的24项专利。 他与人合着了大量有关大数据主题的书籍，其中包括O'Reilly出版的有关机器学习的书籍。 在推特上找到他为@ted_dunning。*  

**新技术论坛（New Tech Forum）提供了一个以前所未有的深度和广度探索和讨论新兴企业技术的场所。 选择的话题是基于我们认为对InfoWorld读者最重要和最感兴趣的技术。 InfoWorld不接受发布的营销材料，并保留编辑所有贡献内容的权利。 将所有问题发送至newtechforum@infoworld.com **
