这里有可以让你做出更好预测的32个建议、诀窍与技巧。
众所周知,机器学习最重要的部分就是预测建模。
模型的成长:基于历史数据训练和在未见数据上做出预测。
而关于预测建模的首要问题就是:
怎样我才能得到更好的结果?
这个备忘录里有我最好的建议,这些建议是我从多年来自己的应用程序和学习顶尖机器学习从业者和竞赛获胜者们中提炼出来的。
通过本指南,您不但可以摆脱困扰且提升机器学习的性能,您甚至有可能在预测问题上取得世界级的成果。
让我们来探究一下
请注意,本指南的结构基于一个早前的指南,它可能会对您提高深度学习的性能很有帮助,它的标题是: 如何提高深度学习性能。
机器学习性能改进备忘录
照片来自NASA,部分权利保留。
概述
此备忘单旨在为您提供解决机器学习问题的方法。
我们所需要的就是找到一个好点子来取得突破
找到了那个点,然后迂回再找其他的。
我把列表分成了四个子主题:
- 通过数据提高性能
- 通过算法提高性能。
- 通过算法调优提高性能。
- 通过模型组合提高性能。
当您往越往列表的下面走,收益的增值通常会越来越小。
例如,使用一个问题或更多数据的新框架,与调节你性能最佳的算法的参数相比,往往能让你获得更多的收益。虽不总是,但通常情况下是这样。
1.通过数据提高性能
您可以通过改变您的训练数据和问题定义取得显著进展,甚至可能大获成功。
策略:从新颖的角度看待你的数据,以便最大化发现学习算法中潜在问题的骨架。
数据战术
- 获取更多数据。你能得到更多或质量更优的数据吗?像深度学习这样的现代非线性机器学习技术都是数据越多性能越好的。
- 创造更多数据。如果无法取得更多的数据,你可以生成新的数据吗?也许你可以通过数据增强或置换现有的数据或使用概率模型来生成新的数据。
- 清理数据。你能加强数据的信号吗?或许有些缺失或损坏的观测值可以被修复或删除,还有超出合理范围的异常值也可以被修复或删除,以便来提高你数据的质量。
- 重新采样数据。你可以通过数据集的重新采样来改变大小或分布吗?也许你可以使用一个小得多的数据样本来加快实验速度,或者,对特定类型的观测值进行降采样或过采样,以便在数据集中更好地表示他们。
- 重构你的问题:试试改变你正解决的预测问题的类型?将数据重新架构为拟合、二元/多类别分类、时序、异常检测、评级、推荐系统等类型的问题。
- 重新调整数据。你可以重新调整数字输入变量吗?将输入数据规范化和标准化可以提高那些使用加权输入或距离度量方法的性能。
- 变换数据。你能重整你的数据分布吗? 对一个学习算法来说,使输入数据更高斯分布或把它通过一个指数函数,可能会更好地在数据中显露它的特。
- 投影数据:你能把你的数据投影到一个更低维的空间吗?您可以使用无监督的聚类方法或数据降维来创建一个全新的关于数据集的压缩表示。
- 特征选择。是不是所有的输入变量都同等重要呢?你可以利用特征选择方法和特征重要性方法得到一些关于数据的新想法,以便使用建模算法进行探索。
- 特征工程。是不是可以创建和添加新的数据特征? 也许有些属性可以被分解成许多新的数值(比如:类别、日期或字符串)或被聚合以表示一个事件的发生(比如:一个计数、二元信号或统计概要)。
成果:您现在应该有了关于您的数据集的一组新版本的想法。
下一步:您可以使用预测性建模的算法来评估每个值。
2.通过算法提高性能
所有的机器学习都和算法相关。
策略:识别出那些执行性能基准和高于平均水平的算法和数据表示,保持对结果的怀疑,才能设计出不会愚弄到自己的实验。
算法策略
- 重采样法。什么重采样方法可以用来评估算法对未见数据的技术呢?请利用一个方法和布局来充分利用有效数据,携带有一组保留验证数据集的k-fold交叉验证法可能是一个很好的练习方法。
- 评估模型。什么样的指标能用来评估预测技能呢?使用一个能够找到问题要求和问题域的最优指标,它可能不属于分类精度评估法。
- 基线性能。用来比较算法的基线性能水平是多少呢?用一种随机算法或零规则算法(预测均值或模态)来建立一个基线,通过这个基线来排名所有被评估的算法。
- 抽查线性算法。哪种线性算法效果好呢? 线性方法往往更有偏向性,而且容易理解和便于快速地训练,如果你能达成好结果的话,它们当然是首选。评估完全不同的一组线性方法。
- 抽查非线性算法。哪种非线性算法效果好呢?非线性算法往往要求更多的数据,更复杂,但是却可以达到更优的性能。评估完全不同的一组非线性方法。
- 巧用文献。哪些能够很好地解决您问题的算法被报道在文献中?也许你可以从算法类型和经典方法的扩展中挖掘到灵感来探索你的问题。
- 标准化配置。那些被评估算法的标准配置是什么?每个算法都要有一个条件来解决好您的问题,即使这并不意味着要调整这些参数,但它的确意味着需要去探究怎么做才能把每个算法配置好,且在算法烧录的过程中给它一个难得的机会。
成果:您现在心中应该有一套高性能算法和数据表示法的简表啦。
下一步:接下来就是通过算法调优来提高性能。
3.通过算法调优提高性能
算法调优可能是最费时间的地方,它可能非常耗时。您总能够从抽查中飞快地挖掘出一两个不错的算法,但得到表现最好的算法可能需要花上数天、数周或数月的时间。
策略:请充分利用高性能的机器学习算法。
调优策略
- 诊断。你用什么诊断法来验证你的算法?也许你可以验证一下学习曲线,以弄清楚这个方法是否与问题过拟合或欠拟合,然后进行更正。不同的算法可能会提供不同的可视化和诊断法。检查一下算法是否预测准确。
- 试试直觉。你的直觉告诉了你什么?如果你长时间地在调整参数,但反馈周期很短,那么你可以用直觉想想如何在一个问题上配置一个算法。试一试,看看你是否能想出新的参数配置来在更大的测试线程中尝试。
- 巧用文献。文献中使用了哪些参数或参数范围呢?先评估一下标准参数集的性能可能是在开始任何一项调优动作前的好方法。
- 随机搜索。哪些参数可以使用随机搜索呢? 也许你能用随机搜索来搜索出一些算法超参数,找到一些你永远都没想过要尝试的配置。
- 网格搜索。哪些参数可以使用网格搜索呢?也许有标准的超参数值的网格,你可以用它来计算以找到好配置,然后用越来越精细的网格重复这个过程。
- 优化。你可以优化哪些参数?也许像结构或学习率这种参数可以使用直接搜索程序(如模式搜索)或随机优化(如遗传算法)来进行调整。
- 替代实验。这个算法还有哪些实验可用?也许这个方法的一种替代实验能在相同的数据上获得更好的结果。每种算法都有无数的微观决策,这些决策必须由算法执行者来制作,其中的一些决策可能会影响您问题的技术。
- 算法扩展。算法常见的扩展有哪些?也许你可以通过评估常用或标准扩展的方法来提升性能。这可能要求实验生效。
- 算法自定义。针对您的具体情况有哪些自定义可以被设置在算法上?也许你可以在你的数据上做一些算法的修改,从损失函数、内部优化方法到特定算法决策。
- 联系专家。像您这种情况的话算法专家会推荐些什么呢?可以写一个简要邮件总结一下您的预测问题,以及您曾经尝试过的一个或多个专家学者的算法。这可能会引导出之前不为您所知的前沿性工作或学术工作。
成果:你现在应该有一套关于机器学习问题的一些高调优算法的简表,甚至可能只有一种算法。
下一步:现在不止一个的模型能够被确定下来了,可以用它们来做预测或者投入生产。通过从多个模型中结合这些预测方法可以更好地提高性能。
4.通过模型组合提高性能
你可以将多个模型的预测相结合。在算法调优之后,这就是下一个需要改进的地方。事实上,您可以通过结合多个“够好的”模型的预测中获得高性能,而不是多个高度调整的(和易损坏的)模型。
策略:结合多个高性能模型的预测。
组合战术
- 混合模型预测。你能直接混合多个模型的预测吗?也许你可以使用相同或不同的算法来制作多个模型,从多个表现良好的模型的预测中取得平均值或模态。
- 混合数据表示。你能结合那些在不同的数据表示上被训练出的模型吗?您可能有许多不同的问题预测,这些预测可用于训练性能良好的算法,它们随后可以被组合起来。
- 混合数据样本。你可以结合在你数据上用不同想法被训练出的模型吗?也许你可以创立一些你训练数据的子样本,训练一个高性能算法,然后再和预测结合起来。这就叫自助聚合法(或套袋),并且,当不同模型的预测都很熟练,但它们以不同的方式(比如不相关的预测)进行预测时,这个方法的效果最好。
- 纠正预测。你能纠正高性能模型的预测吗?也许你能毫无误差地纠正好预测,否则就可以使用像同步限制这样的方法来学习如何纠正预测错误。
- 学会去组合。你能用一个新模型来学习如何最好地结合多种高性能模型的预测吗? 这就是所谓的层叠泛化,简称层叠,并且,它们在这些情况下运行得不错:子模型虽然用不同的方式运行但也同样熟练,且聚合器模型是预测的简单的线性加权。这种过程可以重复加深层面。
成果:你现在应该有了一个或多个表现优异的模型,这些模型胜过任何一种单一的模型。
下一步:在这一点上,一种或多种组合可以被确定并用于预测或投入生产。
写在最后的话
这个备忘录的所有建议都致力于能为你的问题提高性能。
如何开始
你不需要做任何事情,你只需要一个好的点子来提升性能。
如果您不知所措,这里有一些建议:
- 挑出一个组
- 数据。
- 算法。
- 调优。
- 组合。
- 从组中选择一种方法。
- 从所选择的方法中挑出一种去尝试。
- 比较结果,看看是否有改善。
- 重复。