机器学习性能改善备忘单:32个帮你做出更好预测模型的技巧和窍门

文章来源:大数据文摘

作者 |  Jason Brownlee 选文 | Aileen

翻译 | 姜范波  校对 | 寒小阳

机器学习最有价值(实际应用最广)的部分是预测性建模。也就是在历史数据上进行训练,在新数据上做出预测。 


而预测性建模的首要问题是:


如何才能得到更好的结果?

这个备忘单基于本人多年的实践,以及我对顶级机器学习专家和大赛优胜者的研究。


有了这份指南,你不但不会再掉进坑里,而且会提升性能,甚至在你自己的一些预测难题中取得世界领先水平的结果。


让我们一起来看看吧!


注意:本文的结构基于早些时候另一篇关于改善深度学习性能的指南——《如何改善深度学习性能》

◆ ◆ 

概述


本备忘单的目的是为你提供一些提升机器学习性能的想法。要获得突破,你所需要的可能就是其中的一个。找到你要的那个,然后回来,再找下一个再提升。


我把这份清单分为4个子主题:

  1. 基于数据改善性能

  2. 借助算法改善性能

  3. 用算法调参改善性能

  4. 借助模型融合改善性能


清单越往下,你获得的增益可能越小。比如,对问题场景重新设立框架或者更多的数据通常比对最好的算法进行调参得到收益要多。 


不总是这样,但通常如此。


◆ ◆ 

1.基于数据改善性能


改变你的训练集数据以及问题定义方式,你能够得到很大提升,也许是最大的提升。


策略:从新的、不同的角度透视你的数据,以便将潜藏的问题结构充分暴露给算法。


数据策略


  • 获得更多的数据:你能够拿到更多或者更高质量的数据么?对现代非线性机器学习模型如深度学习而言,数据越多,改进越多。

  • 创造更多数据:如果你不能拿到更多数据,那么,你能创造出新的数据么?也许你可以填充或者重新排列现有数据,或者利用概率模型来产生新的数据。

  • 清洁你的数据。你能否改善数据中的信号?也许可以纠正或删除一些缺失或错误的观测值,或者在合理范围外的离群点,从而提升数据质量。

  • 数据重新取样。你能否对数据重新取样,以改变其大小或者分布?也许你可以用一个小得多的数据来实验,以提高实验的速度;或对某个特殊类型的观察值进行过采样/欠采样以使得它们更好地代表整个数据集。

  • 重新界定问题:你能否改变你正试图解决的问题类型?重构数据,如回归,二项或多项分类,时间序列,异常检测,评分,推荐等问题类型。

  • 重新缩放数据。你能否对数值型变量进行缩放处理?输入数据的归一化和标准化处理可以提升使用加权或距离度量的算法性能。

  • 转化数据。你能否改变数据的分布形态?使得数据更服从高斯分布,或进行指数变换可能会暴露出数据更多的特征供算法学习。

  • 数据投影(映射):你能否将数据投影到一个更低维的空间?你可以用无监督的聚类或投影方法,创造一个新的压缩数据集代表。

  • 特征选择。所有的输入变量是否同等重要?使用特征选择和衡量特征重要性的方法,可以创造出数据的新视角,供模型算法探索。

  • 特征工程。 你能够创造或者增加新的特征?也许有的属性可以分解为多个新的值(比如类别,日期或字符串)或者属性可以聚集起来代表一个事件(如一个计数,二进制标志或统计信息)

上面这些工作的期待结果是:你应该得到数据集的一批新视角和新版本。


下一步:你可以用预测性模型算法评估它们每一个的价值。


◆ ◆ 

2.借助算法改善性能


机器学习无外乎算法。 


调整的策略:找出那些性能高于基线水平,比平均水平要好的算法和数据呈现方式。对结果保持怀疑态度,设计实验,使得它很难愚弄你。


算法策略


  • 重采样方法。要用什么样的重采样方法来估计其在新数据上的能力?使用一种能够最好地利用现有数据的方法和参数设置。K折交叉验证法,利用其中的一折作为验证集可能是最佳操作。

  • 评价指标。用什么样的指标来评价预测能力?选择能够最好地体现问题和专业需求的指标。不要任何问题一上来就看分类准确率。

  • 基线性能。比较算法时,什么是基线性能?通过随机算法或零规则算法(预测均值或众数)来建立一个基线,并以此对所有算法进行排序。

  • 抽检线性算法。什么样的线性算法能有好结果?线性方法通常更容易产生偏倚,也易于理解,能快速训练。如果能达到好效果,则更容易被选中。评估多个不同的线性方法。

  • 抽检非线性算法。哪些非线性算法能有好结果?非线性算法通常要求更多数据,有更高的复杂性,但是能获得更好的性能。评估多个不同的非线性方法。

  • 从文献中偷师学艺。哪些文献报导的方法能很好地解决你的问题?也许你能从算法类型或传统方法的延伸中获取解决自己问题的灵感。

  • 标准参数设置。评估算法时,什么是标准的参数设置?每一个算法都有机会解决你的问题,这不是说在现有基础上死磕调参,而是说,每一种算法都需要把参数调好,才能在算法“大赛”中有胜出的机会。

上面这些工作的期待结果是:你应该会得到性能良好的候选算法和数据呈现候选方法清单(不太长的有限个方法)。


下一步:通过算法调参改善性能


◆ ◆ 

3.用算法调参改善性能


算法调参可能是你花时间最多的地方。它可能非常耗时间,从算法抽检中很快能挖掘出一两个性能不错的算法,而把这一两个算法的潜力充分挖掘出来可能需要好几天,几周甚至几个月的时间。


调整的策略:充分挖掘性能良好的算法的潜力。

调参策略


  • 诊断。对算法要做哪些诊断和回顾?也许可以回顾一下学习曲线,了解目前模型的状态是过拟合还是欠拟合,然后纠正它。不同的算法可能提供不同的可视化结果和诊断。检视算法得到正确预测结果和错误预测结果的样本。

  • 试试直觉。你的直觉是什么?如果你琢磨参数的时间足够长,而反馈回路又很短,那么你会得到怎么调参的直觉。试一试,看看你遇到更大的难题时能不能再得到新的参数设置灵感。

  • 学习文献。文献中用到了哪些参数,范围是多少?评估标准参数性能是调参的良好开端。

  • 随机搜索。哪些参数可以用随机搜索?也许你可使用算法超参数的随机搜索,来发现那些你永远也想不到的参数设置。

  • 网格搜索。哪些参数可以使用网格搜索?也许有一些标准超参数网格值,你可以拿来赋值,从而发现好的参数设置,重复这一过程,不断精调网格。

  • 最优化。那些参数可以优化?也许有一些参数,如结构或者学习率,可以用直接搜索程序(如模式搜索)或随机优化(如遗传算法)来调整。

  • 交替实施。算法有哪些其他的实施?也许其中的一个交替实施方法可以在同样的数据上得到更好的结果。每个算法都有无数的微决定由算法的使用者做出,其中的一些可能会影响到问题的解决。

  • 算法延伸。哪些是常见的算法延伸?也许你可以通过评估常见的或标准的算法延伸而提高性能。这可能需要一些实施工作。

  • 算法定制。对你的个案而言,需要做哪些算法定制?也许你可以为你的数据修饰算法,从损失函数,内部优化方法到算法的具体决定。

  • 联系专家。对你的个案,专家们有什么算法推荐?给一个或多个算法领域的学术界专家写封简单的邮件,概述你的预测问题,以及你已经做出的尝试。这可能会让你获悉前沿工作,或者学术界不为你所知的新想法。

上面这些工作的期待结果是:你应该可以得到一个很短的清单,上面是经过精调的算法。也许甚至只剩下一个。


下一步:到这一步,对剩下的一个或多个模型进行最后的收尾,做出预测或者投放到产品中。更进一步的性能提升可以通过多个模型的融合来达到。


◆ ◆ 

4. 借助模型融合改善性能


你可以组合多个模型的预测。在算法调参之后,这是下一个大的改善空间。实际上,组合多个“够用”的模型,而不是多个精调(同时也非常脆弱,可能严重overfitting)的模型通常可以达到很好的性能提升。


策略:组合多个性能良好的模型预测结果。


组装策略


  • 混合模型预测结果。 你是否可以直接组合多个模型的预测结果?也许你可以使用同样的或不同的算法来搭建多个模型。对各自的预测结果取均值,或者众数。

  • 混合数据呈现方式。你是否可以组合用不同数据呈现方法得到的模型预测结果?也许你使用了不同的问题投射方法,来训练性能良好的的算法,那么这些预测结果可以组合起来。

  • 混合数据样本。你是否可以组合不同数据角度(特征)训练的模型?也许你可以创造训练样本的多个子样本来训练一个性能良好的算法,然后把结果组合起来。这叫做自助聚集(bootstrap aggregation)或者bagging,当各个模型的预测都很高明而方法各异(不相关)时,效果最好。

  • 纠正预测。你是否可以纠正性能良好模型的预测?也许你可以明确地纠正预测结果,或者通过像boosting这样的方法来学习如何纠正预测错误。

  • 学习组合。你能否使用新的模型,学习如何将多个性能良好的预测结果以最佳方式组合起来?这叫做堆栈(stacked generalization or stacking),当各子模型都很高明而方法各异时,通常能产生不错的结果,聚集模型就是各预测结果的简单加权线性模型。这个过程可以在多个层面上重复进行。

上面这些工作的期待结果是:你应该可以得到一个或多个性能良好的模型的组装结果,比任何单一模型的结果都好。


下一步:可以把一个或多个组装最后定下来,进行预测,投入产品中。


◆ ◆ 

结语


本备忘单密集打包了各种改善性能的想法。如果你觉得这里提到的要点太多,你不必样样都做。提升性能,你只需要一个好的想法。你可以依照下序的建议试试:


  1. 选择一个组 

    1. 数据

    2. 算法

    3. 调参

    4. 组装

  2. 从组中选择一个方法

  3. 从选择的方法中挑一个去试

  4. 比较结果,如果有改进则留下

  5. 重复上述过程

来源:http://machinelearningmastery.com/machine-learning-performance-improvement-cheat-sheet/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【caffe-Windows】新层添加——LSTM

前言 原始的【caffe-Windows】是没有LSTM层的,维护以后的caffe的windows版本也懒得配置了,因为大部分文章的代码还是基于老版caffe。其实大部分的添加层方法都可以参考本博客,仅限Windows。 需要的文件有: 1. 原始的caffe-Wind…

【caffe-Windows】关于LSTM的使用-coco数据集

前言 建议大家使用Linux,因为Linux下的配置就没这么麻烦,各种make就行啦。Linux用户请绕道,因为此博客只针对Windows,可能比Linux麻烦很多倍。 在caffe-Windows新增LSTM层以后,相信很多人和我一样很好奇如何使用这一…

【caffe-Windows】关于LSTM的简单小例子

前言 这里主要是看到了一个简单的LSTM例子,比上一个coco简单很多,所以在这里记录一下,便于后续的分析,参考博客在上一篇文章的末尾提到过:Recurrent neural nets with Caffe 需要说明的是这个例子也并非原原本本的使…

概率有向图模型

1. 前言 主要参考书籍《深度学习导论及案例分析》、维基百科“贝叶斯网络”、老笨妞的博客、PRML中文翻译,重点还是概念的掌握和几个小理论的推导,比较枯燥。加入了自己的一些简单理解。 个人感觉概率有向图模型最大的意义在于:一个特定的有…

概率无向图模型

1. 前言 前面看了概率有向图模型,必然对无向图模型也要研究一下。而且这个概率无向图模型对学习RBM有很大的帮助,它关系到能量函数的来源,所以还是看看吧。参考资料依旧是概率有向图模型中参考的三个资料。 有向图将一组变量上的联合概率分…

softmax理论及代码解读——UFLDL

前言 看了各种softmax以后迷迷糊糊的,还是研究一下UFLDL的教程稳点。当然还是得参考挺多教程的:UFLDL-softmax 、Softmax的理解与应用 、Logistic 分类器与 softmax分类器 、详解softmax函数以及相关求导过程 、Exercise:Softmax Regression 。 【UFLDL…

二值RBM与实值RBM理论及代码解读

1. 前言 虽然推导过二值形式的RBM,但是对于可见层为实值的输入还是半知半解的。最近写个深度学习相关综述,看了一些关于RBM的文献,这里做一下对比总结。但是不倾向于对实值RBM的推导,而是相关代码的实现。 2. RBM回顾 RBM是具有…

【caffe-Windows】添加工程-以classification为例

前言 兴趣所向,研究一下如何在caffe工程之外建立一个属于自己的工程,这里以分类为例,将classification.cpp提取出来,然后调用相应的三方库和libcaffe.lib进行编译。这里比较建议有一丢丢C功底的同志参考学习,主要涉及…

MKL学习——数学运算库安装调试

前言 最近要用C折腾一些东西,涉及到矩阵运算,看了一下网上推荐的数学库,貌似MKL还是蛮不错滴,放到VS2013里面试试 国际惯例,来波地址 blas, cblas, openblas, atlas, lapack, mkl性能对比 Compiling and Linking I…

MKL学习——向量操作

前言 推荐两个比较好的教程: BLAS (Basic Linear Algebra Subprograms) LAPACK for Windows 命名规范 BLAS基本线性代数子程序的函数命令都有一定规范&#xff0c;便于记忆 <character> <name> <mod> () character 定义的是数据类型 s实数域&#…

【caffe-Windows】识别率批量输出——matlab实现

前言 今天看到群里有人问”用matlab输出测试集的精度“&#xff0c;瞎试了一下&#xff0c;好像还成功了。主要还是依据前面所有在matlab中操作caffe的博客。 这里说一下&#xff1a;classification.m是适用单张图片的精度&#xff0c;类似于classification.exe的功能&#x…

相机矩阵(Camera Matrix)

前言 最近翻阅关于从2D视频或者图片中重构3D姿态的文章及其源码&#xff0c;发现都有关于摄像机参数的求解&#xff0c;查找了相关资料&#xff0c;做一下笔记。 国际惯例&#xff0c;来一波参考网址 透视变换、透镜畸变及校正模型、相机校正(Camera Calibration)、Matlab相…

损失函数梯度对比-均方差和交叉熵

前言 我们都知道在机器学习中&#xff0c;希望算法或者网络收敛更快&#xff0c;有些是对数据预处理&#xff0c;尤其是Batch Normalization&#xff0c;有些是采用不同的激活函数&#xff0c;尤其是Relu激活函数取得了巨大的成功&#xff0c;还有一种加速收敛方法是更换损失函…

如何选择深度学习优化器

前言 转载地址&#xff1a;如何选择深度学习优化器 作者&#xff1a;不会停的蜗牛 CSDN AI专栏作家 在很多机器学习和深度学习的应用中&#xff0c;我们发现用的最多的优化器是 Adam&#xff0c;为什么呢&#xff1f; 下面是 TensorFlow 中的优化器&#xff0c; https://w…

【caffe-Windows】基于Python多标签方法——VOC2012数据集

前言 按照上一篇博客所遗留的话题&#xff1a;多标签分类&#xff0c;进行初步探索&#xff0c;此篇博客针对caffe官网的多分类进行配置&#xff0c;只不过是Python接口的&#xff0c;不过官网在开头说明可以使用HDF5或者LMDB进行操作&#xff0c;只不过Python更加方便罢了 国…

【theano-windows】学习笔记二——theano中的函数和共享参数

前言 上一篇博客中学到了theano中的变量类型&#xff0c;也就是dscalar、dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的函数&#xff0c;类似于def, 还有就是简单的线性代数运算操作。 在神经网络(NN)中, 我们声明了权重、…

【theano-windows】学习笔记三——theano中的导数

前言 就一个NN而言&#xff0c;包含梯度、偏置、参数更新&#xff0c;而前面第一篇博客学习了theano中符号变量的定义, 第二篇博客学习了变量的随机初始化, 变量之间的互相操作(类似于sigmoid(w∗xb)), 但是参数更新还应涉及到损失函数的偏导计算&#xff0c;这一章节就是看看…

【theano-windows】学习笔记五——theano中张量部分函数

前言 至此感觉应该可以写出一个logistic回归程序了&#xff0c;但是为了达到对theano中张量的更灵活的使用, 还是先看一下thenao.tensor对变量都提供了哪些操作&#xff0c;最全的文档戳这里或者这里, 这里就稍微摘取一点自我感觉以后可能用得多的函数 基本张量函数 创建张量…

【theano-windows】学习笔记六——theano中的循环函数scan

前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于Scan的11个例子 官网更全面的介绍 简介 用途 递归的一般形式, 可以被用于循环s…

【theano-windows】学习笔记九——softmax手写数字分类

前言 上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmax和logistic回归分类的联系, 我在之前写过一个小博客 国际惯例, 参考博客走一波: Classifying MNIST digits using Logistic Regression soft…