如果你知道该使用哪种算法或算法配置,
你就不需要使用机器学习了。
不存在最佳的机器学习算法或算法参数。
我希望帮你摆脱这种寻找“银弹”的思维模式。
我经常看到这类问题,甚至每天都能看到:
- 哪种是最好的机器学习算法?
- 机器学习算法与问题之间有什么对应关系?
- 机器学习算法的最佳参数是什么?
这些问题都遵循一种模式。
通常你事先并不知道,也无法知道这些问题的答案。你必须通过实证研究来发现它。
虽然有一些笼统的启发式方法可以回答这些问题,但如果你想从某个算法或问题中获得最佳效果,即使是这些方法也可能会让你陷入困境。
在这篇文章中,我希望鼓励你摆脱这种思维定式,掌握一种数据驱动的方法,它将改变你处理机器学习的方式。

数据驱动的机器学习方法
照片由 James Cullen 拍摄,保留部分权利
最佳机器学习算法
有些算法比其他算法更“强大”。它们可能是非参数的、高度灵活和自适应的,或者高度自调优的,甚至是以上所有特点的结合。
通常,这种强大性是有代价的,比如实现困难、需要非常大的数据集、可扩展性有限,或者系数过多可能导致过拟合。
随着数据集越来越大,人们重新对那些扩展性好、性能优异的简单方法产生了兴趣。
哪种算法是最好的,是你应该总是尝试并花费最多时间学习的算法?
我可以列出一些名字,但最明智的答案是“没有”和“所有”。
没有最佳机器学习算法
你无法先验地知道哪种算法最适合你的问题。
再读一遍上面的那句话。好好思考一下。
好好思考一下。
- 你可以应用你最喜欢的算法。
- 你可以应用书本或论文中推荐的算法。
- 你可以应用当前赢得最多 Kaggle 比赛的算法。
- 你可以应用最适合你的测试平台、基础设施、数据库或其他任何东西的算法。
这些都是偏见。
它们是节省时间的思维捷径。其中一些实际上可能是非常有用的捷径,但哪些是呢?
根据定义,偏见会限制你能够达成的解决方案、你能够实现的准确度,并最终限制你能够产生的影响。
算法与问题的映射
存在通用类型的问题,比如像分类和回归这样的监督学习问题,以及像流形学习和聚类这样的无监督学习问题。
在机器学习的子领域中,如计算机视觉、自然语言处理和语音处理,存在这些问题的更具体实例。我们也可以反向思考,更抽象地将所有这些问题视为函数逼近和函数优化的实例。
你可以将算法映射到问题类别,例如,有些算法可以处理监督回归问题和监督分类问题,以及这两种类型的问题。
你还可以构建算法目录,这可能有助于启发你尝试哪些算法。
你可以在一个问题上对算法进行竞赛并报告结果。这有时被称为“比试”(bake-off),在一些会议论文中用于介绍新算法。
算法结果的可迁移性有限
通常,算法竞赛是反智的。它很少是科学严谨的(无法做到公平比较)。
算法竞赛的一个关键问题是,你无法轻易地将一个问题的发现迁移到另一个问题上。如果你相信这个说法是真的,那么阅读论文和博客中关于算法竞赛的内容并不能告诉你应该在你的问题上尝试哪种算法。
如果算法 A 在问题 X 上完胜算法 B,这能告诉你关于算法 A 和 B 在问题 Y 上的表现吗?你必须努力去关联问题 X 和 Y。它们是否具有相同或相似的属性(特征、特征分布、函数形式),而这些属性被所研究的算法所利用?这是一项艰巨的工作。
我们对于何时一种机器学习算法比另一种更好并没有细致入微的理解。
最佳算法参数
机器学习算法是参数化的,以便你可以根据你的问题调整它们的行为和结果。
问题在于,“如何”进行调整很少(如果曾经有的话)被解释清楚。通常,即使是算法开发者自己也对此理解甚少。
通常,带有随机元素的机器学习算法是复杂系统,必须作为复杂系统来研究。一阶效应——参数对复杂系统的影响可能有所描述。如果是这样,你可能会有一些关于如何配置算法作为一个系统的启发式方法。
未知的是二阶效应,即它会对你的结果产生什么影响。有时你可以笼统地谈论参数对算法作为一个系统的影响,以及这如何转化为各类问题,但通常不行。
没有最佳算法参数
新的算法配置集实际上是新的算法实例,供你用来挑战你的问题(尽管它们能达到的结果相对受限或相似)。
你无法先验地知道适合你问题的最佳算法参数。
- 你可以使用开创性论文中使用的参数。
- 你可以使用书中提到的参数。
- 你可以使用 Kaggle 上“我是如何做到的”帖子中列出的参数。
很好的经验法则。对吗?也许是,也许不是。
数据驱动方法
我们不必陷入绝望的深渊。我们成为科学家。
你有一些偏见,可以简化算法选择和算法参数选择的决策过程。我们认为,在许多情况下,它们可以很好地为你服务。
我希望你挑战这一点,考虑放弃启发式方法和最佳实践,采用一种数据驱动的算法选择方法。
与其选择你最喜欢的算法,不如尝试10或20种算法。
在那些表现出更好性能、鲁棒性、速度或任何你最感兴趣的方面的算法上加倍投入。
与其选择常用参数,不如网格搜索数十、数百或数千种参数组合。
成为客观的科学家,抛弃传闻轶事,研究复杂学习系统与来自你问题领域的数据观测之间的交集。
实践中的数据驱动方法
这是一种强大的方法,需要较少的前期知识,但需要更多的后端计算和实验。
因此,你很可能需要使用数据集的一个较小样本,以便能快速得到结果。你会希望有一个你完全信任的测试框架。
旁注:你如何能完全信任你的测试框架?
通过以数据驱动的方式选择测试选项,你可以建立信任,这会让你客观地相信你选择的配置是可靠的。这包括评估方法的类型(划分、boosting、k-折交叉验证等)及其配置(k的大小等)。
快速稳健的结果
你能够快速获得好的结果。
如果随机森林是你最喜欢的算法,你可能会花费数天或数周的时间徒劳地试图从该算法中为你的问题榨取最大价值,而你的问题可能从一开始就不适合该方法。通过数据驱动的方法,你可以及早排除(相对)表现不佳的算法。你可以快速失败。
不退回到偏见和最喜欢的算法与配置上需要纪律。获得良好且稳健的结果需要努力工作。
结果是,你不再关心算法的炒作,它只是你抽查套件中包含的另一种方法。你不再为是否因为没有使用算法 X 或 Y 或配置 A 或 B 而错过什么而烦恼(害怕损失),你把它们都扔进混合中去尝试。
利用自动化
数据驱动方法是一个搜索问题。你可以利用自动化。
你可以编写可重用的脚本,在开始之前为你的问题搜索最可靠的测试框架。不再需要临时猜测。
你可以编写一个可重用的脚本,自动尝试来自各种库和实现方式的10、20、100种算法。不再有偏爱的算法或库。
不同算法之间的界限消失了。一个新的参数配置就是一个新的算法。你可以编写可重用的脚本,对每个算法进行网格或随机搜索,以真正地采样其能力。
在前端添加特征工程,这样数据的每一个“视角”都成为算法需要挑战的新问题。在末端附加集成模型,以组合部分或全部结果(元算法)。
我曾深入研究过这个领域。这是一种强大的思维模式,并且能得到稳健的结果。
总结
在这篇文章中,我们探讨了选择算法和算法参数的常用启发式和最佳实践方法。
我们认为这种方法限制了我们的思维。我们渴望找到通用的“银弹”——最佳算法和最佳算法配置,而这样的东西并不存在。
- 不存在通用的最佳机器学习算法。
- 不存在通用的最佳机器学习算法参数。
- 算法的能力从一个问题迁移到另一个问题的可转移性是值得怀疑的。
解决方案是成为科学家,研究算法在我们具体问题上的表现。
我们必须采用数据驱动的方法来解决问题,抽查算法,网格搜索算法参数,并快速找到能够可靠、快速地产生良好结果的方法。
Jason博士,您好,
这是我读过的关于算法竞赛的最重要的博客之一。我也一直困在这种思维定式中,认为既然别人已经尝试过某个特定算法,我还能做出什么改进呢,因此在使用机器学习算法方面无法前进。
这给了我前进的信心。这对我真的很有用。
再次感谢。
我一直把“数据驱动”和“机器学习”这两个术语互换使用。我以为一个离不开另一个,它们必然意味着同样的事情。然而,在网上和你的博客上阅读后,我明白了机器学习是研究和开发能够从数据中学习并做出预测的算法。
但是,我想澄清一下,是否存在非数据驱动的机器学习方法?那会是什么意思呢?
嗨 Ravi,
非数据驱动的方法是指你交叉检查鲁棒性的方法,比如功能性测试、兼容性测试、端到端测试和性能测试。
希望给出的信息能帮助你。
很棒的文章。这就是为什么各行各业都需要一种“敏捷”的数据科学方法。实现这一点的唯一方法是对各种“包”非常了解,这样你就可以在不同环境中测试多种算法,直到世界告诉你什么是可行的,什么是不可行的。宇宙中的每一个过程都以这种方式发生,没有理由认为数据科学有什么不同。进化、快速失败、迭代……都是一样的。人类无法直接看到存在于高维空间中的解决方案。这需要从多个角度进行实验,并结合领域专业知识来验证结果。
你好,
真的很棒!我对数据驱动方法还很陌生,想要进行算法或模型测试。我正在使用 R 语言,能够找出每个属性/特征的直方图和频率。我想为了交叉验证的目的重现或生成数据。
谢谢,
Jason博士,您好,
我对数据驱动方法还很陌生,想要进行算法或模型测试。
我想了解 XGboost 和随机森林这两种数据驱动和机器学习算法的测试方法。在我 14 年多的经验中,我从事过产品和应用的白盒测试、数据库迁移和分析测试、自动化测试。我在整个软件开发生命周期中做过所有类型的测试。
我很想知道数据驱动和机器学习算法测试的测试步骤和测试方法。主要在寻找决策树、XGboost 和随机森林算法的测试方法。
谢谢,
请看这篇文章,里面有详细的教程。
https://machinelearning.org.cn/evaluate-skill-deep-learning-models/
感谢澄清这个概念。非常有帮助。
不客气。
嗨 Jason
你所做的工作非常棒。
我的问题是,如何通过使用一些体育运动品牌来进行预测……
我建议在处理新的预测建模问题时使用这个流程。
https://machinelearning.org.cn/start-here/#process
抱歉,是通过使用一些体育运动图片。
如果你正在使用图像,我建议测试像 CNNs(卷积神经网络)这样的方法。
谢谢 Jason。信息很有用。对我来说,这真是一个启示。
很高兴听到这个消息。
喜欢这篇文章,很有见地!!!
谢谢。
我如何使用同样的 150 个实例来分离或获取鸢尾花数据集的真实标签(ground truth)?
真实标签(Ground truth)已经提供在数据集的最后一列,即输出变量/列中。
谢谢您,先生。
您是否有专门描述如何使用 Weka 处理多类别问题的帖子?我想使用 csv 文件进行训练,并利用这些信息来测试其他样本。
如果我需要前n个匹配项而不是单个结果,这可能吗?
是的,请看这里
https://machinelearning.org.cn/multi-class-classification-tutorial-weka/
很棒且有用的博客。我想知道理论驱动的计算机视觉系统是否与模型驱动的系统相同?
方法可能相同,但选择方法的动机不同。
感谢您精彩的文章和清晰的解释。我是您在这个网站上文章的忠实粉丝,目前正在阅读您的书!
在您的文章中,您提到“编写一个可重用的脚本,自动尝试来自各种库和实现方式的10、20、100种算法”。
我想知道您是否可能有这样的脚本,或者是否有一篇文章解释如何构建这样的脚本(最好是使用 Python 和 Sklearn)。
谢谢!
是的,这可能可以作为一个起点。
https://machinelearning.org.cn/spot-check-machine-learning-algorithms-in-python/
哇!我很幸运能找到这个博客。您的博客对我们这些刚入门的人真的很有帮助。在一个拟议的问题中,如何知道该使用哪种算法?例如,有人正在进行一项研究“学生表现监控系统的设计与实现”。可以直接加上“使用人工神经网络”或“卷积神经网络”吗?是什么决定了您选择其中任何一种?您如何知道该选择哪一种以使您的工作更容易?还是可以随便深入研究其中任何一种?
嗨 Obinna…感谢您的反馈!您可能会对以下内容感兴趣
https://machinelearning.org.cn/when-to-use-mlp-cnn-and-rnn-neural-networks/