美文网首页
学习算法评估

学习算法评估

作者: JaiUnChat | 来源:发表于2017-02-01 22:35 被阅读39次

    一. 评估预测函数

    • 获取更多的训练集Getting more training examples
    • 尝试使用少量的特征Trying smaller sets of features
    • 尝试额外的特征Trying additional features
    • 尝试多项式特征Trying polynomial features
    • 增减Increasing or decreasing λ

    在完成上述解决误差的方法尝试之后,继续评估新的预测函数。
    预测函数可能会对训练集表现为低误差但实际预测却不精准(过拟合)。因此,可以把训练集分成两组:一个训练组,一个测试组。一般情况下,训练组占总数据集的70%,测试组是剩下的30%。

    之后:

    • 使用训练组学习 Θ, 最小化 Jtrain(Θ)
    • 计算测试组误差Jtest(Θ)
    测试组误差The test set error
    • 线性回归: Jtest(Θ)=12mtest∑mtesti=1(hΘ(x(i)test)−y(i)test)2
    • 对于分类算法~错误分类误差(也叫0/1错误分类误差):


    这会基于错误分类得到一个0/1误差结果。测试组的平均测试误差:

    这会计算出错误分类的比例.

    二. 模型选择和训练/验证/测试组Model Selection and Train/Validation/Test Sets

    仅因为学习算法非常好的拟合训练组,并不意味着它就是一个好的算法。可能只是过拟合。预测函数的误差在训练参数的这组数据上比其他数据组低。

    我们可以对不同阶数的多项式模型使用系统化的方法来鉴别‘最好的’函数。测试每种阶数的多项式然后查看误差解雇来选择模型。

    新的划分训练集方法:

    • 训练组: 60%
    • 交叉验证组: 20%
    • 测试组: 20%

    之后就可以针对三组不同的数据计算三个独立的误差值。

    使用训练组的数据来最优化不同阶的多项书Θ参数。
    使用交叉验证组的数据找到最小误差的多项式阶数 d 。
    使用测试组的数据评估泛化,Jtest(Θ(d)), (d = 最低误差的多项式参数theta);
    这样子,多项式的阶数d就不是用测试组的数据来训练的了。

    核心思想

    用测试组计算theta参数,然后用这个参数计算Jtest和JCV

    三. 诊断偏差vs.方差 Diagnosing Bias vs. Variance

    接下来检验关系多项式d和我们预测函数的欠拟合或者过拟合的关系。

    • 我们需要分辨是偏差还是方差问题导致的低质量预测。
    • 高偏差是欠拟合和高方差是过拟合。 理想化地,我需要找到这两点的黄金分割。

    训练误差将随着多项式阶数d趋向减少。
    同时,交叉验证误差随着d增长到某个点趋于下降,之后随着d增加又将继续增加,形成一个二次抛物线形。

    高偏差(欠拟合): Jtrain(Θ) 和 JCV(Θ) 都很高。并且, JCV(Θ)≈Jtrain(Θ).

    高方差(过拟合): Jtrain(Θ) 将会很低 JCV(Θ) 将比 Jtrain(Θ)高很多。

    下图总结:

    四、正规化和偏差/方差Regularization and Bias/Variance

    在上图中,我们可以看到,随着λ增长,我们的拟合曲线越陡峭。另一方面,随着λ接近0,拟合趋于过拟合。所以,如何选择我们的λ参数来恰好拟合?为了选择模型并正则化λ项,我们需要:

    1. 创建λ的列表 (i.e. λ∈{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24});
    2. 创建一系列不同阶多项式的模型或者不同的变量。Create a set of models with different degrees or any other variants.
    3. 迭代遍历所有λs, 对每个λ ,遍历所有模型来学习 Θ参数.
    4. 学习选中的模型的参数 Θ , 然后用选中的λ参数的Jtrain(Θ) .
    5. 用学习得出 Θ参数(对应的选中的λ)计算训练误差Jtrain(Θ)不包含正则项或者 λ = 0.
    6. 用学习得出 Θ参数(对应的选中的λ)计算交叉验证误差JCV(Θ)不包含正则项或者 λ = 0.
    7. 选择产生最小交叉验证误差的组合.
    8. 用该组合的 Θ 和 λ, 应用到Jtest(Θ) 来看看是否在需要处理的问题中有良好的泛化。
    Matlab 代码
    for i = 1:length(lambda_vec)
        lambda = lambda_vec(i)
        theta = trainLinearReg(X,y,lambda);
        error_train(i) = linearRegCostFunction(X, y, theta, 0);
        error_val(i) = linearRegCostFunction(Xval, yval, theta, 0);
    end
    

    五. 学习曲线 Learning Curves

    如果算法的训练集很小(只有两三个点),那很容可能误差会为0。因为我们的总是可以找到二次曲线完美拟合数据。因此:

    • 随着训练集变得越来越大,二次函数的误差会越来越大.
    • 误差值在到了某个特定训练集数量m后会趋于稳定.
    1. 高偏差

    小训练集:
    Jtrain(Θ) 低,JCV(Θ) 高
    大训练集:
    Jtrain(Θ) 和 JCV(Θ) 都高
    并且 Jtrain(Θ)≈JJCV(Θ).
    如果是高偏差学习算法,更多的训练数据对于这个算法本身也没有帮助。

    2. 高方差

    训练集小:
    Jtrain(Θ)低,JCV(Θ)高.
    训练集大:
    Jtrain(Θ)随着训练集变大而变大
    JCV(Θ)持续降低然后趋于稳定,无限接近某个值。并且 Jtrain(Θ) < JCV(Θ) 但他们之间的差别还是显著的.
    如果是高方差算法,增加训练集数量可能会有帮助.

    六. 后记

    我们的决策过程如下:

    1. 获取更多的训练集数据: 修正高方差
    2. 尝试更小的特征集Trying smaller sets of features: 修正高方差
    3. 增加特征: 修正高方差
    4. 增加多项式特征: 修正高偏差
    5. 降低λ: 修正高偏差
    6. 增加λ: 修正高方差.
    7. 诊断神经网络

    参数少的神经网络更容易欠拟合A。计算代价也较低。
    参数越多的神经网络越容易过拟合。计算代价也较高。这种情况下,用正则化(增加lambda)来处理过拟合。
    一开始用单隐藏层作为默认出事是很不错的。然后用交叉验证组的数据来训练它。最后在选择误差小的。

    模型复杂度影响 Model Complexity Effects:

    低阶多项式(低模型复杂度)会表现为高偏差和低方差。这时模型拟合都很差。
    高阶多项式(高模型复杂度)会表现为低偏差,高方差。这时会极其好的拟合训练集,非常差的拟合验证集。
    在实际操作中,我们会选这两者之间的一个可以很好泛化又能合理地拟合的度。

    相关文章

      网友评论

          本文标题:学习算法评估

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