学习算法评估

一. 评估预测函数

  • 获取更多的训练集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(Θ)高很多。

下图总结:

学习算法评估_第1张图片

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

学习算法评估_第2张图片

在上图中,我们可以看到,随着λ增长,我们的拟合曲线越陡峭。另一方面,随着λ接近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(Θ).
如果是高偏差学习算法,更多的训练数据对于这个算法本身也没有帮助。

学习算法评估_第3张图片

2. 高方差

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

学习算法评估_第4张图片

六. 后记

我们的决策过程如下:

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

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

模型复杂度影响 Model Complexity Effects:

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

你可能感兴趣的:(学习算法评估)