以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏
在上一节中,我们了解了如何利用测试集来评估模型性能。今天我们来进一步完善这个想法,让你使用该技术自动选择一个更好的模型。
文章目录
- 模型选择
- 交叉验证 Cross Validation
- 交叉验证例子之手写识别
模型选择
上一节我们了解到,当你的模型很好地拟合训练集的时候,训练集的代价函数就不能很好地表示模型准确度(因为其代价函数基本为0),这将远远低于泛化误差(在新数据上的误差)。在此时,测试集的代价函数就比训练集的代价函数能够更好地反映模型的准确程度了。那么我们该如何利用测试集来选择更好的模型嘞。
以上是十个不同特征数量的模型,我们如何从中选择一个合适的模型呢?我们可以依次用这十个模型对数据进行拟合并计算出 J t e s t J_{test} Jtest,通过J的大小来判断谁的效果更好。
例如你在测试完这十个模型后,发现 d = 5 d=5 d=5时, J ( w [ 5 ] , b [ 5 ] ) J(w^{[5]},b^{[5]}) J(w[5],b[5])的值为最小,那么你可能会认为模型5的效果是最好的。
但是事实上,我们所测得的J可能是一种乐观的估计,它可能比真实的J要小些,原因是我们忽略了另一个变参数,就是d的大小。有可能就是恰好这个测试集的数据分布离d=5的函数比较近一些,无法排除偶然性。这个我觉得其实乍一看挺难理解的。可以做一个类比,测试集上的d就类似于训练集上的w和b,它们都是通过各自的数据集所选出来的,所以不能在各自的数据集上进行验证。因此在选择模型的时候,并不能采用这种方法。
交叉验证 Cross Validation
以上问题的解决方法是,将数据分为三个不同的子集,分别是训练集,交叉验证集(也可叫做验证集、开发集 dev set),以及测试集。
如上图,我们将数据集的60%设置为训练集,20%设置为交叉验证集,剩下20%为测试集。
我们使用以下三个数学公式分别计算其代价函数:
训练集误差:
J t r a i n ( w , b ) = 1 2 m t r a i n [ ∑ ( f − y ) 2 ] J_{train}(w,b)=\frac{1}{2m_{train}}[\sum (f-y)^2] Jtrain(w,b)=2mtrain1[∑(f−y)2]
交叉验证集误差:
J c v ( w , b ) = 1 2 m c v [ ∑ ( f − y ) 2 ] J_{cv}(w,b)=\frac{1}{2m_{cv}}[\sum (f-y)^2] Jcv(w,b)=2mcv1[∑(f−y)2]
测试集误差:
J t e s t ( w , b ) = 1 2 m t e s t [ ∑ ( f − y ) 2 ] J_{test}(w,b)=\frac{1}{2m_{test}}[\sum (f-y)^2] Jtest(w,b)=2mtest1[∑(f−y)2]
如此,在上面那个例子中,模型选择的方法是这样的:首先在训练集训练从而找到合适的w,b;然后在交叉验证集上测试不同的d谁的价值函数最小,最后,在测试集上测试代价最小的d的模型的泛化能力。
交叉验证例子之手写识别
交叉验证集同样也可以用于别的模型,例如我们之前了解的手写识别。
例如你有三个神经网络模型架构,你想从中选择效果最好的模型。那么步骤仍然和以前一样,先在训练集上得出参数w,b,然后在交叉验证集上获得代价函数最小的架构,再在测试集上证明其泛化能力。这样的步骤可以确保好的效果不是因为数据所造成的偶然结果。
为了给读者你造成不必要的麻烦,博主的所有视频都没开仅粉丝可见,如果想要阅读我的其他博客,可以点个小小的关注哦。