如何提高机器学习的性能

首先申明:本文为翻译文章,原文见这里

20个对付过拟合提升泛化能力的技巧、窍门和技术

本文将罗列提升深度学习性能的常见思路,这些思路可以分为一下四个方面
1. 数据 2. 算法 3. 调参 4. 组合

通过数据提升性能

通过调整训练数据或者改变问题的定义可以非常有效地提升深度学习的性能。关于数据可以从以下几个方面入手:

  1. 获取更多的数据
  2. “造”更多的数据
  3. “缩放(rescale)”现有数据
  4. “变换(transform)”现有数据
  5. 特征选取

获取更多的数据

模型的性能往往取决与训练数据的好坏。 要想得到好的性能,就需要有好数据,而且多多益善。
深度学习和一些现代的非线性及其学习方法,往往能够随着训练数据增大而提高性能,而且前者尤甚,这也是它的长处!
我们可以看看深度学习的性能与训练数据的数量的关系曲线就知道了:
数据量对机器学习性能的影响
虽然更多的数据并不一定总是有效,但它仍然是一个值得尝试思路。

相关链接
- Datasets Over Algorithms

造数据

更多的数据能够提高深度学习的性能,基于这个思路,在无法获取更多的数据的时候,我们就可以通过创造更多的数据来达到类似的效果。例如:对于数值向量的数据通过随机的方法基于现有数据生成更多的样本,对于图像也可以用随机的方式生成更多的版本,包括文本数据等等

造数据又称为,数据增广或者数据生成。

举个例子,对于图像数据,你可以通过随机的平移和旋转来获得更多的数据。这么做能够提升模型对类似的变换的泛化能力。

于此相关联的便是加一些认为的噪声或者说抖动。这么做如同对模型进行正则化,能够防止模型对训练数据过拟合。

相关链接:
- Image Augmentation for Deep Learning With Keras
- What is jitter? (Training with noise)

缩放现有数据

这里的缩放数据就是对数据进行一些归一化处理。因为神经网络一条非常重要的经验就是将数据归一化到激活函数的上下界。基于此,我们就可以根据所使用的神经元对数据进行归一化。如果是sigmoid函数,就将数据归一化为0~1;如果是tanh函数就将数据归一化到-1~1。

归一化的方法对于输入(x)和输出(y)均有效。例如,如果你用sigmoid函数在输出层预测二值结果,那么你就应该将你的y值二值化;如果用的是softmax归一化y值仍然可以有助于模型的性能。

初次之外,你还能创建不同缩放类型的训练数据,来确定什么类型的训练数据获得最佳的性能。例如创建如下不同的训练数据:
1. 归一化到0~1
2. 缩放到-1~1
3. 标准数据
然后分别对模型进行训练,再选择表现最好的训练数据类型,然后继续加数据。如果你改变了激活函数,那就用上述的方法重新来过。

过大的数值往往对神经网络有害无利。基于相同的思想,我们还能对神经网络的激活值和权重进行归一化处理,后文将对此进行详细介绍。

相关链接
- Should I standardize the input variables (column vectors)?
- How To Prepare Your Data For Machine Learning in Python with Scikit-Learn

变换现有数据

除了缩放现有的数据之外我们还可做得更多。

你必须非常了解你的数据,将它可视化,寻找异常数据(outlier)。

估计数据中每一列的单变量分布:
- 如果列的分布看起来像是一个扭曲的高斯分布,就用Box-Cox变换进行纠正
- 如果列的分布像是指数分布,就考虑用log进行变换
- 如果数据表现出一些特征,但被一些显而易见的东西破坏了,可以实时对齐进行平方或平方根处理
- 考虑是否能将数据离散化或者用直方图统计的形式进行转化来突出某些特征

通过直觉,你还可以:

  • 对数据进行预处理,比如进行PCA重投影
  • 将多个属性联合成一个变量
  • 用二进制标志变量来标识问题不同的方面
  • 发现数据中的一些时间或其它结构特征

虽然神经网络的学习能够发现上面的特征,但是你如果能够显示地表示出数据的这些特征,模型就能学得更快。

通过尝试对数据数据进行不同的变换方法,然后确定是否可行。

相关链接
- How to Define Your Machine Learning Problem
- Discover Feature Engineering, How to Engineer Features and How to Get Good at It
- How To Prepare Your Data For Machine Learning in Python with Scikit-Learn

特征选择

神经网络对于不相关的数据是具有一定的鲁棒性的,也就是说,通过训练网络可以通过一些微小的权重剔除与预测结果不相关的属性。但是,这些属性依然是对结果毫无帮助的,所以你就应该把这些不相关的属性从数据中移除。

有许多特征选择和评估特征重要性的方法可以给你选择特征去留的思路,笔者建议使用不同的方法选择特征,并选择不同的特征看看相同的网络有什么不同的表现:

  • 用更少的特征训练网络能否达到之前的效果呢? 如果是的话,意味着更快!
  • 也许不同的选择方法都剔除了相同的特征,那么就从多角度验证了这些特征应该被剔除。
  • 选取的特征可能激发你更多特征工程方面的想法和思路

相关链接

重构你的问题

回到最初提出问题的阶段,你应该反思目前你所搜集的观察数据是构造问题的唯一方法吗?是否还有其它方法或者其它框架来构造你的问题,而这个问题能让你的模型能够更好地学习。

译者:上一段的原文是:Are the observations that you’ve collected the only way to frame your problem? Maybe there are other ways. Maybe other framings of the problem are able to better expose the structure of your problem to learning. 我的理解是寻找一个更能描述问题本质的Loss函数

这个练习能够让你真正开动你的脑筋。当你已经一头栽进当前的项目的时候就尤其难以去这么思考(由于心理自负、时间、成本等因素)。

也许你已经列了3~5个不同描述问题的方案,只是弃用了,因为你对于自己选择的方案充满信心。

  • 或许你可以在你的问题中加入时间信息,或方法中加入时间戳这个参数
  • 或许你的分类问题可以变成一个回归问题,或者反之
  • 二值输出或许可以变成softmax输出
  • 或许只要对子问题建模就好了

最好在选择工具之前彻底想清楚问题本身和构造问题的方法,因为此时你还没没有一头栽进问题的解决方案当中。

不仅如此,如果你卡在某个地方,仍然可以用这个思考方式激发你的思路。而且你不用完全抛弃之前的工作,方法将在后文中有关整合是进行讲述。

相关链接:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值