其实,机器学习一直在解决着各种重要的问题。比如说90年代中期,人们已经开始用神经网络来扫描信用卡交易记录,从中找到欺诈行为;90年代末,Google把这项技术用到了网络搜索上。
但在那个时候,机器学习还和普通的工程师无缘。开发一个机器学习系统,需要读个PhD,还得找到一群想法类似、志同道合的朋友。
现在,机器学习终于更强大也更亲民了。
一个普通的软件工程师,不需要去专门回炉重造读个研究生,就能运用机器学习开发出非常不错的系统。
当然,普通的码农要用好机器学习,还得补一些课,学一些数据技能。InforWorld的这篇文章就讲述了一些技巧和策略,能够帮助开发者们更有效地使用机器学习。
让数据说话
在良好的软件工程实践过程中,你经常能通过推理得到所需的设计,写好软件部分,然后直接且独立地对这个解决方案进行检验。
有时候,你甚至能从数学上证明你软件是正确的。但这在实际问题中往往较难实现,尤其是要考虑人类参与的时候,但如果你有良好的规范,你仍可以执行一个正确的解决方案。
但机器学习不一样。大体上,你不需要一个严格的规范。你有了能表示系统以往经验的数据,然后需要的是建立一个能够在未来奏效的系统。
为了测试系统是否真的奏效,你需要在真实情况中评估它的表现。切换到这种“重数据,轻阐述”的开发模式会有很大阻力,但这是你构建机器学习系统的关键一步。
学会辨识更优的模型
比较两个数字的大小是很简单的事情。假设它们都是有效的值(不是非数字类型),你只需要判断哪个值更大,就结束了。
而在比较机器学习的准确性时,问题就不这么简单了。
你要比较的模型有大量的输出结果,而没有一个明确的答案。构建机器学习系统所需的一项非常基本的能力,就是通过观察两个模型之前制定的决策,决定哪个模型更符合你的问题情境。
做出这个判断,你需要将这些数据做整体考虑而不是某个单一的值。这通常也需要你能够很好地进行数据可视化,比如说使用柱状图,散点图和许多其他相关的数据表示方式。
对你的结论保持怀疑
与判断哪个模型更好一样,对你自己的结论保持怀疑同样很重要。
你的结果是否只是统计上的偶然,数据变多后就不再成立?在你评估后情况是否发生了变化,因此之前的决策是否仍有效?
搭建一个内嵌机器学习的系统意味着你需要时刻确认系统依然在做你一开始布置的任务。这种怀疑精神是在变化的现实情况中进行模糊比较所必须的品质。
搭建多个模型以便筛选
在软件行业有一句老话,你构建的第一版系统是注定要扔掉的。这句话的含义是,直到你实实在在搭建了一个有效的系统之后,你才能充分理解问题从而更好地搭建系统。所以你可以先通过构建一个版本来积累经验,随后把学到的经验应用到设计中,构建出实际的系统。
对于机器学习来说,情形相同乃至更甚。搭建一个系统来练手还不够,你要做好搭建数十上百个版本的准备。有些版本可能用的是不同的学习方式,或者只是不同的参数设置;另外一些版本则是对问题或者训练数据完全不同的重述。
举例来说,你可能会发现在你想预测的信号之外,还可以用其它的替代信号来训练模型。这样,你可能会有十倍于原始的数据来训练。或者你可以去尝试用另一种方式来重述问题,使其变得更易解决。
这个世界瞬息万变。比如说你搭建模型检测欺诈行为的时候,即便你已经搭建了一个成功的系统,仍需要在未来适时做出改变。因为骗子会识别出你的漏洞,从而改变它们的行为。你将会被迫采取新的对策。
所以为了取得成功,你需要搭建一系列用来丢弃的机器学习模型。不要寄希望于有一个永久适用的万能模型。
无畏于改变
开始你想用机器学习解决的问题情景通常是不对的,甚至可能大错特错。因此,可能会遇到根本无法训练的模型,或是收集不到用于训练的数据,又或者模型训练出的最优结果却价值有限。
重新审视这个问题,可能会使得一个简单的模型就具有很高的价值。
我曾经遇到过一个有关推荐商品的问题,哪怕用上一些高大上的技能,想获得一点微博的收益也很难。
但实际上,我们应该关注的高价值问题是优秀的商品何时上市。只要你知道了这个时间点,就有很多好商品可供选择,“推荐什么产品”这个问题就迎刃而解了。
重新定义问题,让整个项目更容易解决了。
“从小处做起”
将你的原始系统应用到一些简单情形或者是一个子问题上,是有很价值的。这会让你集中精力获得该问题领域的专业知识,并在搭建模型的过程中得到同伴的支持。
“从大处落笔”
确认你拥有足够多的训练数据。事实上,如果可能的话,你要收集10倍于本来预想中所需的数据量。
专业知识仍然很重要
在机器学习中,搞清楚一个模型怎样决策或预测是一件事,更重要的是搞清楚真正的问题在哪。
就这点而论,如果你已经拥有很多专业知识,那你更有可能提出恰当的问题,从而能够将机器学习用到一个可行的产品中。要正确判断哪里需要仔细检查,专业知识非常关键。
编程能力仍然很重要
有很多工具意图让你仅通过简单拖拽就完成搭建机器学习模型的过程。事实上,搭建机器学习系统的大部分工作跟机器学习或者模型毫无关系,而是在于收集数据以及搭建能够使用模型输出结果的系统。
于是,拥有良好的编程技能尤为重要。
尽管不同人在处理数据的代码上存在一些风格的差异,但彼此间要相互理解并不难。所以开发的能力在很多机器学习的问题中非常有用。
现在有很多工具和新兴技术,让几乎所有的软件工程师能够针对有趣的问题开发出相应的机器学习系统。基本的程序开发技能将会在这个搭建过程中非常有用,但在使用它们的时候你需要多多关注数据。
掌握这些新技能的最好方式,是从现在开始动手搭建一些有趣的东西。
网友评论