评估假设函数
为了确保我们可以评估我们的假设函数,我们要做的是将这些数据进行分组,将所有数据按照7:3的比例划分,是一种常见的划分比例。
- 第一部分(70%)作为训练集(Training Set)
- 第二部分(30%)作为测试集(Test Set)
线性回归中:
- 使用70%的训练集数据进行学习,得到最小化训练误差J(θ)。
取出学习得到的参数θ,带入到Jtest(θ),计算测试误差:
这实际上是测试集平方误差的平均值。
分类问题中:
在分类问题中的测试误差 其实也被称作误分类率(也被称为0/1错分率),表示预测到的正确或错误样本的情况:
模型选择
假如你想要确定对于某组数据最合适的多项式次数是几次,怎样选用正确的特征来构造学习算法,这些问题我们称之为”模型选择问题“。
- 在模型选择中,通常将数据集分为三段:训练集、交叉验证集(cross validation set)、测试集。
- 一种典型的分割比例是:训练集60%,交叉验证集20%,测试集20%。
我们可以得到 训练集/交叉验证集/测试集 的误差:
模型选择问题,即使用交叉验证集来选择合适的模型:
- 通过使用训练集对每一个假设函数依次去求最小化的代价函数 ,并求得对应的参数向量 。
- 在交叉验证集中测试这些假设的表现,测出 来看看这些假设在交叉验证集中表现如何。
- 选择交叉验证集误差最小的那个假设模型。
- 使用测试集来评价模型的表现。
正则化参数λ对假设函数的影响
算法正则化可以有效地防止过拟合,通常的做法是选取一系列要尝试的λ值,可能从0.01,0.02,0.04开始,一直试下去,通常会将步长设为2倍的速度增长,直到一个比较大的值。
- 选用第一个模型,也就是 ,使用 来表示第一个参数向量
- 然后再取第二个模型 ,最小化代价方差,得到参数向量
- 以此类推,一直到最后一个 或 的模型对应的
- 用交叉验证集来评价这些假设参数,测出每一个参数 在交叉验证集上的评价误差平方和,然后选取这12个模型中交叉验证集误差最小的那个模型作为最终选择。
λ 在训练集上的变化
- 当λ的取值很小时,对训练集的拟合相对较好,因为没有使用正则化。
- 而如果λ的值很大时,将处于高偏差问题,不能对训练集很好地拟合,训练集误差 的值会趋于上升。
λ在交叉验证集上的变化
- 当λ的值取得很大时,会处于欠拟合问题。这对应着偏差问题,此时交叉验证集误差将会很大。
- 当λ值取得很小,会对数据过度拟合,交叉验证集误差也会很大。
- 这就是当改变正则化参数λ的值时,交叉验证集误差和训练集误差随之发生的变化。当然,在中间取的某个λ的值,表现得刚好合适,这种情况下表现最好,交叉验证集误差或者测试集误差都很小。
学习曲线(Learning Curves)
绘制学习曲线非常有用,可以判断某一个学习算法是否处于偏差方差问题,或者二者皆有。
高偏差下的学习曲线
假如你的假设处于高偏差问题,当样本数量增多的时候,你不难发现用来拟合这些数据的直线相较于之前不会变化太大。
所以,如果你绘制出交叉验证集误差,应该是这个样子:
- 最左边表示训练集样本容量很小,比如说只有一组样本,那么表现当然很不好;
- 当达到某一个容量值的时候,你就会找到那条最有可能拟合数据的那条直线,并且此时即便你继续增大训练集的样本容量m,你基本上还是会得到一条差不多的直线。因此交叉验证集误差将会很快变为水平而不再变化。
- 同样,训练误差一开始也是很小的,而在高偏差的情形中,你会发现训练集误差会逐渐增大,一直趋于接近交叉验证集误差,这是因为你的参数很少。但当m很大的时候,数据太多,此时训练集和交叉验证集的预测结果将会非常接近。
- 这就是当你的学习算法处于高偏差情形时学习曲线的大致走向。
- 高偏差的情形反映出的问题是交叉验证集和训练集误差都很大,也就是说,你最终会得到一个值比较大的 和 。
高方差下的学习曲线
- 处于高方差的时候,如果训练集样本容量很小时,训练集误差 将会很小。
- 随着训练集样本容量的增大, 的值会随之增大,因为当训练样本越来越多的时候,我们就越难将训练集数据拟合得很好,但总体来说,训练集误差还是很小。
- 在高方差的情形中,假设函数对数据过拟合,因此交叉验证集误差将会一直都很大。
- 所以算法处于高方差情形最明显的一个特点是在训练集误差和交叉验证集误差之间以一段很大的差距。
- 而这个曲线也反映出如果我们要考虑增大训练集的样本数,这两条学习曲线会逐渐靠近,高方差情形下使用更多的数量级对改进算法的表现事实上是有效果的。
优化总结
对于高方差问题:
- 使用更多的训练集数据。
- 尝试选用更少的特征集。
- 通过增大正则化参数λ
对于高偏差问题:
- 选用更多的特征集,一般是由于现有的假设函数太简单,需要增加一些别的特征来让假设函数更好地拟合训练集。
- 增加多项式特征。
- 通过减小正则化参数λ
误差分析(error analysis)
以一个你可以快速实现的简单的算法作为开始。实现它并且在交叉验证数据集上进行测试。
如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统,拥有那么多复杂的变量,而是构建一个简单的算法,这样你可以很快地实现它。
绘制出学习曲线来进而决定是否需要更多的数据,或者更多的特征,等等。
误差分析:主要检查出在你的算法下,有误差的(在交叉验证集中的)样本数据。
偏斜类(skewed classes)
- 正例和负例的比率非常接近于一个极端值,我们把这种情况叫做偏斜类。
- 当我们遇到这样一个偏斜类时,我们希望有一个不同的误差度量值,或者不同的评估度量值。其中一种评估度量值叫做查准率(precision)和召回率(recall)。
查准率(Precision)
例如,对于所有我们预测他们患有癌症的病人,有多大比率的病人是真正患有癌症的。
这个就叫做查准率,查准率越高就越好。
召回率(Recall)
例如,对于所有得了癌症的病人,我们正确预测他们得了癌症的比率有多大。
同样地,召回率越高越好。
通过变动临界值,你可以控制权衡查准率和召回率。
使用大数据集
- 在特征值x包含足够多的用来准确预测y的信息时,获取大量的数据是提高算法性能的好方法。