美文网首页
应用机器学习的一些建议

应用机器学习的一些建议

作者: 此间不留白 | 来源:发表于2019-02-25 21:59 被阅读0次

    前言

    根据之前的学习,我们已经了解了线性回归的假设函数以及损失函数,线性回归损失函数正则化的公式如下所示;

    J(\theta) = \frac{1}{2m}[\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{j=1}^{m}\theta_j^2]

    对该算法进行进一步的优化,通常有以下方法:

    1. 获得更多训练样本
    2. 使用更少的特征
    3. 获得更多的特征
    4. 增加多项式特征
    5. 增大或者减小\lambda的值

    运用以上这些方法对算法进行优化需要花费大量的时间和精力,采用机器学习诊断法(Machine Learning Diagnostic)将会是是一个更好的选择。

    机器学习诊断法

    机器学习诊断法即是一种机器学习测试方法,通过使用这种测试方法,不仅能够直观了解到机器学习算法是否能够工作,并且能够知道怎样改进算法才能使算法工作的更好。

    • 评估假设函数
      在线性回归的学习中,已经讨论过过拟合和欠拟合的问题,评估假设函数是否与数据拟合非常重要,在特征较少时,我们可以画出训练集与假设函数的图像进行评估。但是在面临训练集较多特征时,显然这一方法是不现实的。
      对于多特征的假设函数评估时,通常将已有的数据分为两组,一组称之为训练集(Training set),而另一组称之为测试集(Test set),一种典型的分割方法是按照训练集与测试集按照7:3的比例进行分割。按照这种分割方式,随机选择70%的数据作为训练集,剩下的30%作为测试集。

    • 参数训练过程
      以线性回归为例,参数\theta的训练步骤通常如下所示:

      • 利用训练集最小化损失函数J(\theta),得到参数\theta
      • 计算测试集误差,通常用如下公式表示:

      J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_{\theta}(x_{test}^{(i)})-y_{test}^{(i)})^2

    注意:逻辑回归的训练过程跟以上过程一样,只是计算J_{test}(\theta)的公式发生变化。

    模型选择

    在过拟合的问题中,我们已经知道即使假设函数对训练数据很好的实现拟合,但并不意味着该假设函数能够对训练集中没有出现的新样本有很好的泛化能力。更为普遍的规律是即使通过损失函数得到的参数能够很好的拟合一些数据集,那么用同一训练集计算得到的误差,并不能很好的估计实际的泛化误差即该假设对新样本的泛化能力。
    假设要选择一个模型,并且评估该模型的假设函数对新样本的泛化能力,可以按照以下步骤进行:

    1. 首先,选择第一个模型,最小化该模型的训练误差,得到一个参数向量\theta^{(1)}.然后,选择第二个训练模型,用它来拟合训练集,得到一个参数向量\theta^{(2)}.……,以此类推,得到所有模型得训练参数\theta.

    2. 对所有模型求出测试集误差J_{test}(\theta^{(1)})J_{test}(\theta^{(2)})……J_{test}(\theta^{d})

    d是一个新的参数,在线性回归中,可以认为d是假设函数的次数。

    1. 从这些模型中选出最好的模型,即测试误差最小的模型。

    通过以上方法,可以得到一个测试误差最小的模型,通过该模型的假设函数可以很好的拟合训练集,但是对于新的样本,给模型的并不一定能够实现能很好的数据拟合,对于这个问题,通常采用如下方式解决。

    将数据集分割为三个部分,分别是训练集,交叉验证集(Cross Validation,通常标记为cv)和测试集,数据集的典型分配比例是6:2:2
    有了交叉验证集之后,求出所有模型得交叉验证集误差J_{cv}(\theta^{(d)}),选择误差最小的模型。用剩下的测试集就可以可以评估模型的泛化误差了。

    诊断方差(Variance)与偏差(bias)

    • 偏差问题与方差问题
      机器学习算法中一般会出现两类问题,一种是偏差比较大,另一种是方差比较大,即也是欠拟合和过拟合问题。
      我们已经了解了训练误差和交叉验证集误差的公式,分别如下所示:
      J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^{m}((h_\theta(x^{(i)}))-y^{(i)})^2

    J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}((h_\theta(x_{cv}^{(i)}))-y_{cv}^{(i)})^2

    假设函数的次数d与其训练误差之间的关系可以如下所示:

    由以上图像可以看出,当假设函数的次数增大时,训练误差逐渐减小,而对于交叉验证误差,当多项式的次数大于一定值是,其误差逐渐增大。
    分析以上图像,当J_{cv}(\theta)曲线趋于最小值的左边时,容易出现高偏差,而曲线趋于右边是容易出现高方差问题。具体而言,就是训练误差与验证误差值比较接近时,会出现高偏差问题,而训练误差与验证误差相差较大时,容易出现高方差问题。

    • 偏差,方差与正则化之间的关系
      损失函数正则化的公式如下所示:
      J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}((h_\theta(x^{(i)}))-y^{(i)})^2+\frac{\lambda}{2m}\sum_{j=1}^{m}\theta_j^{2}

    \lambda参数的大小,对于偏差和方差问题有着很大的影响,讨论一下两种极端情况:
    \lambda很大,会导致\theta_j的平方项增大,进而导致欠拟合问题。
    \lambda很小,这种情况会导致正则化的部分其值减小,正则化会失去其意义,进而导致过出现拟合问题。

    1. 选择合适的\lambda值可以按照分别将\lambda设置为0,0.01,0.02,0.04……,一般按照两倍步长的速度增长。

    2. 根据以上选择的一系列\lambda值,分别通过其损失函数得到一系列\theta向量,可以用\theta^{(1)},\theta^{(2)} \theta^{(3)}……

    3. 根据以上得到的一系列\theta向量,分别计算J_{cv}(\theta^{(1)}),J_{cv}(\theta^{(2)}), J_{cv}(\theta^{(2)})……,并选择其中最小的一组。

    4. 根据以上得到的\theta向量,计算J_{test}(\theta)的值,观察其测试误差。

    综合以上,正则化参数\lambda参数与其J_{cv}(\theta),J_{train}(\theta)的关系如下曲线所示,\lambda减小,会导致高方差问题,而\lambda较大时,会导致高偏差问题。

    学习曲线

    学习曲线是用来诊断算法的运行情况或者改进算法的一种很好的工具。学习曲线是数据集大小与误差之间的关系,当训练集的样本数目较小时,假设函数能够很好的拟合样本数据,但是随着训练集样本大小的增加,拟合效果也会越来越差,训练误差,验证误差与样本大小的关系如下曲线所示,可以清楚的看到,当训练样本越大时,训练误差与验证误差之间的值也会越来越小,这说明了样本越多,假设函数的拟合效果越好。


    • 高偏差的情况
      出现高偏差的情况如下所示,随着样本的增加,验证误差与训练误差越来越接近,并且验证误差不再随着训练样本的增大而减小,而是会趋于不变,并且是一个很大的值,这说明训练样本的增大并不能减小误差。


    • 高方差的情况

    出现高方差时,其学习曲线如下所示,可以看出,随着训练样本的增大,训练误差集越来越大,验证集误差越来越小,两者之间的差值越来越小,这说明增大训练样本对改进算法是有帮助的。


    相关文章

      网友评论

          本文标题:应用机器学习的一些建议

          本文链接:https://www.haomeiwen.com/subject/nkcbyqtx.html