应用机器学习流程

解决预测建模问题的系统化流程
能够带来高于平均水平的结果

随着时间的推移,在处理应用机器学习问题的过程中,你会形成一种模式或流程,以快速获得良好且稳健的结果。

一旦形成,你可以在一个又一个项目上反复使用这个流程。你的流程越稳健、越成熟,你就能越快地获得可靠的结果。

在这篇文章中,我想与你分享我处理机器学习问题的流程框架。

你可以将其用作下一个项目的起点或模板。

五步系统化流程

我喜欢使用一个五步流程:

  1. 1. 定义问题
  2. 2. 准备数据
  3. 3. 抽查算法
  4. 4. 改进结果
  5. 5. 呈现结果

这个流程有很大的灵活性。例如,“准备数据”这一步通常被分解为分析数据(总结和绘图)和准备数据(为实验准备样本)。“抽查算法”这一步可能涉及多个正式的实验。

这是一条我尽量以线性方式推进的庞大生产线。使用自动化工具的好处在于,你可以回退几步(比如从“改进结果”回到“准备数据”),插入一个新的数据集转换,然后重新运行中间步骤的实验,看看会产生什么有趣的结果,以及它们与你之前执行的实验有何不同。

Production Line

生产线
照片由 East Capital 提供,保留部分权利

我使用的流程改编自标准的数据挖掘流程——数据库中的知识发现(或KDD)。更多详情请参见文章什么是数据挖掘和KDD

1. 定义问题

我喜欢用一个三步流程来定义问题。我喜欢快速行动,并使用这个迷你流程从几个不同角度快速审视问题。

  • 第1步:问题是什么?非正式地和正式地描述问题,并列出假设和类似的问题。
  • 第2步:为什么需要解决这个问题?列出你解决问题的动机、解决方案带来的好处以及解决方案将如何被使用。
  • 第3步:我将如何解决问题?描述如何手动解决问题,以充分利用领域知识。

你可以在这篇文章中了解更多关于这个流程的信息:

2. 准备数据

在数据准备之前,我有一个数据分析阶段,包括总结属性并使用散点图和直方图进行可视化。我也喜欢详细描述每个属性以及属性之间的关系。这项基础工作迫使我在数据被算法处理之前,结合问题背景来思考数据。

实际的数据准备过程分为三步,如下所示:

  • 第1步:数据选择:考虑哪些数据是可用的,哪些数据是缺失的,以及哪些数据可以被移除。
  • 第2步:数据预处理:通过格式化、清洗和采样来组织你选择的数据。
  • 第3步:数据转换:通过使用缩放、属性分解和属性聚合等特征工程方法,转换预处理后的数据,为机器学习做好准备。

你可以在这篇文章中了解更多关于准备数据的流程:

3. 抽查算法

我默认在我的测试框架中使用10折交叉验证。所有实验(算法和数据集的组合)都重复10次,收集并报告准确率的平均值和标准差。我还使用统计显著性检验来从噪声中筛选出有意义的结果。箱形图对于总结每个算法和数据集对的准确率结果分布非常有用。

我抽查算法,这意味着将一批标准的机器学习算法加载到我的测试框架中,并进行正式的实验。我通常会在我准备的所有转换和缩放版本的数据集上,运行来自所有主要算法家族的10-20种标准算法。

抽查的目标是筛选出那些擅长捕捉问题结构的算法和数据集组合,以便通过集中的实验进行更详细的研究。

在这一步中,可能会对表现良好的算法家族进行更集中的实验,但算法调优则留到下一步进行。

你可以在这篇文章中发现更多关于定义你的测试框架的信息:

你可以在这篇文章中发现抽查算法的重要性:

4. 改进结果

抽查之后,就该从这个系统中榨取出最好的结果了。我通过对表现最佳的算法参数进行自动化的敏感性分析来做到这一点。我还设计并运行使用表现最佳算法的标准集成方法的实验。我投入大量时间思考如何从数据集或已被证明表现良好的算法家族中获得更多信息。

再次强调,结果的统计显著性在这里至关重要。人们很容易专注于方法并摆弄算法配置。只有当结果是显著的,并且所有配置都经过深思熟虑,实验是批量执行的,结果才有意义。我还喜欢为每个问题维护一个我自己的最佳结果排行榜。

总而言之,改进结果的过程包括:

  • 算法调优:将发现最佳模型视为在模型参数空间中的搜索问题。
  • 集成方法:将多个模型做出的预测进行组合。
  • 极致的特征工程:将数据准备中看到的属性分解和聚合推向极限。

你可以在这篇文章中发现更多关于这个过程的信息:

5. 呈现结果

一个复杂的机器学习问题的结果,除非被付诸实践,否则毫无意义。这通常意味着要向利益相关者进行演示。即使是比赛或者我为自己研究的问题,我仍然会走一遍呈现结果的流程。这是一个好习惯,能给我带来清晰的经验,以便下次可以借鉴。

我用来呈现结果的模板如下,它可以是文本文档、正式报告或演示幻灯片的形式。

  • 背景(为什么):定义问题存在的环境,并阐述研究问题的动机。
  • 问题(是什么):将问题简洁地描述为一个你着手去回答的问题。
  • 解决方案(答案):将解决方案简洁地描述为你对上一节提出的问题的回答。要具体。
  • 发现:用项目符号列表列出你在过程中发现的、能引起听众兴趣的发现。这些可能是在数据中发现的,哪些方法有效或无效,或者你在过程中实现的模型性能提升。
  • 局限性:考虑模型在哪些方面不起作用,或者模型没有回答哪些问题。不要回避这些问题,如果你能定义模型不擅长的领域,那么定义它擅长的领域会更可信。
  • 结论(为什么+问题+答案):用一个紧凑的小结重温“为什么”、研究问题和你发现的答案,这个小结便于自己和他人记忆和复述。

你可以在这篇文章中发现更多关于使用机器学习项目结果的信息:

总结

在这篇文章中,你学习了处理机器学习问题的一般模板。

我几乎每次都使用这个流程,并且我在各种平台上都使用它,从Weka、R 和 scikit-learn,甚至到我一直在尝试的新平台,如 pylearn2。

你的流程是怎样的,留言分享一下吧?

你会复制这个流程吗?如果会,你会对它做哪些改动?

应用机器学习流程的117条回应

  1. sadegh 2015年5月7日,下午4:31 #

    谢谢

    • Vipin 2020年7月29日,晚上8:56 #

      嗨,Jason!我大学毕业快两年了,在排除了很多职业道路选择后,我想长期学习机器学习和人工智能,以实现我的一些梦想项目。

      所以我有一个疑问。也许我在你的文章中某个地方错过了这一点,我不知道。也许听起来有点傻,但如果你能回答这个问题,将会很有帮助。

      我理解你的五步系统化流程,但是你能给我一点提示吗,在Weka工具中对所有兼容的算法及其补充过程进行抽查后,你将如何从像Weka这样的工具中提取你的模型,以及你将如何实现它们。例如,以最流行的鸢尾花数据集为例。

  2. json 2015年7月15日,上午5:10 #

    非常有帮助的帖子

    • Paul 2019年6月30日,上午11:03 #

      非常感谢这篇精彩的文章,让我反思了自己在这方面实施的一些流程。水平和语言都非常出色。

  3. Raihan Masud 2015年9月22日,上午5:52 #

    考虑周全的流程。在数据选择/预处理之后或期间添加可视化以查看数据分布怎么样?你可能在数据准备步骤中已经隐式地这样做了。感谢分享你的流程。非常有用。

  4. Robert Chumley 2016年4月2日,上午12:45 #

    我喜欢采用敏捷方法来处理机器学习,我们首先应用并寻找最高优先级的成果。数据本身可能蕴含巨大价值,从利益相关者的角度出发,了解他们希望从数据中实现什么目标非常重要。然后,根据利益相关者期望的成果列表,反向工作,基于结果找到个体价值。我还会增加一个额外的形式化步骤,将结果编写成代码并放入可重用的模块中。这样,我们就可以随时为将来的应用重用这些结果。

    • Utku 2018年12月21日,上午9:40 #

      这篇文章没有考虑一个完全面向商业的视角。它旨在为机器学习等算法的研究提供一个如何分解和分析问题的思路。

      从行业的角度来看,我完全同意Jason的观点。在商业语言中,这个流程被称为“瀑布式”(基于流程的)。目前行业中的趋势是敏捷方法。

      • Danilo Burbano 2019年1月24日,晚上9:51 #

        有趣,敏捷方法也可以用于机器学习项目,能分享一些参考资料吗?

  5. ali 2016年7月1日,晚上9:37 #

    你好
    哪种神经网络在垃圾邮件检测方面效果更好?
    我可以在Weka上尝试吗?
    我正在寻找包含内容和非内容属性的数据集
    我的意思是,既有内容特征,也有非内容特征,比如电子邮件长度、发送时间和日期、IP地址等。

    • Jason Brownlee 2016年7月2日,上午6:19 #

      我的建议是尝试一套不同的算法,看看哪种在你的问题上效果最好。

      • Ali 2019年3月2日,上午1:54 #

        你好,
        我是深度学习的初学者,我有一张最大尺寸为256*256的灰度MRI图像。
        用深度学习进行分割最简单的语言是什么?
        我该如何使用深度学习对MRI图像进行分割,(哪种架构最适合?)
        每层需要多少个神经元?
        每层使用哪种类型的激活函数?

        • Jason Brownlee 2019年3月2日,上午9:34 #

          或许可以研究一下CNNs(卷积神经网络)。

          具体来说,可以看看像 R-CNN 和 YOLO 这样的方法。

          我希望很快能有关于这些主题的教程。

  6. Murali 2016年12月21日,晚上11:15 #

    非常感谢您的指导

  7. Jay 2017年1月3日,晚上10:40 #

    嗨,Jason,我们为交换机和路由器准备配置。所以我们知道所有的参数和预期的结果。我们能否考虑使用机器学习来自动化准备配置的过程?能否在这里提供一些指导,谢谢?

    • Jason Brownlee 2017年1月4日,上午8:54 #

      我不确定,Jay,这听起来更像是一个约束优化问题,而不是一个预测建模问题。

      试试用这个流程来定义你的问题,然后告诉我进展如何。
      https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/

    • Dante Perez 2017年1月27日,上午6:59 #

      @Jay,我从事无线分组核心网工程工作,但我理解你想要做什么。自动化脚本不适用于机器学习,因为交换机/路由器的参数都是预定义的值。但如果你想预测交换机为什么会过载,而所有指标都是正常的,那么就像Jason提到的,你可以查看交换机处理器的多个属性,如CPU、端口利用率、计数器等,以及其他导致交换机/路由器负载飙升的变量,那么是的,你可以使用机器学习来创建一个预测模型。

  8. Preeti Agarwal 2017年1月10日,下午5:34 #

    太好了,我准备尝试以上步骤。

  9. Ted 2017年1月12日,上午9:47 #

    太棒了!!

  10. Mixymol 2017年3月13日,下午3:50 #

    先生,谢谢您。我开始了。

  11. Giri 2017年3月16日,下午6:04 #

    Jason,
    对于学习/掌握特征工程,你有什么推荐(博客文章、书籍、课程等)?在我看来,它和选择合适的算法同样重要。

  12. Karunakaran 2017年4月6日,下午6:39 #

    完美的纲要

  13. prasanna 2017年5月19日,下午7:22 #

    非常有帮助。

  14. Winayak Wagle 2017年5月31日,下午8:22 #

    在获得概览和进行下一步骤方面非常有用。

  15. harouna 2017年6月10日,上午12:13 #

    非常感谢!非常有帮助!

    我发现你的博客非常有趣。

  16. Lautaro 2017年6月23日,下午12:15 #

    我爱这类帖子,它让我对这个话题的思路更清晰了。

    谢谢!

  17. ARUNESH GUPTA 2017年6月24日,上午1:12 #

    你能告诉我如何从零开始学习机器学习吗?比如我应该上什么课程,或者告诉我一些资源。

  18. Raj Kumar Thapa 2017年8月29日,上午10:53 #

    首先非常感谢,我正在攻读计算机科学硕士学位,时隔14多年重返校园。我之前从事SQL数据库方面的工作。我想用机器学习来预测未来的一些事情。我应该怎么做我的(任务模型),才能引导我高效快速地得到结果。

  19. Bill Ern 2017年9月7日,下午2:14 #

    Jason,

    这篇文章太棒了,为机器学习新手提供了一个起点,并指导他们如何解决问题。我将使用你的大纲,并根据需要进行修改。希望在解决一些问题后,我能发布所做的任何修改。

  20. Anu 2017年9月9日,下午6:53 #

    我浏览了多个网站和课程,你解释的方式无与伦比。我本来准备放弃了,现在我永远不会放弃。

  21. Shiloh 2017年11月9日,上午10:24 #

    很棒的文章。构思巧妙,信息量大。感觉你可能是一个逻辑思维很强的人 🙂

  22. Connie 2017年11月27日,上午4:11 #

    非常感谢 Brownlee 博士的分享和指导。

    这对我来说就像是为复杂的拼图找到了最后一块。

  23. Omotayo Oshiga 2017年12月21日,下午4:24 #

    很棒的帖子,Brownlee博士,

    请问,您的《Machine Learning Mastery With Python》这本书是否遵循这个流程并详细解释了它们?

  24. SarahM 2018年1月6日,上午4:13 #

    感谢您提供的这个指导性流程。您能详细解释一下定义问题中的第三步吗?因为据我所知,解决问题依赖于对数据的探索,那么我如何能在此之前就知道如何解决问题并回答这个问题:第三步:我将如何解决问题?描述如何手动解决问题以激发领域知识。

    • Jason Brownlee 2018年1月6日,上午5:56 #

      这是一个帮助开发者思考问题以及如何编写一个非机器学习解决方案的问题。

      这有帮助吗?

  25. Mohammad Ehtasham Billah 2018年1月31日,晚上9:13 #

    你好,
    你能解释一下属性分解和属性聚合吗?

  26. Mohammad Ehtasham Billah 2018年1月31日,晚上10:13 #

    在呈现结果时,我们是否需要对用于解决问题的每一个算法都走一遍你提到的所有6个点?还是只针对在那个特定问题上表现最好的最终算法?

    • Jason Brownlee 2018年2月1日,上午7:22 #

      你可以为你的项目选择如何完成这个流程。

  27. Jesús Martínez 2018年2月28日,上午12:59 #

    非常好的流程。非常感谢。

    我想知道您在每个阶段投入多少时间?平均来说,您会完整经历这五个阶段多少次?

    非常感谢您的时间和关注。

    • Jason Brownlee 2018年2月28日,上午6:05 #

      尽我所能。

      有些项目很快,只需几个小时,有些则需要几天或几周。

  28. Sachidanand Tripathi 2018年4月2日,下午4:02 #

    谢谢Jason,这确实让我对从哪里开始有了一些见解,而且所阐述的交叉验证技术太棒了,我正在把它付诸实践。

  29. phil 2018年4月24日,上午3:32 #

    你如何为信用卡建立一个流失模型?有什么想法或者阅读材料吗?关注的变量有哪些?

  30. phil 2018年4月24日,上午3:33 #

    有什么特别的算法可以使用吗?

    • Jason Brownlee 2018年4月24日,上午6:37 #

      是的,随机森林和随机梯度提升在许多问题上表现得非常好。

  31. Emmanuel 2018年6月13日,上午11:12 #

    很棒的工作,信息也很棒。谢谢Jason。你的页面一直是我的指南。

  32. Rick 2018年7月7日,下午5:42 #

    很棒的文章,我认为当你找到最佳结果时,这五个步骤应该是一个循环。

  33. ragav 2018年7月10日,晚上8:17 #

    作为一名研究人员,并且从数据从业者的角度理解,提供解决方案和方法真的太棒了。通过看你的博客,我也获得了信心,Jassson。

  34. Marco 2018年9月17日,晚上10:03 #

    您是否在您的某本书中详细描述或应用了您的机器学习五步流程?

    • Jason Brownlee 2018年9月18日,上午6:14 #

      我在我的每一本“Machine Learning Mastery with ...”系列书中都展示了如何使用这个流程,例如在R、Python和Weka中。

  35. Bisoi 2018年11月21日,晚上9:16 #

    我的流程是锁箱后端运营服务。我能得到建议吗?

  36. kooshi 2018年11月22日,上午5:10 #

    亲爱的 Jason

    我想做一个机器学习项目,但我有一个大问题,就是我选择的每个主题都有人研究过了,比如糖尿病预测和心脏病发作。

    主要问题是,我如何能理解数据集需要预测什么?(预测的属性)

    例如:https://archive.ics.uci.edu/ml/datasets/Iris 或 https://archive.ics.uci.edu/ml/datasets/Primary+Tumor

    他们想让我们做什么?

  37. Rabiu 2018年12月12日,下午7:46 #

    你好,你有没有用深度学习进行预测的matlab代码?
    谢谢帮助。

  38. madusha 2019年1月8日,晚上7:27 #

    谢谢您,先生!

  39. Ahmed 2019年1月18日,上午3:25 #

    非常感谢,你的文章真的很有帮助,我总是四处学习更多东西,然后又不经意间回到这里,花上几天时间只是阅读你的文章,从你长期的经验中学习。

  40. Nicko 2019年2月22日,晚上7:40 #

    感谢这篇内容全面的文章以及相关的文章!我刚接触机器学习,这个框架正是我现在需要的。等我有了想法会分享一些。

  41. Mohamed 2019年3月21日,晚上8:33 #

    非常感谢这些有用的信息,我只有一个小问题,基础知识或理论部分是什么,比如当你说分类器或建模或监督与非监督学习时,似乎我遗漏了一些步骤或不了解某个流程。我从哪里可以获得这些信息呢?

  42. Ngel Rojas 2019年4月3日,下午1:05 #

    干得好!

  43. sandipan sarkar 2019年6月30日,上午5:30 #

    我认为,jason,作为一个初学者,如果我全心全意地关注这个网站,我将成为机器学习的大师。

  44. Ethan Day 2019年8月22日,上午10:52 #

    你用什么软件编码?如果答案很明显,我很抱歉,但我是一个年轻的学生,渴望成为一名工程师。我喜欢解决问题,想早点开始学习机器学习。

  45. franklin 2019年9月18日,上午4:33 #

    谢谢。
    在像用电量数据这样的情况下,数据是如何采集的?是通过传感器还是其他方式?
    谢谢你

  46. Yoni Krichevsky 2019年12月12日,晚上9:19 #

    嗨,Jason,

    非常棒的网站和资源!在过去的半年里,我一直在从开发者向机器学习转型,可惜没有早点发现这个网站。

    关于抽查算法步骤和与特征工程的联系的问题。

    在准备数据和特征工程步骤中,我们可能对特征有一些疑问:某个特征是否有用,是保留特征为连续值还是将其分箱,是保留两个高度相关的特征,还是只保留其中一个,以及保留哪一个等等。

    我们可能在这个阶段选择一个初步的前进方向(比如保留所有特征,稍后进行修剪),目标是稍后验证这些假设。然后根据您描述的流程,我们会进行抽查。这将使我们只剩下几个最好的算法。

    然而,当我们稍后对特征进行一些更改(删除/添加/更改格式等)时,我们在抽查阶段放弃的算法可能会比我们剩下的备选方案表现得更好。

    一种方法是不进行抽查,并使用所有算法。然而,这样一来,这个过程在计算上和时间上都很昂贵。

    您如何处理这个问题?

    谢谢你,
    Yoni

    • Yoni Krichevsky 2019年12月13日,上午1:32 #

      另外,您如何处理不同算法需要不同特征/转换才能表现最佳的问题?我有时会为不同的模型找到两套不同的特征集,这增加了复杂性。

      • Jason Brownlee 2019年12月13日,上午6:04 #

        一个“模型”是数据准备 + 算法 + 配置。

    • Jason Brownlee 2019年12月13日,上午6:00 #

      谢谢!

      是的,当您准备数据的不同视图时,这个过程可以是迭代的。

      通过专注于视图/数据准备方法的子集,以及模型的子集,可以简化这个过程,以便了解哪些方法通常效果好,然后以此为起点进行更详细的探索。

      这有帮助吗?

      • Yoni Krichevsky 2019年12月13日,下午6:34 #

        嗨,Jason,
        不确定我是否完全理解。我已经做了很多模型,通常都非常有条理,并且取得了很好的结果。
        然而,
        1. 达到好的结果需要相当长的时间(一周或几周):找到一个非常好的特征工程视图、算法、每个算法的设置和集成。
        2. 由于不同的算法需要不同的视图,模型有时会过于复杂。
        3. 由于有几种不同的算法和视图等,模型训练时间有点长。
        4. 我经常发现自己会拿现有的代码,在非常初始的步骤上做一些改动,这就需要重做中间的许多步骤。我这样做不是心血来潮,而是作为有条理的过程和决策的一部分。

        我想知道如何简化这个过程,使其更简单、更快(无论是运行时间还是我满意结果所需的总时间)。

        您上面描述的过程似乎可以帮助我。

        然而,尽管您在其他地方写道这个过程通常是迭代的,并且您很多时候会从头开始,但具体在这篇文章中,这个过程似乎是一步接一步的,这确实会加快速度。

        然而,由于我提出的几个问题,我不确定如何在抽样检查步骤中完全剔除模型,除非它们的表现非常糟糕。如果它们与其他模型相近,如果我们不确定我们是否会改变特征,那么如何能移除算法呢?

        总的来说,您是否有更多关于如何使过程更快/不必重新开始太多次/使用更少算法的技巧和窍门?

        谢谢!

        • Jason Brownlee 2019年12月14日,上午6:12 #

          哈哈哈,是的,我也经历过同样的步骤——这并不罕见。

          我曾多次尝试自动化大部分流程,但考虑到每个新数据集的具体情况都会变化,这总是浪费时间。应用预测建模是一个难题,并且将继续如此。就像软件工程一样。我们一直在尝试自动化工作。

          是的,这个流程是一次性的,可以让你快速得到一个“足够好”的结果,这也是大多数人所需要的。我们很少需要一个真正出色的结果——除非是在Kaggle比赛中。正如你指出的,一次性的方法会让你失去很多。

          关于自动化,我可能有一些代码可以帮忙,例如:
          https://machinelearning.org.cn/spot-check-machine-learning-algorithms-in-python/

          我开发了一个很棒的代码库,也许有一天会开源。输入CSV,输出数据准备+模型+配置的摘要,给出好的/最好的结果。我基本上为自己构建了一个用于回归、分类、时间序列、不平衡分类等的机器学习SaaS。🙂

  47. Bhaskaran 2020年2月19日,下午4:47 #

    您能告诉我您出版的书名以及如何购买它们吗(亚马逊或其他方式)?感谢您所有的知识分享。

  48. Lamone 2020年3月21日,上午6:39 #

    您的网站上是否有关于将应用机器学习与应用程序相结合的部分?比如具体如何构建模型,然后将其实现到软件中。我专注于为消费者开发更智能的软件。只需要一些总体的指导。

    谢谢你

  49. George Mills 2020年7月13日,晚上10:47 #

    你似乎真的对自己的领域了如指掌。我对这个领域还相当陌生,尽管我认为我的通用编程知识相当深厚,从94年就开始编程了。我正在尝试,首先,以《世界概况》作为数据源,来确定世界有望实现的马斯洛需求层次的最佳点。对于这个问题的性质以及我可以使用的方法和技术,任何想法都将不胜感激。

    谢谢你,
    George

  50. Michael Mora-Poveda 2020年10月24日,上午4:00 #

    你好 Jason,

    感谢这篇文章,非常有用。我把你的建议保存在我的github里,以备将来参考!!!

    祝好,

    Michael

  51. JC Chouinard 2021年2月24日,上午10:47 #

    嗯,我没有一个流程。但在某些方面,做SEO实验是相似的。在不同的网站或网站的不同部分多次重复测试,丢弃没有统计显著性的测试。用箱形图总结多个实验是我从未想过的,但我会开始实施。谢谢Jason。

  52. hamidreza mazandarani 2021年4月29日,晚上11:17 #

    你好,谢谢
    我从 python.org 安装了 python
    但是我没有安装组件库 numpy 或 comcv
    >>pip install numpy
    回溯(最近一次调用)
    文件“”,行1,在
    名称错误:名称 'pip' 未定义

    谢谢你

    • Jason Brownlee 2021年4月30日,上午6:06 #

      “pip”命令是在命令提示符下运行的,而不是在python解释器中。

  53. Simon 2024年5月16日,下午1:06 #

    感谢您的巨大努力,Jason。

    • James Carmichael 2024年5月17日,上午7:19 #

      不客气,Simon!我们非常感谢您的支持!

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。