首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >支招 | 构建机器学习系统的六个重要步骤

支招 | 构建机器学习系统的六个重要步骤

作者头像
AI研习社
发布2019-09-19 15:56:42
7690
发布2019-09-19 15:56:42
举报
文章被收录于专栏:AI研习社AI研习社

原标题 | Six Important Steps to Build a Machine Learning System

作 者 | Rahul Agarwal

翻 译 | Pita、邺调(江苏科技大学)

图片来自:Pixabay

构建一个伟大的机器学习系统是一门讲究的艺术。

在构建的过程中,你需要考虑很多事情。但是作为数据科学家的我们往往只担心了项目的其中某些部分。

尽管大部分时间都在建模,但实际上,机器学习项目的成功或失败取决于许多其他因素。

机器学习管道不仅仅是创建模型

在培训模型之前以及培训模型并将其部署到生产中之后,了解其中发生了什么是至关重要的。

这篇文章是关于解释端到端数据项目管道涉及的内容。这是我在职业生涯中很晚才学到的东西。

1.问题定义


非常显然,第一个重要步骤就是 定义问题

而且,这可能是整个构建机器学习系统过程中最重要的部分。

那么,我们如何为机器学习定义问题呢?

这取决于很多因素。在我们考虑的所有要素中,第一个应该是了解它将如何使业务受益。

这也是任何数据科学项目的圣杯,如果你的项目无法为业务带来帮助,那么这个项目将不会部署并走向终结。

一旦你有了想法并确定了业务的兼容性,你就需要定义一个项目成功的衡量标准。

那么问题来了,怎样才算项目成功了呢?

是达到90%,95%还是达到99%就算成功了呢?

在我看来,可能70%的预测准确性我就已经感到很满意了,因为普通人不会超过这个准确度,同时,你可以让这个过程自动化。

注意了,现阶段不应该定这么高的(准确度)目标,是时候理智地对待每1%的准确度变化如何影响项目的成功。

举个例子:对于点击预测问题/欺诈应用,与审查情绪预测的准确度增加1%相比,1%的准确度增加将提升它们的业务底线。

并非所有准确度的增加带来的结果都是相同的。

2.数据


在为你的机器学习模型进行数据获取和数据创建时,你需要思考几个问题。

需要回答的最重要的问题是:这个模型需要实时工作吗?

如果你的回答是“是”的话,这种情况就无法使用Hive / Hadoop等系统来进行数据存储,因为这类系统可能会引入大量延迟,并且更适合离线批处理。

问题2:你的模型需要实时训练吗?

如果机器学习模型的性能表现随着时间的推移而降低,如上图所示,那么应该考虑进行实时训练。随着互联网趋势的变化相当快,实时训练可能对大多数的点击预测系统更有益。

问题3:测试和训练的数据之间是否存在不一致情况?

或者用简单的话来说 - 你是否怀疑生产数据来自与培训数据不同的分布?

例如:在针对点击预测问题的实时训练中,你向用户展示了广告,而他没有点击。这是一个失败的例子吗?通常用户可能会在10分钟后才进行点击。但是你已经创建了数据并在此基础上训练了你的模型。

在为你设计的模型准备数据时,你应该考虑许多因素。在这个阶段,你需要提出问题并从头到尾思考整个过程才能成功。

3.评估分析


我们应该如何评估分析我们设计的模型的表现呢?

这里的黄金标准是训练-测试-验证拆分。

经常,我们会通过采样来制作训练验证测试集,但是我们忘记了一个隐含的假设 —— 数据很少是IID(独立且恒等分布)。

简单来说,我们假设每个数据点彼此独立且恒等分布,即使不是完全错误的,至少也是错误的。

对于一家互联网公司而言,2007年的数据点与2019年的数据点是截然不同的。由于很多因素,互联网发展的速度才是最重要的,因此它们并非来自相同的分布。

如果你有做过猫与狗的预测问题,那么随机抽样方面的就会表现得非常好。但是,在大多数机器学习模型中,它们的任务是预测未来。

你可以考虑使用时间变量拆分数据,而不是从数据中随机抽样。例如:对于点击预测问题,你可以将上个月的所有过去的数据作为上个月的训练数据和验证数据。

你要考虑的下一个因素是基线模型。

假设我们使用RMSE作为时间序列模型的评估指标。我们在测试集上评估了模型,结果RMSE为4.8。

所以这是个好的RMSE吗?咱也不敢问,咱也不知道啊。因此我们需要一个基线RMSE,它可能来自当前用于相同任务的模型。或者使用一些简单的模型。对于时间序列模型,失败的基线是对最后一天的预测,即预测前一天的数量。

对于NLP分类模型,我通常会将基线设置为Countvectorizer(Bag of words)上Logistic回归模型的评价指标(precision, F1, log loss)。

你还应该考虑如何在多个组中打破评估,这样你的模型不会导致不必要的偏差。

去年,亚马逊被曝正在秘密使用人工智能招聘工具的消息,该工具显示出对女性的偏见。为了使得我们的机器学习模型免于这种不一致,我们需要在不同的组上评估我们的模型。也许我们的模型对于女性而言并不像男性那么准确,因为在训练数据中,女性的数量要少得多。

或者一个预测产品是否会被购买的模型对于特定的产品类别非常有效,而对于其他类别则不然。

事先牢记这些事情并准确地思考特定评估方法可能出现的问题,这无疑能帮助我们设计一个好的机器学习系统。

4.功能特性


良好的功能特性是任何机器学习模型的支柱,而且这些特性往往是你会花最多时间设计的部分。我已经看到,这个(功能特性)也是你可以进行调优以获得最大模型性能的部分。

好的功能特性的创建通常需要领域知识、创造力和大量的时间。

最重要的是,对于不同的模型,功能特性的创建练习可能会发生变化。例如,对于神经网络和XGboost,特性创建是非常不同的。

理解特性创建的各种方法本身就是一个相当大的主题。我在这里写了一篇关于特性创建的文章。点击底部【阅读原文】可戳相关链接查看:

https://towardsdatascience.com/the-hitchhikers-guide-to-feature-extraction-b4c157e96631

一旦创建了许多功能特性,接下来要做的就是删除冗余特性。以下文章有一些方法可以做到这一点:

https://towardsdatascience.com/the-5-feature-selection-algorithms-every-data-scientist-need-to-know-3a6b566efd2

5.建模


可解释的手册(https://christophm.github.io/interpretable-ml-book/terminology.html)

现在轮到我们最关心的部分了。有何不可呢?它是我们最终在项目结束时交付的部分。这就是我们花费了所有时间在数据采集和清理,特征创建和诸如此类的部分。

那么在创建模型时我们需要考虑什么?

可能你需要问自己的第一个问题是,你的模型是否需要可解释?

在相当多的用例中,业务可能需要一个可解释的模型。其中一个这样的用例是,当我们想要做属性建模的时候。我们在这里定义了各种广告流(电视、广播、报纸等)对收入的影响。在这种情况下,了解来自每个广告流的响应就变得很有必要。

如果我们需要最大限度地提高精度或其他指标,我们仍然希望使用像NeuralNets或XGBoost这样的黑盒模型。

除了模型选择之外,你还应该考虑其他事项:

  • 模型架构:nns有多少层,gbt有多少树,或者您需要为线性模型创建特性交互。
  • 如何优化超参数?:您应该尝试自动执行此部分。市场上有很多这样的工具。我倾向于使用hyperopt。

6.实验


现在你已经创建了模型,它的性能比基线或者你当前的模型表现得更好。我们该如何继续研究呢?

我们有两个选择:

  1. 在进一步改进我们的模型时进入一个无止境的循环。
  2. 在生产环境中测试我们的模型,了解可能出现的问题,然后通过持续集成继续改进我们的模型。

我更喜欢第二种方法。Andrew Ng说,在他的第三门课程中【敬请点击阅读原文访问相关链接】,他命名为“深入学习专业化的机器学习项目”—

“不要一开始就试图设计和构建完美的系统。相反,快速构建和训练一个基本的系统——也许只需几天。即使基本系统离你能建立的“最佳”系统还很远,但研究基本系统的功能是很有价值的:你会很快找到线索,告诉你最有希望的方向,在哪方面投入时间。”

我还想强调的一点是持续整合。如果当前模型的性能比现有模型好,为什么不在生产中部署它,而不是在增量收益之后运行呢?

要测试你的模型优于现有模型的假设的有效性,可以设置A/B测试。一些用户(测试组)看到你的模型,而一些用户(控件)看到来自上一个模型的预测。

你应该始终致力于最大程度地缩短模型首次在线实验的时间。这不仅产生了价值,还让你了解了你的模型存在的缺点与实时反馈,然后你可以第一时间进行处理。

结论


在机器学习中没有什么是简单的。不应该有任何假设。

在构建机器学习管道时,你应该始终对所做的任何决策保持批评态度。

一个简单的决定可能是你的机器学习项目成败的区别。

所以要明智地思考,多思考。

这篇文章是增加我对机器学习生态系统的理解的一部分,灵感来自Facebook工程团队的一组很棒的视频(https://research.fb.com/videos/?cat=3)。

如果你想了解更多关于如何构建机器学习项目和最佳实践的知识,我想请他(Andrew Ng)在Coursera Deep Learning Specialization中推出的第三门非常棒的课程名为结构化机器学习项目。一定要去看看。【敬请点击阅读原文访问相关链接】

谢谢你的阅读。我也会在未来写更多适合初学者的帖子。请在medium上关注我(https://medium.com/@rahul_agarwal),或订阅我的博客(http://eepurl.com/dbQnuX)以了解他们的情况。一如既往,我欢迎反馈和建设性的批评,可以在twitter@mlwhiz上联系到我。

作者@rahul agarwal

via https://towardsdatascience.com/6-important-steps-to-build-a-machine-learning-system-d75e3b83686

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 5.建模
  • 结论
相关产品与服务
持续集成
CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档