Evaluating a Learning Algorithm
Desciding What to Try Next
先来看一个有正则的线性回归例子:
当在预测时,有很大的误差,该如何处理?
1.得到更多的训练样本
2.选取少量的特征
3.得到更多的特征项
4.加入特征多项式
5.减少正则项系数λ
6.增加正则项系数λ
很多人,在遇到预测结果并不理想的时候,会凭着感觉在上面的6个方案中选取一个进行,但是往往花费了大量时间却得不到改进。
于是引入了机器学习诊断,在后面会详细阐述,
Evaluating a Hypothesis
怎样用你学过的算法来评估假设函数 ,讨论如何避免 过拟合和欠拟合的问题。
对于这个简单的例子,我们可以对假设函数hθ(x) 进行画图 ,然后观察图形趋势, 但对于特征变量不止一个的这种一般情况 ,还有像有很多特征变量的问题 想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现。因此, 我们需要另一种方法来评估我们的假设函数 。
如下,给出了一种评估假设函数的标准方法:
将这些数据集分为两个部分:Training set 和 Test set, 即是 训练集和测试集,
其中一种典型的分割方法是, 按照7:3的比例 ,将70%的数据作为训练集, 30%的数据作为测试集 。
PS:如果数据集是有顺序的话,那么最好还是随机取样。比如说上图的例子中,如果price或者size是按递增或者递减排列的话,那么就应该随机取样本,而不是将前70%作为训练集,后30%作为测试集了。
接下来 这里展示了一种典型的方法,你可以按照这些步骤训练和测试你的学习算法 比如线性回归算法 。首先 ,你需要对训练集进行学习得到参数θ, 具体来讲就是最小化训练误差J(θ) ,这里的J(θ) 是使用那70%数据 来定义得到的,也就是仅仅是训练数据 。接下来,你要计算出测试误差,用Jtest(θ)来表示测试误差, 那么你要做的就是 取出你之前从训练集(Training set)中学习得到的参数θ放在这里, 来计算你的测试误差 Jtest(θ)
Jtest(θ)分为Linear Regreesion与Logistic Regression:
Linear Regreesion error:
Logistic Regression error:
Model Selection and Train/Validation/Test sets
假如你想要确定对于某组数据, 最合适的多项式次数是几次 ?怎样选用正确的特征来构造学习算法 或者假如你需要正确选择 学习算法中的正则化参数λ ,你应该怎样做呢?
Model Selection:
1.首先,建立d个model 假设(图中有10个,d表示其id),分别在training set 上求使其training error最小的θ向量,那么得到d个θ
2.然后,对这d个model假设,带入θ,在cross validation set上计算JCV,即cv set error最小的一个model 作为 hypothesis,如下图中|J(CV)|在第4组中最小,便取d=4的假设。
PS: 其实d表示dimension,也就是维度,表示该hypothesis的最大polynomial项是d维的。
PS’: 一般地,|J(CV)|是大于等于|J(train)|的,| * |表示数量
选择第一个模型(d=1), 然后求训练误差的最小值Jtrain(θ(1)) 这样你就会得到 一个参数向量θ(1) 然后你再选择第二个模型(d=2) 二次函数模型 ,进行同样的过程 这样你会得到另一个参数向量 θ(2),以此类推,直到第十个模型(d=10),十次函数模型,训练误差最小值Jtrain(θ(10))。
接下来,我们需要做的是对所有这些模型,求出测试集误差(Test Error),依次求出Jtest(θ(1))~Jtest(θ(10))中选取测试集误差最小的作为多项式模型。
这里选择的是五项式。那么问题来了,现在我想知道这个模型能不能很好地推广到新样本,我们还能通过测试集来验证一般性吗?这看起来似乎有点不合理,因为我们刚才是通过测试集跟假设拟合来得到多项式次数d这个参数,也就是说我们选择了一个能够最好地拟合测试集的参数d的值,因此,我们的参数向量θ(5)在拟合测试集时的结果,很可能导致一个比实际泛化误差更完美的预测结果,也就是说泛化能力不足!
所以,为了解决这个问题,在模型选择中,我们将数据集不仅仅是分为训练集,测试集,而是分为训练集,交叉验证集和测试集{60%,20%,20%}的比例
一种典型的分割比例是 将60%的数据分给训练集,大约20%的数据给交叉验证集 ,最后20%给测试集。这个比例可以稍微调整,但这种分法是最典型的。
按照上面所述的步骤,这里不再赘述! (详情在上面Model Selection下面有解释)
Bias vs. Variance
当你运行一个学习算法时 ,如果这个算法的表现不理想, 那么多半是出现 两种情况 :要么是偏差比较大, 要么是方差比较大, 换句话说, 出现的情况要么是欠拟合, 要么是过拟合问题 。
那么这两种情况, 哪个和偏差有关, 哪个和方差有关, 或者是不是和两个都有关 。搞清楚这一点非常重要 ,因为能判断出现的情况, 是这两种情况中的哪一种, 其实是一个很有效的指示器, 指引着可以改进算法的 ,最有效的方法和途径 。
1. bias指hypothesis与正确的hypothesis(如果有的话)的偏差.
2. varience是指各样本与hypothesis的偏差和
Diagnosing Bias vs. Variance
先来看一个总体概括:
高偏差(欠拟合) —-High bias(underfit)
平衡(正好)—Just right
高方差(过拟合)—-High variance(overfit)
从下图,横轴表示多项式的次数d,纵轴表示误差error,我们可以看出,当d很小时,也就是处于underfit状态时,Jtrain(θ)与JCV(θ)差不多大小,随着d增大,JCV(θ)远远大于 Jtrain(θ),也即是overfit状态(泛化能力不足)
这里就产生了bias和variance的概念:
bias:Jtrain(θ)大,JCV(θ)大,Jtrain(θ)≈JCV(θ),bias产生于d小,underfit阶段; |
variance:Jtrain(θ)小,JCV(θ)大,Jtrain(θ)<< JCV(θ),variance产生于d大,overfit阶段; |
假设你的学习算法表现的不尽如人意,没有达到你的期望,如何来判定它是一个偏差(bias)的问题还是方差(variance)的问题?我们可以计算他们的训练集误差和交叉验证集误差,如果它们落入了上图的“头部”区域,可以判断是偏差(欠拟合)问题,如果落入了“尾部”区域,可以判断是方差(过拟合)问题,如下图所示:
Regularization and Bias/Variance
算法正则化可以有效地防止过拟合 ,但正则化跟算法的偏差和方差 又有什么关系呢?
如何选择正则项参数λ?
对于数据集,我们仍将它划为3份:训练集,验证集,测试集。对于给定的正则化模型,例如上面的例子,我们按 λ 从小到大的顺序依次取数,然后在训练集上学习模型参数,在交叉验证集上计算验证集误差,并选择误差最小的模型, 也就是选择 ,最后再在测试集上评估假设:
偏差/方差可以作为正则化参数 λ 的函数,与上一小节相似,我们也可以画出这个函数图,这样我们就能评估 λ合适的选择范围了:
曲线的左端对应的是高方差问题 ,此时我们的 λ 值取得很小很小, 因此我们会对数据过度拟合, 所以由于过拟合的原因, 交叉验证集误差也会很大,当我们改变正则化参数 λ 的值时, 交叉验证集误差和训练集误差随之发生的变化, 当然 ,在中间取的某个 λ 的值 ,表现得刚好合适 ,这种情况下表现最好 ,交叉验证集误差或者测试集误差都很小
能使交叉验证集误差最小的那个点, 然后选出那个与之对应的参数 λ 的值。
Learning Curves
这节主要讲的是学习曲线的绘制,通过它来判断学习算法是否处于偏差方差问题或者两者都有。
考虑假设函数与样本m的关系:
以二次项多项式回归为例,如果仅有一个训练样本,那么模型很容易和样本点拟合,训练集误差近似为0,几乎可以忽略不计,而验证集误差可能会很大;如果有两个样本点,模型也很容易拟合样本点,训练集误差会略大一点,验证集误差可能会小一些;以此类推,当样本点比较多时,模型虽然不能拟合所有的样本点,但是泛化能力会更好一些,因此训练集误差会更大一点,而验证集误差会更小一些。
而当我的训练集越来越大的时候, 你不难发现 要保证使用二次函数 的拟合效果依然很好 就显得越来越困难了。因此 ,事实上随着训练集容量的增大, 我们不难发现 我们的平均训练误差 是逐渐增大的。 因此,如果你画出这条曲线 ,你就会发现 训练集误差 ,也就是对假设进行预测的误差平均值随着m的增大而增大。
以下通过学习曲线来考虑高偏差和高方差的问题。对于高偏差欠拟合问题:
不难发现,不管样本数量如何增加, 这条直线也基本不会变化太大, 因为这条直线是对这组数据最可能也是最接近的拟合,但一条直线再怎么接近 ,也不可能对这组数据进行很好的拟合。
而对于高方差过拟合问题:
增大样本数目后,模型的泛化能力会好一些,一些是高方差过拟合问题的学习曲线:
如果我们要考虑增大训练集的样本数,也就是在这幅图中向右延伸曲线,我们大致可以看出这两条学习曲线 ,蓝色和红色的两条曲线 正在相互靠近。 因此 ,如果我们将曲线 向右延伸出去 ,那么似乎训练集误差很可能会逐渐增大,而交叉验证集误差则会持续下降。 当然我们最关心的还是交叉验证集误差 或者测试集误差 。对吧 ,所以从这幅图中 ,我们基本可以预测如果继续增大训练样本的数量 ,将曲线向右延伸 交叉验证集误差将会 逐渐下降 。所以,在高方差的情形中,使用更多的训练集数据对改进算法的表现,事实上是有效果的 。
Deciding What to Do Next Revisited
- 获取更多的训练样本 - 解决高方差
- 尝试使用更少的特征的集合 - 解决高方差
- 尝试获得其他特征 - 解决高偏差
- 尝试添加多项组合特征 - 解决高偏差
- 尝试减小 λ -解决高偏差
- 尝试增加 λ-解决高方差
当你在进行神经网络拟合的时候, 如果你要进行神经网络的拟合 比如说 一个相对比较简单的神经网络模型 。相对来讲 ,它的隐藏单元比较少 ,甚至只有一个隐藏单元 。如果你要进行神经网络的拟合, 其中一个选择是 ,选用一个相对简单的网络结构 ,比如说只有一个 隐藏层 或者可能相对来讲, 比较少的隐藏单元。 因此像这样的一个简单的神经网络 ,参数就不会很多 ,很容易出现欠拟合 。
这种比较小型的神经网络 ,其最大优势在于计算量较小 。
与之相对的另一种情况 :是相对较大型的神经网络结构, 要么隐藏层单元比较多 比如这一层中的隐藏单元数就很多, 要么隐藏层比较多 。因此这种比较复杂的神经网络 ,参数一般较多, 也更容易出现过拟合 。这种结构的一大劣势, 也许不是主要的 但还是需要考虑: 那就是当网络中的 神经元数量很多的时候, 这种结构会显得 计算量较大 。
最后,你还需要选择 隐藏层的层数,你是应该用一个 隐藏层呢?还是应该用三个呢 ?就像我们这里画的,或者还是用两个隐藏层呢?
默认的情况是,使用一个隐藏层,但是如果你确实想要选择 多个隐藏层,你也可以试试 把数据分割为训练集、验证集 、和测试集。然后使用交叉验证的方法比较一个隐藏层的神经网络 ,然后试试两个 ,三个隐藏层 ,以此类推, 然后看看哪个神经网络在交叉验证集上表现得最理想。
参考:
Stanford机器学习—第六讲. 怎样选择机器学习方法、系统