吴恩达机器学习笔记——十、实用建议和技巧
1 前言
如果在测试集上误差很大,我们有以下几种方法来尝试减小误差:
- 增大训练集
- 减少使用的特征数量,减少过拟合
- 使用更多的特征(之前取的特征可能不全面)
- 尝试增加多项式特征(x12, x22, x1x2…)
- 减小正则化参数λ
- 增大正则化参数λ
但是很多时候选择以上哪一种方法是凭感觉的,这可能会浪费很多时间,以下我们将介绍几种方法,让我们提高效率
2 评价算法性能
我们用训练集的误差来评估,训练集一般是从整体数据集中随机选出来的30%的数据点。
2.1 对于线性回归
2.2 对于Logistics回归
2 模型选择
本节来讨论如何确定正则化参数λ,如何确定回归多项式的次数,该选用哪些特征来构建学习算法
2.1 确定回归多项式的次数
假设我们要做一个多项式回归,但是不知道该用几次多项式来作为回归模型,可能的选择有d=1, 2, 3, …, 10,这个多项式次数d可以看做是一个多出来的参数。
×以下三步是错误做法
- 首先我们针对每个种多项式的次数用训练集拟合出来一个参数向量Θ(d)
- 对以上拟合出来的每一组Θ(d),在测试集上计算其误差Jtest(Θ(d))
- 选择误差最小的模型。
但是通过这个测试集选出的模型参数不能代表这个模型真正的泛化能力,这是因为我们用测试集拟合了未定的参数d,也就是我们选择了在测试集上表现最好的d,很可能是对泛化能力的过于乐观的估计,未来没见过的样本才是d真正的测试集
所以我们将手中的样本分为三个部分:
- 训练集:60%,用来拟合权重
- (交叉)验证集:20%,用来选择模型,简称cv
- 测试集:20%,用来评估泛化能力
我们就有了在三个集上的误差:
有了新的数据集分类,我们重新进行模型选择的步骤:
- 首先我们针对每个种多项式的次数用训练集拟合出来一个参数向量Θ(d)
- 对以上拟合出来的每一组Θ(d),在验证集上计算其误差Jcv(Θ(d))
- 选择误差最小的模型。(假设这里d=5时再测试集上的误差最小)
- 在测试集上计算误差Jtest(Θ(5)),用来表示我们所训练的模型的泛化能力
3 判断过拟合与欠拟合
下图表示在进行拟合时方差(交叉验证集上)和偏差(训练集上)随着拟合多项式次数d的变化趋势。
- 曲线左侧是欠拟合问题,此时又称为高偏差问题,表现形式是训练集的偏差和交叉验证集的方差都很大。
- 曲线右侧是过拟合问题,此时又称为高方差问题,表现形式是训练集的偏差较小,而交叉验证集的方差非常大。
4 如何选择正则化系数
4.1 选择原则
如果λ选择太小,则会出现过拟合,若λ选择太大,则会出现欠拟合(因为过度简化模型了)。
我们令λ从0开始逐渐增大,λ=0, 0.1, 0.2, 0.4, 0.8, 1.6, …,在训练集上分别训练出θ(1), θ(2), θ(3),……,带入交叉验证集上去计算Jcv(θ(i)),选择最小的Jcv(θ(i))对应的λ,假设这里选择θ(5)。
注:这里的交叉验证集其实是λ的训练集,而λ和θ的泛化能力是靠测试集检验的。
4.2 λ对偏差与方差的影响
若我们的模型如下图所示:
注意:我们此处定义了一种训练结束后衡量训练集误差的项Jtrain(θ)
则随着λ的变化,Jtrain(θ)和Jcv(θ)的变化趋势是:
在λ较小时能很好拟合训练集,因为惩罚项很小,故偏差很小,λ增大,则在训练集上的表现变差。而不论λ过大还是过小,在交叉验证集上都会令代价函数取得较大的值。
5 学习曲线
用来判断模型是否陷入了高方差或者是偏差
5.1 概念
假设我们用二次函数来对m个数据点进行拟合。
当训练集样本数m较小时,用二次函数能较好的进行拟合,偏差较小,而随着训练集增大,二次函数开始愈来愈难拟合所有的样本点了,偏差开始增大。
而当样本点较少时,拟合出的模型不具有很好的泛化性能,因此在交叉验证集上表现出较大的方差,而样本点较多时,泛化性能会提高。
5.2 例子
5.2.1 当模型处于高偏差时
因为参数很少,当数据点很多时,验证集上的误差和训练集上的误差将会很接近。
并且此时验证集上的误差和训练集上的误差都很大,因为用二次多项式对该样本进行拟合显然次数不够,这与3中的-曲线反应的高偏差(欠拟合)的情况相一致。
这说明,当我们的模型处在高偏差(bias)之中时,即使增大训练集,增大样本个数,对误差(error)的减小也是无用的。
5.2.1 当模型处于高方差时
此时验证集上的误差很大,训练集上的误差很小,此时发生了过拟合,这与3中的曲线反应的高方差(过拟合)的情况相一致。
但是如果我们继续增大样本数,Jcv会逐渐下降,Jtrain会逐渐增大,并趋于一致。这说明,当我们的模型处在高方差(variance)之中时,增大训练集,增大样本个数,对验证集上误差(error)的减小是有帮助的。
6 来点实际应用
线性回归
假设我们正在使用正则化线性回归去预测一个房子的房价,但是你训练出的模型在测试集上出现了很大的误差。你有以下解决方案:
- 增大训练集→可以解决高方差问题
- 减小训练集→可以解决高方差问题
- 增加特征数→解决高偏差问题
- 增加多项式的项数(x12, x1x2…)→解决高偏差问题
- 增大λ→解决高偏差问题(个人感觉说反了,是解决高方差的过拟合问题)
- 减小λ→解决高方差问题(个人感觉说反了,是解决高偏差的欠拟合问题)
神经网络
一般来讲网络越复杂越好,但是这样会增大计算量,并且出现过拟合问题(加入正则化项来解决)。
一般用单隐层神经网络,但实际应用中可以用交叉验证集的方法来试验几个隐层的神经网路效果最好。