Ch10 是对假设函数在训练集和测试集的不同效果进行了解读。开篇给出了使假设函数泛化更好的一些解决方案。为了让在训练集上生成的假设函数泛化能力更好,可以对数据集使用二划分(70% train 30% test)/ 三划分(60% train 20% cross validation 20% test)的手段,以进行模型选择。对于高方差/高偏差问题,可认为其分别对应于过拟合/欠拟合,并对开篇的解决方案归类,日后可相应针对特定的场景选择方案进行解决。
目录
评估假设函数
对于预测不准的问题,解决方法有:
- 增加数据集样本
- 减少假设函数中的特征
- 增加假设函数中的特征
- 尝试增加特征的非线性组合
- 增大正则项$\lambda$
- 减小正则项$\lambda$
但假设函数若在训练样本中拟合误差小,仍有可能因为过拟合在预测新样本时出现较大的失误。因此,有了将训练样本分类的想法:70%样本用于做训练集,用于评估训练效果;30%样本用于做测试集,用于评估泛化效果。
注意:划分训练/测试集,需要针对原样本是否有序而进行乱序处理。
因此新的步骤是:
- 在训练集上训练得到使得$J_{train}(\Theta)$最小化的$\Theta$
- 计算测试集误差$J_{test}(\Theta)$
泛化误差
$m_{test}$是测试集的样本个数
对于回归问题
$$J_{test}(\Theta)=\frac1{2m_{test}}\sum_{i=1}^{m_{test}}(h_{\Theta}(x^{(i)}{test})-y^{(i)}{test})^2$$
对于分类问题
$$err(h_{\Theta}(x^{(i)}),y^{(i)})=\left {
\begin{aligned}
&1, ;if; h_{\Theta}(x^{(i)})\leq 0.5; and; y^{(i)}=0 ;or; h_{\Theta}(x^{(i)})<0.5 ;and; y^{(i)}=1\
&0, ;otherwise
\end{aligned}
\right .
$$
$$J_{test}(\Theta)=\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_{\Theta}(x^{(i)}{test}),y^{(i)}{test})$$
模型选择
因为在训练集上进行训练,故算法能够很好拟合训练集,其训练误差往往会小于在其他数据集上的预测误差。对此模型直接拿去在测试集上做预测往往效果不佳。
故我们想到要做模型的选择。
一个典型的例子是高次特征假设函数的选取。
将样本分为3个集合:
- 60%训练集(traininng set)
- 20%交叉验证集(cross validation set)
- 20%测试集(test set)
模型选择步骤:
- 对训练集针对不同高次假设函数进行训练,得到各次项假设函数的$\Theta$.
- 分别对第一步得到的各高次项假设函数在交叉验证集中求取损失,选出损失最小的那个高次项假设函数。
- 用第二步选出的假设函数对测试集评估泛化误差。
高偏差&高方差问题(待补充)
学习算法的泛化误差可分为三个部分:偏差(bias),方差(variance),噪声(noise)。噪声属于不可约减的误差,所以在估计学习算法性能时,我们主要关注偏差与方差。
偏差:预测值与真实值之间的差距。偏差越大,则预测的结果越偏离真实数据集标签。
方差:预测值的变化范围,即样本内各点预测值的离散程度。方差越大,预测的结果就越分散。
预测函数的偏差&方差形象理解:(图中红色圆心为真实标签,蓝色点为各样本点预测值)
偏差和方差随模型复杂度的变化关系如下图:
所以高偏差和高方差可与欠拟合和过拟合联系起来,高偏差对应于欠拟合,高方差对应于过拟合。
随着变量幂次的升高,训练误差越来越小,而泛化误差($J_{cv}(\Theta)$或$J_{test}(\Theta)$)往往先降低,再升高。
如下图所示
由图可看出具体的趋势是:
$J_{cv}(\Theta) \approx J_{test}(\Theta)$
高偏差/欠拟合:$J_{train}(\Theta)$和$J_{cv}(\Theta)$都很高;
高方差/过拟合:$J_{train}(\Theta)$很低,而$J_{cv}(\Theta)$很高.
正则化
$$J(\theta)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\frac{\lambda}{2n}\sum_{j=1}^m\theta^2$$
$m$和$n$不一样:正则化项求和是对$\theta_j$求和,而损失函数是对各样本平方差求平均。
$$
J_{train}(\theta)=\frac{1}{2m_{train}}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\frac{\lambda}{2n}\sum_{j=1}^m\theta^2
$$
$$
J_{train}(\theta)=\frac{1}{2m_{cv}}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2
$$
$$
J_{train}(\theta)=\frac{1}{2m_{test}}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2
$$
三者随$\lambda$的取值的变化情况为
曲线来源:训练集的误差包含正则项,$\lambda$越小,则故误差越小。
而对于交叉验证集/测试集,则会出现欠拟合和过拟合的情况。
曲线左边,是过拟合($\lambda$过小);曲线右边是欠拟合。
($\lambda$过大,)
用正则化进行模型选择的步骤:
- 选择一系列$\lambda$,通常取倍数倍数列(λ∈{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24}))。
- 用其训练不同正则项模型。
- 用训练模型,分别求取交叉验证集上的误差。
- 寻找最小的误差,用得到的$\theta$、$\lambda$用于测试集的预测。
学习曲线
学习曲线刻画的是训练样本数$m$对$J_{train}(\theta)$和$J_{cv}(\theta)$的影响
正常的学习曲线
欠拟合的学习曲线
过拟合的学习曲线
接下来的工作
对于本章开篇的一些面对预测不准的解决方法,我们可以找到对应的一些问题。即面对不同的问题我们采取不同的解决方法。
- 增加数据集样本–>高方差/过拟合
- 减少假设函数中的特征–>高方差/过拟合
- 增加假设函数中的特征–>高偏差/欠拟合
- 尝试增加特征的非线性组合–>高偏差/欠拟合
- 增大正则项$\lambda$–>高方差/过拟合
- 减小正则项$\lambda$–>高偏差/欠拟合
上述讨论基本上是对线性/logistic回归问题,而对于神经网络,也有同样的问题和解决策略:
一个神经网络的神经元越少,越可能陷入欠拟合的问题,而神经元越多,则带来欠拟合问题的同时,也带来计算量大的问题,我们可以引入正则项来解决。