机器学习——算法性能(误差)改进及调参技巧

机器学习调参技巧

  • 可用方法
  • 训练集、验证集和测试集
  • 诊断偏差与方差
  • 学习曲线

可用方法

通常,我们训练一个机器学习算法,等其收敛后,还要用一些测试集去验证算法性能。此时,我们可能就会遇到各种各样的问题。例如,我们使用正则化的线性回归去预测房子的价格,其代价函数定义为;
J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 m θ j 2 ] J\left(\boldsymbol{\theta}\right)=\frac{1}{2m}\left[\sum_{i=1}^m\left(h_\boldsymbol{\theta}\left(x^{\left(i\right)}\right)-y^{\left(i\right)}\right)^2 +\lambda\sum_{j=1}^m\theta_j^2 \right] J(θ)=2m1[i=1m(hθ(x(i))y(i))2+λj=1mθj2]
当我们将训练好的算法应用到一组新的测试数据时,可能预测的结果误差很大,那么我们应该使用方法去改进算法呢?
可以通过以下方法进行尝试:

  • 获取更多训练数据
  • 减少特征集的数量
  • 增加特征集的数量
  • 增加多项式特征( x 1 2 , x 2 2 , x 1 x 2 , e t c x_1^2,x_2^2,x_1x_2,etc x12,x22,x1x2,etc
  • 减小正则化参数 λ \lambda λ
  • 增大正则化参数 λ \lambda λ

上述方法都是一些比较实用的调参技巧,但是盲目的选取其中一种方法往往会有事倍功半的效果。因此,我们的重点应该放在该如何选择上述技巧上面。

训练集、验证集和测试集

在介绍算法改进技巧之前,先简单了解一下数据集的划分问题。假设我们想要确定对于一个数据集而言最合适的多项式次数,或者我们想要确定最合适的正则化参数 λ \lambda λ,这类问题被叫做模型选择问题。为了解决此类问题,通常我们会将数据集划分为训练集(Training Set)、交叉验证集(验证集)(Cross Validation)和测试集(Testing Set),并且当数据量不大时(万级别或者以下)最常用的划分比例是60%、20%和20%;当数据量特别大时,例如有100万个数据样本,常用的划分比例是98%,1%和1%。
我们使用训练集去训练数据,进而得到一个模型。然后,我们通过验证集去评估这个模型的性能,并以此对相应参数进行调整。一旦找到的最佳的参数,就在测试集上最后测试一次,测试集上的误差作为泛化误差的近似。有关训练集、验证集和测试集的说明可以参考此篇博客,这里举一个例子进行深入理解:
假设我们需要从以下10个假设函数中选出一个最好的模型:

  • h θ ( x ) = θ 0 + θ 1 x h_{\theta}(x)=\theta_0+\theta_1x hθ(x)=θ0+θ1x

  • h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 h_{\theta}(x)=\theta_0+\theta_1x+\theta_2x^2 hθ(x)=θ0+θ1x+θ2x2

  • h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 3 x 3 h_{\theta}(x)=\theta_0+\theta_1x+\dots+\theta_3x^3 hθ(x)=θ0+θ1x++θ3x3
    … \dots

  • h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 10 x 10 h_{\theta}(x)=\theta_0+\theta_1x+\dots+\theta_{10}x^{10} hθ(x)=θ0+θ1x++θ10x10
    针对第一个假设函数,利用训练集去最小化代价函数 J ( θ ) J(\theta) J(θ),可以得到一组向量参数 θ ( 1 ) \boldsymbol\theta^{(1)} θ(1),类似地,对于第二个假设函数,我们可以得到 θ ( 2 ) \boldsymbol\theta^{(2)} θ(2),第十个假设函数得到 θ ( 10 ) \boldsymbol\theta^{(10)} θ(10)。接下来,我们使用验证集去分别计算这10个假设函数的代价函数 J c v ( θ ) J_{cv}(\theta) Jcv(θ),选取使代价函数最小的那个假设作为我们模型,例如, h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 4 x 4 h_{\theta}(x)=\theta_0+\theta_1x+\dots+\theta_4x^4 hθ(x)=θ0+θ1x++θ4x4的参数可以使代价函数最小,于是选择它作为我们的模型。最后,我们用测试集去测试我们选择的那个模型的性能,即测试其泛化误差。

诊断偏差与方差

当运行一个算法,发现其表现不理想时,我们需要改进它。改进的前提是我们知道问题到底出在了什么地方。通常,算法不理想和两个因素有关,一个是偏差过大(High Bias),另一个是方差过大(High Variance)。换句话说算法要么是欠拟合问题,要么是过拟合问题。下图为三种情况的图示说明:
机器学习——算法性能(误差)改进及调参技巧_第1张图片在前面,我们将数据集划分为了训练集、验证集和测试集。由此我们可以得到训练误差,交叉验证误差和测试误差(泛化误差),其公式分别为:
机器学习——算法性能(误差)改进及调参技巧_第2张图片
根据训练误差、交叉验证误差和多项式次数的关系,我们可以画出下图曲线:
机器学习——算法性能(误差)改进及调参技巧_第3张图片
图像的纵坐标表示误差,横坐标为多项式次数(越往右代表多项式次数越高)。根据图像我们可以看出,训练误差 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)是随着多项式次数的增大逐渐减小的。这是因为多项式次数越高,对数据拟合的越精确,这也解释了过拟合的现象。而交叉验证误差是随着多项式次数的增大先减小后增大的。原因在于,当多项式次数较小时,无法较好地拟合数据,此时对应着高偏差的情况,因此交叉验证误差比较大;随着多项式次数的不断增大,可以找到一个最优的次数,此时对应的交叉验证误差最小;继续增大多项式的次数,由于偏离了最优的次数,所以交叉验证误差由开始逐渐增大,此时对应着高方差情况,即出现了过拟合现象,模型过度拟合了训练数据集,导致用交叉验证集验证时,出现较大的误差。
于是,我们可以总结出:
高偏差 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)比较高, J c v ( θ ) J_{cv}(\theta) Jcv(θ)近似等于 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)
高方差 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)比较小, J c v ( θ ) J_{cv}(\theta) Jcv(θ)远大于 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)
当出现过拟合时,我们可以通过正则化(可参考此篇博客)的方法去减少这种现象。正则化参数 λ \lambda λ的选取对偏差和方差也有着很大的影响。
机器学习——算法性能(误差)改进及调参技巧_第4张图片
从图中可以看出,当 λ \lambda λ过大时,会出现高偏差现象;当 λ \lambda λ太小时,会出现高方差现象。 λ \lambda λ和训练误差及交叉验证误差的关系如下图所示:
机器学习——算法性能(误差)改进及调参技巧_第5张图片
图中,当 λ \lambda λ过小时,例如 λ = 0 \lambda=0 λ=0,相当于没有正则化,此时由于可能出现过拟合,导致训练误差很小,而交叉验证误差很大,对应着高方差;当 λ \lambda λ很大时,例如 λ = 10000 \lambda=10000 λ=10000,为了最小化 J ( θ ) J(\theta) J(θ),向量 θ \theta θ中可能出现大量的0,使得模型无法很好的拟合数据,导致训练误差和交叉验证误差都很大,对应着高偏差

学习曲线

绘制学习曲线对检查算法是否正常运行以及改进算法性能十分有帮助,通过学习曲线,可以发现算法是否存在高偏差、高方差等问题。一种学习曲线如下图所示:
机器学习——算法性能(误差)改进及调参技巧_第6张图片

图中,纵坐标表示误差,横坐标为训练集数量。当训练集数量很少时,我们可以精确地得到一个模型,因此其训练误差也比较小。但是由于模型是通过训练集训练得到的,泛化程度不会很好,当用交叉验证集验证时,就容易出视误差较大的情况。随着训练集数量的增大,想对每一个训练样本都拟合地很好就很难做到了,因此平均训练误差逐渐增大。但此时模型的泛化能力是逐渐增强的,所以其交叉验证误差会逐渐减小。
高偏差情况下的学习曲线:
机器学习——算法性能(误差)改进及调参技巧_第7张图片
从图中可以看出,训练误差会随着训练集数量的增加而逐渐增加,并且最终趋于一个平稳的状态,交叉验证误差最终会和训练误差接近,表明当算法出现高偏差的问题时,增大训练集的数量并不能很好地改善算法性能。
高方差情况下的学习曲线:
机器学习——算法性能(误差)改进及调参技巧_第8张图片
在高方差情况下,交叉验证误差会随着训练集数量的增加不断减小,并且训练误差和交叉验证误差之间有着较大的差距,这表明增加训练集数量对于高房方差问题来说是有帮助的。
注意:上述曲线都是理想情况下的曲线,在实际算法测试中,由于噪声及其他因素的影响,曲线可能不是那么平滑,但是其趋势是一样的。

有了上述知识,我们可以就一开始给出的许多种改进方法进行选择了:

  • 获取更多训练数据——可解决高方差问题
  • 减少特征集的数量——可解决高方差问题
  • 增加特征集的数量——可解决高偏差问题
  • 增加多项式特征( x 1 2 , x 2 2 , x 1 x 2 , e t c x_1^2,x_2^2,x_1x_2,etc x12,x22,x1x2,etc)——可解决高偏差问题
  • 减小正则化参数 λ \lambda λ——可解决高偏差问题
  • 增大正则化参数 λ \lambda λ——可解决高方差问题

主要参考吴恩达机器学习

你可能感兴趣的:(强化学习,机器学习,算法,人工智能)