一. 评估预测函数
- 获取更多的训练集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,拟合趋于过拟合。所以,如何选择我们的λ参数来恰好拟合?为了选择模型并正则化λ项,我们需要:
- 创建λ的列表 (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});
- 创建一系列不同阶多项式的模型或者不同的变量。Create a set of models with different degrees or any other variants.
- 迭代遍历所有λs, 对每个λ ,遍历所有模型来学习 Θ参数.
- 学习选中的模型的参数 Θ , 然后用选中的λ参数的Jtrain(Θ) .
- 用学习得出 Θ参数(对应的选中的λ)计算训练误差Jtrain(Θ)不包含正则项或者 λ = 0.
- 用学习得出 Θ参数(对应的选中的λ)计算交叉验证误差JCV(Θ)不包含正则项或者 λ = 0.
- 选择产生最小交叉验证误差的组合.
- 用该组合的 Θ 和 λ, 应用到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(Θ) 但他们之间的差别还是显著的.
如果是高方差算法,增加训练集数量可能会有帮助.
六. 后记
我们的决策过程如下:
- 获取更多的训练集数据: 修正高方差
- 尝试更小的特征集Trying smaller sets of features: 修正高方差
- 增加特征: 修正高方差
- 增加多项式特征: 修正高偏差
- 降低λ: 修正高偏差
- 增加λ: 修正高方差.
- 诊断神经网络
参数少的神经网络更容易欠拟合A。计算代价也较低。
参数越多的神经网络越容易过拟合。计算代价也较高。这种情况下,用正则化(增加lambda)来处理过拟合。
一开始用单隐藏层作为默认出事是很不错的。然后用交叉验证组的数据来训练它。最后在选择误差小的。
模型复杂度影响 Model Complexity Effects:
低阶多项式(低模型复杂度)会表现为高偏差和低方差。这时模型拟合都很差。
高阶多项式(高模型复杂度)会表现为低偏差,高方差。这时会极其好的拟合训练集,非常差的拟合验证集。
在实际操作中,我们会选这两者之间的一个可以很好泛化又能合理地拟合的度。
网友评论