32个技巧、窍门和方法,助你做出更好的预测。
机器学习最有价值的部分是预测建模。
这是指开发在历史数据上训练并对新数据进行预测的模型。
而关于预测建模的首要问题是:
我怎样才能获得更好的结果?
这份速查表包含了我多年实践以及研究顶级机器学习从业者和竞赛获胜者后提炼出的最佳建议。
通过本指南,您不仅能摆脱困境、提升性能,甚至可能在您的预测问题上取得世界级的结果。
让我们开始吧。
注意,本指南的结构基于一篇早期指南,您可能会发现它对于提高深度学习性能很有用,题为:如何提高深度学习性能。

机器学习性能改进速查表
照片由 NASA 提供,保留部分权利。
概述
这份速查表旨在为您提供提升机器学习问题性能的思路。
只需一个好点子,就能带来突破。
找到那个点子,然后再回来寻找下一个。
我已将列表分为4个子主题:
- 通过数据提升性能。
- 通过算法提升性能。
- 通过算法调优提升性能。
- 通过集成方法提升性能。
通常,越往列表下方,性能提升的幅度会越小。
例如,对问题进行新的框架设定或获取更多数据,通常比调整表现最佳算法的参数带来的回报更大。并非总是如此,但通常是这样。
1. 通过数据提升性能
通过改变训练数据和问题定义,您可以获得巨大的性能提升。甚至可能是最大的提升。
策略:为您的数据创建新的、不同的视角,以便最好地向学习算法揭示潜在问题的结构。
数据策略
- 获取更多数据。您能获取更多或质量更好的数据吗? 像深度学习这样的现代非线性机器学习技术,会随着数据量的增加而持续提升性能。
- 创造更多数据。如果无法获取更多数据,您能生成新数据吗? 也许您可以增强或排列现有数据,或使用概率模型生成新数据。
- 清洗您的数据。您能提高数据中的信号质量吗? 也许有缺失或损坏的观测值可以被修复或移除,或者超出合理范围的异常值可以被修复或移除,以提升数据质量。
- 重采样数据。您能通过重采样来改变数据的大小或分布吗? 也许您可以使用一个更小的数据样本来进行实验以加快速度,或者对特定类型的观测值进行过采样或欠采样,以便在数据集中更好地表示它们。
- 重构您的问题:您能改变您正在解决的预测问题的类型吗? 将您的数据重构为回归、二分类或多分类、时间序列、异常检测、评级、推荐系统等类型的问题。
- 重新缩放您的数据。您能对数值型输入变量进行重新缩放吗? 对输入数据进行归一化和标准化可以提升使用加权输入或距离度量的算法的性能。
- 转换您的数据。您能重塑您的数据分布吗? 使输入数据更接近高斯分布,或通过指数函数处理数据,可能能更好地向学习算法揭示数据中的特征。
- 投影您的数据:您能将数据投影到更低维度的空间吗? 您可以使用无监督聚类或投影方法来创建一个全新的、压缩的数据集表示。
- 特征选择。所有输入变量都同等重要吗? 使用特征选择和特征重要性方法来创建数据的新视图,并用建模算法进行探索。
- 特征工程。您能创建并添加新的数据特征吗? 也许有些属性可以分解为多个新值(如类别、日期或字符串),或者有些属性可以聚合起来表示一个事件(如计数、二元标志或统计摘要)。
结果:现在您应该有一系列新的数据集视图和版本。
下一步:您可以使用预测建模算法来评估每个视图和版本的价值。
2. 通过算法提升性能
机器学习的核心是算法。
策略:识别出那些性能优于基准且好于平均水平的算法和数据表示。对结果保持怀疑态度,并设计实验以避免自我欺骗。
算法策略
- 重采样方法。使用何种重采样方法来估计在新数据上的技能? 使用一种能够充分利用现有数据的方法和配置。带有留出验证数据集的k折交叉验证可能是一种最佳实践。
- 评估指标。使用什么指标来评估预测的技能? 使用一个最能反映问题和领域需求的指标。它可能不是分类准确率。
- 基准性能。用于比较算法的基准性能是什么? 使用随机算法或零规则算法(预测均值或众数)来建立一个基准,以便对所有评估的算法进行排名。
- 抽查线性算法。哪些线性算法效果好? 线性方法通常偏差较大,易于理解且训练速度快。如果能取得好结果,它们是首选。评估一组多样化的线性方法。
- 抽查非线性算法。哪些非线性算法效果好? 非线性算法通常需要更多数据,复杂度更高,但可以达到更好的性能。评估一组多样化的非线性方法。
- 借鉴文献。文献中报道了哪些算法在您的问题上效果好? 也许您可以从中获得算法类型或经典方法扩展的思路,以便在您的问题上进行探索。
- 标准配置。正在评估的算法的标准配置是什么? 每个算法都需要有机会在您的问题上表现出色。这并不意味着(现在)要调整参数,而是意味着要研究如何良好地配置每个算法,并使其在算法竞赛中有一战之力。
结果:现在您应该有一个表现良好的算法和数据表示的简短列表。
下一步:下一步是通过算法调优来提升性能。
3. 通过算法调优提升性能
算法调优可能是您花费时间最多的地方。它可能非常耗时。您通常可以通过抽查快速发现一两个表现良好的算法。而要从这些算法中获得最佳性能,可能需要几天、几周甚至几个月的时间。
策略:充分发挥表现良好的机器学习算法的潜力。
调优策略
- 诊断。您可以查看关于算法的哪些诊断信息? 也许您可以查看学习曲线来了解该方法是过拟合还是欠拟合问题,然后进行修正。不同的算法可能提供不同的可视化和诊断工具。检查算法在哪些地方预测正确,哪些地方预测错误。
- 尝试直觉。您的直觉告诉您什么? 如果您花足够长的时间调整参数并且反馈周期短,您可能会对如何在一个问题上配置算法产生直觉。试试看,看您能否想出新的参数配置,在您更大的测试平台上进行尝试。
- 借鉴文献。文献中使用了哪些参数或参数范围? 评估标准参数的性能是任何调优活动的良好起点。
- 随机搜索。哪些参数可以使用随机搜索? 也许您可以使用算法超参数的随机搜索来发现您从未想过要尝试的配置。
- 网格搜索。哪些参数可以使用网格搜索? 也许有标准超参数值的网格,您可以通过枚举来找到好的配置,然后用越来越精细的网格重复这个过程。
- 优化。您可以优化哪些参数? 也许有些参数,如结构或学习率,可以使用直接搜索过程(如模式搜索)或随机优化(如遗传算法)进行调整。
- 其他实现。该算法还有哪些可用的实现? 也许该方法的其他实现可以在相同数据上取得更好的结果。每个算法都有无数微小的决策必须由算法实现者做出。其中一些决策可能会影响您问题的性能。
- 算法扩展。该算法有哪些常见的扩展? 也许您可以通过评估该方法的常见或标准扩展来提升性能。这可能需要一些实现工作。
- 算法定制。针对您的具体情况,可以对算法进行哪些定制? 也许您可以为您的数据对算法进行修改,从损失函数、内部优化方法到算法特定的决策。
- 联系专家。在您的情况下,算法专家推荐什么? 写一封简短的电子邮件,总结您的预测问题以及您已经尝试过的方法,发送给一位或多位该算法领域的专家学者。这可能会揭示前沿工作或您之前不知道的学术工作,带来新的或新鲜的想法。
结果:现在,您应该有一个在您的机器学习问题上经过高度调优的算法的简短列表,甚至可能只有一个。
下一步:此时可以最终确定一个或多个模型,并用于进行预测或投入生产。通过结合多个模型的预测,可以进一步提升性能。
4. 通过集成方法提升性能
您可以结合多个模型的预测。在算法调优之后,这是下一个大的改进领域。事实上,您通常可以通过结合多个“足够好”的模型的预测来获得良好性能,而不是依赖于多个高度调优(且脆弱)的模型。
策略:结合多个表现良好模型的预测。
集成策略
- 混合模型预测。您能直接组合多个模型的预测吗? 也许您可以使用相同或不同的算法来构建多个模型。取多个表现良好模型的预测的平均值或众数。
- 混合数据表示。您能将在不同数据表示上训练的模型的预测结合起来吗? 您可能有许多不同的问题投影,可以用来训练表现良好的算法,然后将它们的预测结合起来。
- 混合数据样本。您能将在不同数据视图上训练的模型结合起来吗? 也许您可以创建训练数据的多个子样本,并训练一个表现良好的算法,然后结合预测。这被称为自举汇聚(bootstrap aggregation)或 bagging,当每个模型的预测都很有技巧但方式不同(不相关)时效果最好。
- 修正预测。您能修正表现良好模型的预测吗? 也许您可以明确地修正预测,或者使用像 boosting 这样的方法来学习如何修正预测错误。
- 学习如何组合。您能使用一个新模型来学习如何最好地组合多个表现良好模型的预测吗? 这被称为堆叠泛化(stacked generalization)或堆叠(stacking),当子模型有技巧但方式不同,并且聚合器模型是预测的简单线性加权时,通常效果很好。这个过程可以重复多层。
结果:您应该有一个或多个表现良好模型的集成,其性能优于任何单个模型。
下一步:此时可以最终确定一个或多个集成模型,并用于进行预测或投入生产。
结束语
这份速查表充满了可以尝试用来提升问题性能的想法。
如何开始
您不需要做所有的事情。您只需要一个好点子来获得性能提升。
以下是如何应对信息过载的方法:
- 选择一个类别
- 数据。
- 算法。
- 调优。
- 集成。
- 从该类别中选择一种方法。
- 选择所选方法中的一件事来尝试。
- 比较结果,如果有改进就保留。
- 重复。
分享您的结果
您觉得这篇文章有用吗?
您是否找到了那个带来改变的一个想法或方法?
请告诉我,留个言!我很想听听您的经历。
一如既往地非常有用!
非常有帮助的技巧!
很高兴听到这个消息,Mellon。
对于多类分类问题,可以使用哪些策略?
大多数分类机器学习算法都支持多类分类。
或许可以从决策树开始?
非常有用。非常感谢 Jason。
作为一个总是在寻求学习新事物的人,我才刚刚开始学习Python/机器学习/数据分析。
我目前正在寻找一些基础的讨论,因为我正试图对所涉及的内容有一个更清晰的基本理解。我已经读了一些资料,但还需要一些解惑的对话。
如果可以的话,您能确认一下机器学习在统计学中是如何定位的,以及Python算法和相关Python库的使用是如何融入其中的吗?
好问题,Benson。
机器学习可以被看作是应用统计学与计算机和更大数据集的结合。机器学习的有用之处在于预测建模,这与统计学中常做的描述性建模不同。
我们不希望每次需要新模型或开始新项目时都重新实现方法。因此,我们使用稳健的标准实现。Python库scikit-learn提供了我们可以用于研发和生产模型的行业标准实现。
希望这能有所帮助?
一如既往地精彩的文章。我非常喜欢您的文章简洁、清晰、精确,它们真的帮助我理解了我在硕士期间错过的宏观图景。请继续保持出色的工作!
谢谢你,Mathieu,你太客气了。
如果您有任何问题,我随时可以提供帮助。
谢谢。
很高兴它有帮助。
这信息太棒了!!!你的博客是我见过最好的机器学习资源,恭喜。下个月我会买你的书,肯定非常有用。谢谢!
谢谢Ivan。你太客气了!
嗨,Jason,
我正在研究土壤光谱学,并试图将光谱与参考方法数据关联起来。当我只有少量样本(少于100个)时,我得到的r2超过70,现在有超过4000个样本,r2降到了60……很奇怪吧?对我来说,这意味着我试图测量的属性与信号并没有真正的相关性,所以增加样本数量不会改善结果,您怎么看?
诚挚地
Grandonia
该变量可能与其他输入变量存在非线性交互作用,这些作用可能会影响输出变量。这些是难以甚至不可能测量的。
我建议用不同的问题框架来开发模型,看看哪个效果最好。
谢谢你的见解,Jason。你能解释一下你所说的“框架”是什么意思吗?我很确定我想要测量的元素(比如磷)和光谱之间没有直接关系,只有间接关系(磷与一些在红外区有信号的有机分子结合)。
所以您真的认为在这种情况下,更多的数据并不意味着更好的结果,因为相互作用是非线性的吗?
我所说的“框架”(framings),指的是您试图近似的映射函数的输入和输出的选择。这不仅仅是特征选择,还包括被预测内容以及预测依据的结构/性质。
对于一个给定的预测建模问题,有很多种框架方式,通过探索不同的变体,甚至结合来自不同框架开发的模型的预测,可以获得更好的结果。
通常,神经网络确实比线性方法需要更多的数据。是的。
https://machinelearning.org.cn/much-training-data-required-machine-learning/
谢谢!
非常有帮助。谢谢Jason!
谢谢,听到这个我很高兴。
嗨,Jason,如果我已经在使用一个像梯度提升回归器这样已经调优过的集成模型,那么通过集成还有更多提升性能的空间吗?
是的,但你需要一个在特征或建模方法上差异很大的模型(例如,不相关的误差)。
对于改进彩票预测,有什么合适的算法建议吗?
彩票是随机的,无法预测。
您能推荐一些关于使用统计学生成新特征或进行特征工程的好链接吗?
提前感谢!!
也许从这里开始
https://machinelearning.org.cn/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/
嗨,Jason,为思考过程提供了很好的路径。
集成模型是否容易快速过拟合?我的意思是在一个输出为0或1的二元分类任务上组合预测。
我尝试过使用梯度提升进行集成,准确率达到了0.99-1。为了组合预测,模型的预测是否需要不相关?
我们应该如何选择要组合的模型?
通常不会。但由于在创建集成时使用了测试集的信息,很容易导致过拟合。要小心。
嗨,Jason,
对于使用LSTM处理不平衡序列标注问题,您有什么建议吗?
长度为N的序列到长度为N的序列。
二元分类。
其中一个类别高度不平衡,模型严重过拟合!
一个好的开始是仔细选择一个性能度量,比如AUC或ROC曲线。
嗨,Jason,
非常棒的建议。我会尝试应用其中一些。希望它们对我有用,我正苦于性能水平停滞不前,尽管我已经改变了数据视角并调整了一些算法参数。
谢谢。
你好,
感谢您的信息。我有个问题,希望您能帮我。
我总共有55个数据点,我按70:30的比例分成了训练数据和测试数据。
然而,训练的准确率很高,而测试的准确率非常差。
我有13个因素作为输入,1个目标用于模型(我使用机器学习)。
我的问题出在哪里?我该如何解决它?
非常感谢
或许可以尝试使用k折交叉验证或留一法交叉验证来获得更稳健的模型性能估计。
通常,我建议遵循这个流程来获得最佳性能
https://machinelearning.org.cn/start-here/#process
感谢提供如此好的信息。
谢谢。
使用网格搜索进行超参数优化处理时间很长,我运行了2048种组合,花了将近120个小时才为带有Lstm层的Keras RNN模型找到最佳拟合。
请问您能建议一下如何加快网格搜索的处理速度,或者有没有其他的方法?
我有一些想法:
或许可以尝试在更快的机器上运行(例如AWS EC2)?
或许可以尝试更少的超参数组合?
或许可以尝试一个更小的模型?
或许可以尝试一个更小的数据集?
或许可以在不同的机器上评估不同的超参数网格?
希望这些能作为一个开始有所帮助。
非常感谢,这非常有帮助。
不客气。
先生,我希望开发一个用于分类和回归的混合模型,作为埃博拉预测模型。
但我没能理解如何构建这种模型的理念。例如,如果选择了4种算法应用于这个混合模型,那么这个模型如何能时而处理分类结果,时而处理数值结果呢?先生,这可能吗?该如何构建?非常欢迎您的建议。
这实现起来有点棘手。
你可以让一个模型输出一个实数值,然后由另一个模型解释这个值以得到分类结果?
你也可以使用一个多输出模型,比如神经网络,它能同时输出一个实数值和一个分类预测。
告诉我进展如何。
我有一个问题,我认为可能与您上面所说的有关,即:
“1. 通过数据提升性能:重采样数据:重采样数据以改变大小或分布”。
我的问题是一个二元分类问题(0类和1类)。每一行数据是一个3D点,包含X,Y,Z点坐标的三列,其余列是属性值。
尽管分类只使用属性(特征)列,但我保留了每一行(点)的X,Y,Z坐标,因为我需要它们来最终可视化分类结果(例如,将0类点着色为蓝色,1类点着色为红色)。
这些点是一栋建筑的3D坐标,所以当我对点进行可视化时,我可以随机切割建筑的不同部分,并将它们标记为训练/测试数据。我已经随机切割了建筑的不同部分,所以我有好几份训练/测试数据。对于每一份,我都执行这个过程(在训练数据上拟合模型,在测试数据上测试,然后预测未知数据,例如另一栋建筑的类别)。
因此,我可以得到具有不同类别空间分布的训练/测试数据。(我所说的两类空间分布,指的是这两个类别在3D空间中的位置。)所以正如您所说,我正在做重采样,以找到能提供最佳性能的样本,并将其用作训练数据集。
在名为A的训练/测试数据中,红色和蓝色类别的3D位置与名为B的训练/测试数据中的不同。
A和B在它们各自测试集上的f1-score是不同的,但都很好(两个类别的f1-score都在90%左右)。然而,当我用拟合到A的模型预测未知数据时,f1-score非常糟糕;而当我用拟合到B的模型预测未知数据时,f1-score很好(并且可视化建筑时得到的预测类别也很有意义)。
我能将A和B在未知数据上f1-score的变化称为模型方差吗?
通过反复试验,我得出结论:当0类和1类相互环绕时(B的空间分布),我在未知数据上能得到很好的f1-score;而当0类和1类相距较远时,我在未知数据上得到的f1-score很差。这背后有什么科学原因吗?
在所有情况下,我都有几乎相等数量的0类和1类。
非常感谢。
模型方差是指在不同训练数据集上拟合并在不同测试数据集上评估的同一个模型的性能度量。在这种情况下,方差是由所选指标定义的模型性能的离散程度。
这可能是因为在拟合/评估模型时,需要有足够代表性的训练/测试集。
感谢提供信息
不客气。
嗨,Jason,
我想要开发一个进行层次化多类分类的模型,在我的情况下,每个子节点可以有超过10个类别,直到第4层。我尝试在叶子节点级别创建模型,但没有成功(因为有超过1000个类别)。尝试在每个级别进行分类(类别数量比扁平结构少),仍然没有成功。还有其他方法可以优化模型吗,也许在节点上创建模型(模型数量太多)?
您能给出最好的建议吗?
非常感谢。
抱歉,我对层次化多类分类不太了解。或许可以查阅文献,看看最新的研究成果是什么?
感谢提供信息
不客气。
先生,我运行这段代码时遇到了这个错误。我该如何清除这个错误?我用Python 3.6试了同样的代码,也遇到了同样的错误。请回复我>>>>
RESTART: C:\Users\poornima\AppData\Local\Programs\Python\Python37-32\ex2.py
得分: [0.0, 0.0, 0.0, 0.0, 0.0]
平均准确率: 0.000%
>>>
看起来你的模型没有任何效果。或许可以尝试调试一下你的代码?
你好,我正在基于一个系统性风险指标的数据,实现一个欧洲指数的金融预测模型,并且我已经按照您的指示准备了数据。我使用了LSTM,但我的损失值很低,而准确率非常低(0.0014)。问题可能出在哪里?
你不能为回归任务计算准确率。
https://machinelearning.org.cn/faq/single-faq/how-do-i-calculate-accuracy-for-regression
我实现了J48,如何衡量减少训练集中样本数量的影响?
也许可以准备一个行数更少的数据集,然后在Weka中评估模型在新数据集上的表现。
我们是通过考虑“精确率和召回率”还是通过正确实例百分比来评估模型?
你必须为你的项目选择一个最能体现项目目标的指标。
这可能会有帮助
https://machinelearning.org.cn/tour-of-evaluation-metrics-for-imbalanced-classification/
非常好的文章,感谢分享。
我有一个问题,希望您能帮助我:对于“创造更多数据”是否有特定的方法或算法?我想关注普通算法,而不是像深度学习中翻转和镜像图片那样的数据扩增方法。我搜索了相关内容,但没有找到理想的结果。
期待您的回复,谢谢!
谢谢!
是的,这被称为过采样,并且有很多方法可以实现。或许可以从这里开始:
https://machinelearning.org.cn/smote-oversampling-for-imbalanced-classification/
非常好的文章,感谢分享。
我有一个问题,希望您能帮助我:对于“创造更多数据”是否有特定的方法或算法?我想关注普通算法,而不是像深度学习中翻转和镜像图片那样的数据扩增方法。我搜索了相关内容,但没有找到理想的结果。
期待您的回复,谢谢!
————
对上述内容的补充说明
我所了解的数据扩增如下
* 关于深度学习,如图像处理,可以通过图像旋转等方式增加和扩增数据;
* 关于其他机器学习:1. 分类问题(不平衡样本),可以通过类似SMOTE的算法扩增数据;2. 回归问题?——希望您能帮助我。
我想知道是否有某些方法或算法足以进行数据扩增,不仅能处理样本不平衡问题,还能适用于更普遍的情况并增加训练数据。
期待您的回复,谢谢。
谢谢。
用于不平衡分类的方法可以用于任何表格数据(例如随机过采样)。
此外,简单地向样本中添加高斯噪声也可以用来扩增数据集。
亲爱的 Jason Brownlee,请问能否建议我如何利用 WEKA 的高级功能来构建一个糖尿病专家系统?这是否可能?
你好 ARKarthikeyan...感谢您提出建议供我们考虑。