误差与验证
误差与验证
模型误差
Cross-Validation: 交叉验证
右边是十种不同的训练集和测试集划分方法得到的 test MSE,可以看到,在不同的划分方法下,test MSE 的变动是很大的,而且对应的最优 degree 也不一样。所以如果我们的训练集和测试集的划分方法不够好,很有可能无法选择到最好的模型与参数。
LOOCV
LOOCV(Leave-one-out cross-validation) 像 Test set approach 一样,LOOCV 方法也包含将数据集分为训练集和测试集这一步骤。但是不同的是,我们现在只用一个数据作为测试集,其他的数据都作为训练集,并将此步骤重复 N 次(N 为数据集的数据数量)。
如上图所示,假设我们现在有 n 个数据组成的数据集,那么 LOOCV 的方法就是每次取出一个数据作为测试集的唯一元素,而其他 n-1 个数据都作为训练集用于训练模型和调参。结果就是我们最终训练了 n 个模型,每次都能得到一个 MSE。而计算最终 test MSE 则就是将这 n 个 MSE 取平均。
比起 test set approach,LOOCV 有很多优点。首先它不受测试集合训练集划分方法的影响,因为每一个数据都单独的做过测试集。同时,其用了 n-1 个数据训练模型,也几乎用到了所有的数据,保证了模型的 bias 更小。不过 LOOCV 的缺点也很明显,那就是计算量过于大,是 test set approach 耗时的 n-1 倍。
为了解决计算成本太大的弊端,又有人提供了下面的式子,使得 LOOCV 计算成本和只训练一个模型一样快。
其中 表示第 i 个拟合值,而 则表示 leverage。关于 的计算方法详见线性回归的部分(以后会涉及)。
K-fold Cross Validation
另外一种折中的办法叫做 K 折交叉验证,和 LOOCV 的不同在于,我们每次的测试集将不再只包含一个数据,而是多个,具体数目将根据 K 的选取决定。比如,如果 K=5,那么我们利用五折交叉验证的步骤就是:
-
将所有数据集分成 5 份
-
不重复地每次取其中一份做测试集,用其他四份做训练集训练模型,之后计算该模型在测试集上的
-
将 5 次的 取平均得到最后的 MSE
不难理解,其实 LOOCV 是一种特殊的 K-fold Cross Validation(K=N )。再来看一组图:
每一幅图种蓝色表示的真实的 test MSE,而黑色虚线和橙线则分贝表示的是 LOOCV 方法和 10-fold CV 方法得到的 test MSE。我们可以看到事实上 LOOCV 和 10-fold CV 对 test MSE 的估计是很相似的,但是相比 LOOCV,10-fold CV 的计算成本却小了很多,耗时更少。
最后,我们要说说 K 的选取。事实上,和开头给出的文章里的部分内容一样,K 的选取是一个 Bias 和 Variance 的 trade-off。
K 越大,每次投入的训练集的数据越多,模型的 Bias 越小。但是 K 越大,又意味着每一次选取的训练集之前的相关性越大(考虑最极端的例子,当 k=N,也就是在 LOOCV 里,每次都训练数据几乎是一样的)。而这种大相关性会导致最终的 test error 具有更大的 Variance。
一般来说,根据经验我们一般选择 k=5 或 10。
混淆矩阵
监督学习的主要任务就是用模型实现精准的预测。我们希望自己的机器学习模型在新数据(未被标注过的)上取得尽可能高的准确率。换句话说,也就是我们希望用 训练数据训练得到的模型能适用于待测试的新数据。正是这样,当实际开发中训练得到一个新模型时,我们才有把握用它预测出高质量的结果。现在,假设我们要使用一个简单的非参数回归模型来构建耕地农药使用率和谷物亩产量的模型。最简单的机器学习回归模型之一就是内核平滑技术。内核平滑即计算 局部平均:对于每一个新的数据来说,用与其特征值接近的训练数据点求平均值来对其目标变量建模。唯一一个参数:宽参数,是用来控制局部平均的窗口大小。内核平滑窗宽参数取值不同所产生的效果。窗宽值较大时,几乎是用所有训练数据的平均值来预测测试集里每个数据点的目标值。这导致模型很平坦,对训练数据分布的明显趋势欠拟合(under-fit )了。同样,窗宽值过小时,每次预测只用到了待测数据点周围一两个训练数据。因此,模型把训练数据点的起伏波动完完全全地反映出来。这种疑似拟合噪音数据而非真实信号的现象被称为过拟合(over-fitting )。我们的理想情况是处于一个平衡状态:既不欠拟合,也不过拟合。 由此可见,我们机器学习模型评估的目标就是希望能够判断分析机器学习模型对预测新数据时候的泛化能力,上述场景中就是指判断分析机器学习模型对预测其它农场的谷物产量的泛化能力。对于回归问题,标准的评估方法是均方误差(MSE ),即目标变量的真实值与模型预测值的误差平方的平均值。
交叉验证
模型评估中一个难解之处在于模型在训练集数据上的误差不能反映其在新数据集上的误差情况。为了更好地估计模型在新数据集上的错误率,我们必须使用更复杂的方法,称作交叉验证(cross validation ),它严格地使用训练集数据来评价模型在新数据集上的准确率。
Holdout 方法
同一份训练数据既用于数据拟合又用于准确率评估,会导致过度乐观。最容易的规避方法是分别准备训练和测试的两个子数据集,训练子集仅用于拟合模型,测试子集仅用于评估模型的准确率。这个方法被称作是 holdout 方法,因为随机地选择一部分训练数据仅用于训练过程。通常保留 30% 的数据作为测试数据。 伪代码如下所示:
K-Fold 交叉验证
如同 Holdout 方法,K-fold 交叉验证也依赖于训练数据的若干个相互独立子集。主要的区别在于 K-fold 交叉验证一开始就随机把数据分割成 K 个 不相连的子集,成为 folds(一般称作 K 折交叉验证,K 的取值有 5、10 或者 20)。每次留一份数据作为测试集,其余数据用于训练模型。