机器学习之模型评估与优化
一、引言 对于一个训练好的模型,我们需要知道它是否能很好地适应现实应用。也就是说,我们希望得知该模型对于训练样本之外的数据,是否也能有较好的预测效果。 模型的这种能力称为泛化能力 这一问题本质上还是我们之前讨论过的拟合问题。只不过对于一个较为复杂的模型来说,常常不能将其拟合或分类的结果用图像直观表示。如果我们不能较为清晰地评估模型,那就无法进一步进行优化调整(如调整正则化系数、增加或减少特征、增加样本数量等)。因此我们需要方法,来一般化地评估模型的质量。 二、泛化能力的衡量指标 正如前一节所说,泛化能力的衡量就是衡量模型对训练样本集之外的数据集的预测效果。我们知道衡量模型对训练样本预测效果的指标是损失函数,那么对于其他数据,我们同样可以把损失函数的概念迁移到这里来。 我们可以将已经获得的数据划分为两部分,一部分用于训练模型,称为训练集;另一部分用于测试模型的泛化能力,称为测试集。对于用训练集训练后的数据,我们再求该模型对测试集数据的损失函数。 举个例子,如果我们采用简单的平方误差损失函数,则我们就是要求 $$ J_{test}(\vec{w},b) = \frac{1}{2m_{test}}\sum_{i=0}^{m_{test}-1} ( f_{\vec{w},b}(\vec{x}^{(i)}_{test}) - y^{(i)}_{test} )^2 $$ $J_{test}(\vec{w},b)$ 就是我们对该模型泛化能力的衡量指标,称为测试误差。 我们可以将该指标与训练集的损失函数值 $J_{train}(\vec{w},b)$(注意这里没有正则项,称为训练误差)进行比较。一般的情况是 $J_{test}(\vec{w},b)$ 大于 $J_{train}(\vec{w},b)$。 我们还可以将该模型的泛化能力与其他模型的泛化能力,或者与人类的误差进行比较。这样我们就可以评价我们所训练的模型的优劣了。 三、交叉验证集 在我们继续评估模型之前,我们要先来考虑一些我们究竟要如何进行优化。你可能会想,我们既然有了评价模型泛化能力的指标 $J_{test}$,那么只要试图让该指标减小不就可以了吗?这是一个很直接的想法。 但问题是,如果我们向着使 $J_{test}$ 减小的目标优化,那么测试集与训练集有什么区别呢?按照这种方法,测试集就相当于变成了训练集的一部分,而不再能成为衡量训练集之外泛化能力的样本了。 因此,我们不能将训练集作为优化的方向,而只能将其作为评价的指标。我们需要再分出一部分数据,作为优化时的参考。这就是交叉验证(Cross-validation)集。对应的衡量指标为 $J_{cv}$ 四、模型评价 我们用偏差和方差来评价一个模型。 偏差表示模型对训练集的预测相对于真实情况的误差,如果模型对训练样本都不能很好地拟合或分类,就称其为高偏差的。 $J_{train}$ 可衡量模型的偏差。 方差表示模型对测试集的预测相对于真实情况的误差(也就是泛化能力本身),如果模型不能很好地预测测试集中数据,就称其为高方差的。$J_{cv}$ 可衡量模型的方差。 一般来说,模型的方差会大于偏差。因此高偏差的模型都是高方差的。 随着模型复杂度的提升,模型的偏差会逐渐降低,但偏差会先降低再升高;随着训练样本量的提升,偏差会逐渐减小,方差会逐渐升高,直到最后方差和偏差程度接近。 五、倾斜数据集的误差指标 对于正面例子和负面例子比例差距较大的训练样本(也就是说,被标记为某一结果的样本数量占样本总数的比例很大或很小),根据全概率分布可知,可能就算全部预测同一结果,其正确的概率也很大。因此我们需要能消除样本本身概率分布导致的正确率偏差的指标。 有两种误差指标用于评价这种情况。分别为准确率(Precision)和召回率(Recall)。 准确率衡量的是,模型预测为某一结果的情况中,有多少是预测正确的。 召回率衡量的是,对所有真正为某一结果的情况,有多少是模型预测到的。 也就是说,设 TP表示将正类预测为正类的数量 FN表示将正类预测为负类的数量 FP表示将负类预测为正类的数量 TN表示将负类预测为负类的数量 则准确率为 $$ P = \frac{TP}{TP + FP} $$ 召回率为 $$ R = \frac{TP}{TP + FN} $$ 可以这样理解,把预测的过程当做选择的过程,准确率高就是“不重”,不过多的选择,以致把许多不属于的也包括在内;召回率高就是“不漏”,不过少地选择,把一些属于的漏掉了。...