一、防止陷入调试的不归路
在线性回归中,我们使用了如下的代价函数来评估预测误差:
然而现在你发现你的模型在测试集上的预测误差很大,一般会有如下的一些调整手段:
- 采集更多的数据集
- 降低特征维度
- 采集更多的特征
- 进行多项式回归
- 调整正则化参数
但是可以看出的是,这些手段有时候并不是很有用,而且你需要去尝试每种手段就会耗费很多的时间。
二、模型选择和数据集
在线性回归的章节中,我们已经知道,仅仅具备一个很小的训练误差并不能保证我们的预测函数就是优秀的,因为这种“优秀”仅仅体现在了对于已知的训练样本的假设上,而无法保证见到新的样本时候还能做出足够好的预测,过拟合就是当中的典型例子:
因此,预测准不准应当反映在对于新样本的泛化(generalize)能力。我们考虑将数据集划分为(随机划分):
- 训练集:70%
- 测试集:30%
- --------------------
- :训练样本数据
- :测试样本数据
因此在线性回归和逻辑回归中测试集的误差分别是:
由于逻辑回归处理的是分类任务,其预测结果只有正确和错误之分,所以引入误分率(Misclassification Error):
测试误差为:
在多项式回归中,我们总是尝试不同的多项式次数,形成了不同的预测模型:
我们计算各个模型的对应的测试误差,假设选择第五个模型时,测试误差最小,我们就选出了以下模型来迎接新的样本:
在线性回归中,我们通过训练集确定模型,测试集来评估模型的泛化能力。在多项式回归中,我们通过训练集获得了参数 θθ,而通过测试集确定了模型,那么,这两个集合用完了,我们就缺少评估模型泛化能力的数据集。鉴于此,引入了交叉验证集(Cross Validation Set),一般我们将数据集分为如下几个部分:
- 训练集:60%,确定参数
- 交叉验证集:20%,进行模型选择
- 测试集:20%,平均模型的预测能力
三者的误差函数如下:
三、偏差和方差
在机器学习中,偏差(bias)反映了模型无法描述数据规律,而方差(variance)反映了模型对训练集过度敏感,而丢失了数据规律,高偏差和高方差都会造成新数据到来时,模型给出错误的预测。
通过诊断(Diagnose)模型是出现了高偏差问题还是高方差问题,我们能对症下药,采取不同的解决策略。
在前面的章节中,我们知道,多项式回归中,如果多项式次数较高,则容易造成过拟合,此时训练误差很低,但是对于新数据的泛化能力较差,导致交叉验证集和测试集的误差都很高,此时模型出现了高方差:
而当次数较低时,又易出现欠拟合的状况,此时无论是训练集,交叉验证集,还是测试集,都会有很高的误差,此时模型出现了高偏差:
下图反映了训练集、交叉验证集误差随多项式次数 d 的变化规律:
我们知道正则化能帮我们解决过拟合问题,λ 取值越大,对参数 θ的惩罚力度就越大,能够帮助解决过拟合问题,但是,如果惩罚过重,也会造成欠拟合问题,即会出现高偏差。如果 λλ取值较小,则意味着没有惩罚 θ,也就不能解决过拟合问题,会出现高方差:
下图反映了正规化过程中,训练集、交叉验证集误差随 λλ变化的曲线:
另外,当训练样本的数目mm较小时,意味着可供学习的知识较少,则模型在训练阶段不容易犯错误(训练集误差极低),但也发现不了数据的规律(交叉验证集误差极高);而当样本数目增多时,意味着需要学习的知识增多,则模型虽然在训练阶段容易犯一些错(训练集误差开始增高),但也更容易探测出数据规律(交叉验证集误差降低):
如果模型出现了高偏差,即出现了欠拟合,学习曲线随样本数目的变化曲线如下图所示,即增加样本数目,仍无法显著降低交叉验证集误差,即无法提高模型的泛化能力:
如果模型出现了高方差,即出现了过拟合,学习曲线随着样本数目变化的曲线如下图所示,即增加样本数目,可以显著降低交叉验证集的误差,提高模型的泛化能力:
因此,通过诊断模型是出现了高偏差还是高方差问题,我们对于上面第一节中提到算法优化手段有了各自的使用场景:
手段 | 使用场景 |
---|---|
采集更多的样本 | 高方差 |
降低特征维度 | 高方差 |
采集更多的特征 | 高偏差 |
进行高次多项式回归 | 高偏差 |
降低参数 λ | 高方差 |
增大参数 λ | 高偏差 |
四、偏斜类(Skewed Classes)的误差度量
假定我们通过逻辑回归来预测病人是否患有癌症,(y=1 表示有癌症,y=0表示没有癌症)。并且,令人欣喜的是,测试集的错误率只有 1%。但是,假如我们的测试样本中只有 0.5% 患有癌症,那么我们何不直接让预测函数为h=0?
即,我们永远预测病人不患病,那么准确率会高达 95%。但这可不是一件好事儿,我们追求高准确率牺牲的是病人的利益。引起这个问题的原因是样本中出现了偏斜类(Skewed Classes),偏斜即倾斜,大量样本倾斜向了某一类型。
从上面的例子我们知道,单纯地使用误差(Error)并不能完善地评价模型好坏,现在引入两个重要的评价指标:(1)查准率(Precision);(2)召回率(Recall),并定义:
- 阳性(Positive):表示正样本。当预测和实际都为正样本时,表示真阳性(True Positive);如果预测为正样本,而实际为负样本,则表示假阳性(False Positive)。
- 阴性(Negative):表示负样本。当预测和实际都为负样本时,表示真阴性(True Negative);如果预测为负样本,而实际为正样本,则表示假阴性(False Negative)
真值1 | 真值0 | |
---|---|---|
预测1 | True Positive | False Positive |
预测0 | False Negative | True Negative |
查准率(Precision):
召回率(Recall):
在上例中,查准率就描述了:在我们预测患癌的病人中,确实患了癌症的病人的比例。
在上例中,召回率就描述了:在患癌的病人中,有多少病人被我们预测到了。
理想状况下,我们希望假设函数能够同时具备高准确率(High Precision)及高召回率(High Recall)。但是往往鱼和熊掌不可兼得。回到预测病人患癌的例子中,假定我们的预测函数为:
即,我们设定的预测阈值为 0.5。这么做似乎风险不小,很多没有患癌的病人被我们认为患有癌症而接受了不必要的治疗,因此,我们调高我们的阈值为 0.7:
此时,必须有较高的把握,我们才会预测一个患有癌症,避免非癌症患者接受到了不必要的治疗,假阳性样本少,此时我们也获得了高查准率。然而,这么预测的代价是,有些癌症病患体征不明显,就被我们认为没有患癌,从而得不到治疗,假阴性样本多,即我们的召回率偏低。
当我们尝试构建了不同的算法模型,并且获得了不同的查准率和召回率:
Precision | Recall | |
---|---|---|
算法 1 | 0.5 | 0.4 |
算法 2 | 0.7 | 0.1 |
算法 3 | 0.02 | 1.0 |
那么选择哪个算法是最好的呢,这个时候引入了F1Score:
从公式中也可以看到,分子是查准率和召回率的乘积,只有二者都较高时,F1ScoreF1Score 才会较高,特别地:
Precision | Recall | F1ScoreF1Score | |
---|---|---|---|
算法 1 | 0.5 | 0.4 | 0.444 |
算法 2 | 0.7 | 0.1 | 0.175 |
算法 3 | 0.02 | 1.0 | 0.0392 |
F1Score帮我们选出了算法1,事实也确实如此,算法1的查准率和召回率都较高。