给自己设计的模型做个诊断(偏差Vs.方差)
白白的敲了两个晚上,没保存,重来。。
对于机器学习ML实际应用中的几点建议
调试学习算法中决定下一步的选择
假设你利用正则化后的线性回归来预测房价
但利用训练出来的函数应用在新的房屋集中时,会发现对于预测出现了很大的误差,接下来可以选择:
-
获取更多的训练样本
-
尝试减少训练集中的特征数
-
尝试增加更多的特征数
-
增加多项式的次数(\(x_1^2,x_2^2,x_1x_2,etc\))
-
增加或减少参数\(\lambda\)
以上的每种选择对于实际的应用检测中都会花费大量的时间,因此这里引出了一种新的方法:机器学习学习诊断法(ML-diagnostic),将有助于减少在选择和调试中所花费的时间。
评估假设函数
即使从训练集中学习到的假设函数对于所有的训练集已经做到了误差最小,但对于新的数据任然有可能是不准确的(有过拟合的存在-overfitting),因此,为了评估假设,给定训练样本的数据集,我们可以将数据分为两组:训练集和测试集。 通常,训练集由所有的数据的70%组成,测试集是剩余的30%。各自的用途如下:
1.使用训练集以学习参数\(\Theta\)和最小化代价函数\(J_{train}(\Theta)\)
2.测试集用来计算假设函数的误差\(J_{test}(\Theta)\)
这里重点叙述测试集误差的计算(the test set error)
1.对于线性回归有:
2.对于分类问题有:
称之为误分类率(Misclassification error),其计算结果以二进制数0/1,又称为0/1误分类率,测试集的平均测试误差为:
上述的测试结果为我们评估假设函数提供了依据。
模型选择与训练/验证/测试的分类
给定具有不同多项式次数的模型,我们可以使用系统的方法来识别“最佳“的函数模型。 通过测试每个次数下的多项式并查看错误结果。这里引入一种最常用也是很有效的数据集分割效果:
-
训练集(Training set):60%
-
交叉验证集(Cross validation):20%
-
测试集(Test set):20%
我们现在可以使用以下方法计算三个不同集的单独的误差(error)值:
1.使用训练集优化每个次数下的多项式Θ中的参数。
2.使用交叉验证集找到具有最小误差(error)的多项式次数d。
3.使用具有\(J_{test}(\Theta^{(d)})\)的测试集,(d来自于是2步骤中误差值较小的多项式参数)来估计广义误差。
偏差(bias)VS 方差(variance)
诊断:高偏差还是高方差
我们需要区分到底是方差还是偏差的问题导致了预测函数的性能,一般我们认为过拟合(overfitting)为高方差问题而欠拟合(underfitting)为高偏差问题,我们需要的是介于二者间的黄金平均值。
具体如下图所示:
高偏差(underfitting):\(J_{train}(\Theta)\)和\(J_{CV}(\Theta)\)很高,近似于\(J_{train}(\Theta) \approx J_{CV}(\Theta)\)
高方差(overfitting):\(J_{train}(\Theta)\)很低,而\(J_{CV}(\Theta)\)远远大于****\(J_{train}(\Theta)\)
在之前的小节中我们知道同过正则化的处理,我们可以避免过拟合和欠拟合的发生,而实际上对于正则化的处理中,参数lambda的选择也影响着拟合的效果:
1.创建参数lambda集合(如λ∈{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24})
2.创建若干不同次数的多项式(包含任意变量)
3.通过不同的lambda进行迭代,对于每个lambda都通过模型学习一些Θ
4.利用无正则化下(lambda=0)学习到的参数Θ来计算交叉验证误差
5.选择在交叉验证集上产生最低错误的最佳组合
6.选取最佳组合Θ和λ,将其应用于\(J_{test}(\Theta)\),以查看它是否具有很好的泛化问题。
学习曲线(learning curves)
在很少数量的数据(例如1,2或3)上训练一个算法出现的误差很小,因为我们总是可以找到恰好接触这些点数的二次曲线。因此:
- 随着训练集的增大,二次函数的误差将增大
- 误差值将在m达到一定值后平稳
具体的,高偏差下(如下图所示):
训练集m较少下:\(J_{train}(\Theta)\)很小,\(J_{CV}(\Theta)\)将很高
训练集m较多时:\(J_{train}(\Theta)\)和\(J_{CV}(\Theta)\)近似相等,即:\(J_{train}(\Theta) \approx J_{CV}(\Theta)\)
高方差下(如下图所示):
训练集m较少时:\(J_{train}(\Theta)\)很小,\(J_{CV}(\Theta)\)将很高
训练集m较多时:岁训练集数目的增多\(J_{train}(\Theta)\)增大, \(J_{CV}(\Theta)\)逐渐减小但不会变为一个常数(without leveling off),此外, \(J_{train}(\Theta) \lt J_{CV}(\Theta)\)它们之间的差异仍然很大。
根据诊断的结果来综合考虑下接下来怎么做
我们一般的决策过程如前述所示,这里根据诊断的结果作出相应状况的补充:
- 增加更多的训练样本:适用于高方差情况下
- 减少特征的数量:适用于高方差情况下
- 增加特征数:适用于高偏差下
- 增加多项式的次数:适用于高偏差下
- 减小参数lambda的大小:适用于高偏差下
- 增大参数lambda的大小:适用于高方差下
诊断当前的神经网络系统:
所训练的神经网络若训练的参数较小下系统更易于欠拟合,计算量很少。
所训练的神经网络参数过多或神经网络的隐藏层很多时容易过度拟合,其计算量很大。 在这种情况下,可以使用正则化(增加λ)来解决过拟合。
默认下,使用单个隐藏层是很好的。当设计的网络中有多个隐藏层时, 使用交叉验证集在多个隐藏层上训练神经网络,然后选择效果最好的。
模型复杂度的影响:
低阶多项式(低模型复杂度)具有高偏差和低方差。 在这种情况下,该模型的配合不佳。高阶多项式(高模型复杂度)对训练数据的拟合度很高,但测试数据表现效果极差。 这时对训练数据的偏差较低,但方差很大。实际上,我们希望在两者之间的某个地方选择一个参数模型,这样可以很好地适应数据。