吴恩达机器学习笔记(9)—机器学习应用的建议和系统的设计

如何在实际情形中高效地使用机器学习模型?如何调参优化一个现有的模型?什么时候才需要获取更大的数据集?什么时候需要寻找更多的特征?什么时候需要改变正则化程度?

本节将介绍常用的机器学习诊断法,高效地评估某种算法,并指导如何改进这个模型。

一、数据集划分

在以往的实验中,我们把所有数据集拿来训练一个模型,同时为了评估假设函数,我们还会用它进行测试。这显然不是一个好的做法,因为即便准确率很高,那也可能存在过拟合现象。

正确的做法应该是将数据集划分为训练集和独立的测试集,通常划分比例为 7 : 3 7:3 7:3 。在训练集上收敛后,再到测试集进行测试,最终的准确率作为模型的准确率。这样做才能确保模型在不同数据上的泛化能力

进一步,如果模型中含有超参数,例如正则化的参数 λ \lambda λ 或神经网络的层数 L L L ,这是需要我们人工设置的。通常我们会设置多组参数对照,分别在训练集中训练到收敛,再在测试集中测试并选取最好的结果,也称交叉验证。于是又产生了同样的问题:测试集上的准确率不能代表模型的准确率。即:对测试集最优的超参数不一定对其他数据具有相同的泛化能力

为此我们继续引入验证集,即用验证集而非测试集去调参,最后在测试集上跑结果。通常划分比例为 6 : 2 : 2 6:2:2 6:2:2 ,测试集自始至终不参与模型的建立。这与常见的数据挖掘比赛的赛制异曲同工,只不过赛中测试集固定,只有验证集需要手动划分。

值得一提的是,如果我们在训练过程中加入了正则项,那么在计算模型的代价函数(误差)的时候应该去掉正则项。这是因为加入正则项的目的是训练出一个更为合理的参数 θ \theta θ ,而为了评价这个参数 θ \theta θ 的好坏,原本的代价函数才是真正的代价。

举个例子,假设我们要拟合一个复杂的数据集,用多项式 y = θ 0 + θ 1 x + θ 2 x 2 + ⋯ + θ n x n y = \theta_0 + \theta_1 x + \theta_2 x^2 + \dots + \theta_n x^n y=θ0+θ1x+θ2x2++θnxn 来建模。如果多项式次数 n n n 很高,模型容易过拟合

为了防止过拟合,我们在 训练阶段 给代价函数加入正则项(比如 L2 正则,形式为 λ ∑ i = 1 n θ i 2 \lambda \sum_{i=1}^n \theta_i^2 λi=1nθi2 λ \lambda λ是正则化参数)。此时训练的代价函数是:
J train ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ i = 1 n θ i 2 J_{\text{train}}(\theta) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda \sum_{i=1}^n \theta_i^2 Jtrain(θ)=2m1i=1m(hθ(x(i))y(i))2+λi=1nθi2
这里加入正则项是为了约束参数 θ \theta θ 不要过大,让模型更“合理”,避免过拟合。
现在要从 λ = 0 , 1 , 2 , … , 9 \lambda = 0,1,2,\dots,9 λ=0,1,2,,9 中选最好的。这需要:

  • 用训练集训练出 10 个不同的模型(每个 λ \lambda λ 对应一个模型)。
  • 用验证集来评估每个模型的好坏。

此时,评估模型的“代价函数”不能包含正则项。因为正则项是“训练时为了约束参数”的工具,而我们要评价的是:模型本身对数据的拟合误差(即不考虑正则约束时,模型在验证集上的误差)。

比如,假设验证集有数据 ( x val , y val ) (x_{\text{val}}, y_{\text{val}}) (xval,yval),则评估代价为:
J valid ( θ ) = 1 2 m valid ∑ i = 1 m valid ( h θ ( x valid ( i ) ) − y valid ( i ) ) 2 J_{\text{valid}}(\theta) = \frac{1}{2m_{\text{valid}}} \sum_{i=1}^{m_{\text{valid}}} (h_\theta(x_{\text{valid}}^{(i)}) - y_{\text{valid}}^{(i)})^2 Jvalid(θ)=2mvalid1i=1mvalid(hθ(xvalid(i))yvalid(i))2

二、高偏差与高方差

在前文 ML学习笔记 #5 过拟合与正则化 中,我们提到欠拟合对应的模型是高偏差,而过拟合对应的模型是高方差

以多项式回归为例,随着多项式系数的增加,我们从欠拟合逐渐过渡到过拟合,训练集上的代价函数 J train ( θ ) J_{\text{train}}(\theta) Jtrain(θ) 逐渐减小,而验证集上的代价函数 J valid ( θ ) J_{\text{valid}}(\theta) Jvalid(θ) 先减小后增大,形成下图所示情况:
在这里插入图片描述

训练集和验证集上的代价函数变化趋势

观察发现:当 J valid ( θ ) ≈ J train ( θ ) J_{\text{valid}}(\theta) \approx J_{\text{train}}(\theta) Jvalid(θ)Jtrain(θ) 时,模型处于欠拟合(高偏差);当 J valid ( θ ) ≫ J train ( θ ) J_{\text{valid}}(\theta) \gg J_{\text{train}}(\theta) Jvalid(θ)Jtrain(θ) 时,模型处于过拟合(高方差)。实际中我们也可以通过计算误差来分析模型。

三、学习曲线

此外,作出学习曲线也有利于帮助我们分析模型拟合情况。学习曲线是误差函数关于「训练集规模」的曲线。

如果我们尝试用一条直线来拟合曲线数据,显然,此时模型欠拟合,无论训练集有多么大误差都不会有太大改观:
在这里插入图片描述

高偏差的学习曲线

当训练集规模很小时, J train ( θ ) J_{\text{train}}(\theta) Jtrain(θ) 比较小,而 J valid ( θ ) J_{\text{valid}}(\theta) Jvalid(θ) 很大;随着训练集规模的增大, J train ( θ ) J_{\text{train}}(\theta) Jtrain(θ) 迅速增大, J valid ( θ ) J_{\text{valid}}(\theta) Jvalid(θ) 减小,但是减小的幅度不大;最后,当训练集规模很大时,二者基本相当且都比较大

而如果我们使用一个非常高次的多项式模型,并且正则化非常小,显然,此时模型过拟合。可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果
在这里插入图片描述

高方差的学习曲线

当训练集规模很小时, J train ( θ ) J_{\text{train}}(\theta) Jtrain(θ) 很小,而 J valid ( θ ) J_{\text{valid}}(\theta) Jvalid(θ) 很大;随着训练集规模的增大, J train ( θ ) J_{\text{train}}(\theta) Jtrain(θ) 增大,但是增大的幅度不大,而 J valid ( θ ) J_{\text{valid}}(\theta) Jvalid(θ) 减小,但是减小的幅度也不大;最后,当训练集规模很大时, J train ( θ ) J_{\text{train}}(\theta) Jtrain(θ) 较小,但 J valid ( θ ) J_{\text{valid}}(\theta) Jvalid(θ) 较大。

学习曲线还可以用于判断一个模型的潜能。如果一个模型随着数据量增大,效果成指数形式上升,则说明增大数据量可能会达到更好的效果。但如果成对数形式上升,则说明不具有数据潜力。

四、神经网络的方差和偏差

在文章的开头,我们提出了一个问题:什么时候需要寻找更多的特征?显然现在我们已经知道答案:当模型过拟合时,很可能是因为特征及参数过多导致模型将训练集完全拟合,因此可以尝试减少特征的数量;同理,当模型欠拟合时,可能是现有的特征太简单、不足以刻画训练集,因此最好尝试获得更多的特征。

此外,使用神经网络也可以免于复杂的特征工程,只需将原始特征作为输入层,通过网络自动适应即可。但是难道越复杂的神经网络就越好吗?神经网络也会出现过拟合。

对于一个较小的神经网络,可以类比为参数较少的情况,容易导致高偏差和欠拟合;而对于较大的神经网络,类比于参数较多的情况,容易导致高方差和过拟合。虽然后者计算代价比较大,但是可以通过正则化手段来减少其过拟合程度,并且通常会取得比前者更好的效果。

例如神经网络中的隐藏层的层数的选择、各层的宽度设置,通常从一层、较窄的网络开始,逐渐增加层数和宽度,并将数据集划分为训练集、验证集和测试集,针对不同规模的网络进行验证,选择验证集代价最小的模型作为最终模型。

五、误差分析

除了通过观察学习曲线判断拟合情况,还可以人工检查验证集预测出错的样本,分析这些错误样本是否存在某种系统化的趋势。例如,某个类别总是被预测错误、某些样本预测误差最大等,从而思考怎么改进分类器。通过加入不同特征、尝试不同模型、设计不同网络结构来针对性训练。

因此,快速开发出一个不完美但可用的模型是很有必要的,它可以指导你的下一步该怎么走,比起花费大量时间思考显然高效很多。当然,如果能有一个数值化的评价指标,那实验的进度也能大大加快。

六、类偏斜的误差度量

过去我们常用预测的准确率错误率来评价一个分类模型,既适用于二分类任务,也适用于多分类任务。然而,准确率却无法满足所有的分类需求,例如以下情形:

  • 癌症患者识别任务,患者为正例,正常人为负例。显然患者的比例远小于正常人的比例,例如 1 % 1\% 1% ,如果我们将所有样例都识别为正常人,那么该模型的准确率将高达 99 % 99\% 99%,但显然这不是我们想要的结果。
  • 垃圾邮件识别任务,垃圾邮件为正例,正常邮件为负例。与患者识别类似,垃圾邮件的比例较低,而人们却更关心有多少垃圾邮件被识别了出来,而不是准确率。

这些任务的特点是类别分布极不均衡,即存在类偏斜问题,在多分类任务中也被称为长尾分布问题。下面我们探讨更一般化的情形:

真实标签 → 预测标签 ↓正例(Positive)负例(Negative)
正例(Positive)TP(真正例)FN(假负例)
负例(Negative)FP(假正例)TN(真负例)

定义精确率(Precision)也称查准率、精度,从预测结果角度出发,所有预测为正例 P P P 的样本中,实际正例的占比:
Precision ≜ T P T P + F P \text{Precision} \triangleq \frac{TP}{TP + FP} PrecisionTP+FPTP

定义召回率(Recall)也称查全率,从实际结果角度出发,所有实际为正例 P P P 的样本中,被预测为正例的占比:
Recall ≜ T P T P + F N \text{Recall} \triangleq \frac{TP}{TP + FN} RecallTP+FNTP

此外还可以得到与精确率相对的误报率(Fallout),与召回率相对的漏识率(Miss)。

七、精确率和召回率的权衡

精确率和召回率通常是一对矛盾、此消彼长的性能度量指标。一般来说,精确率越高时,召回率往往越低,反之亦然。还是以癌症患者识别任务为例,假设我们的算法会输出一个 [ 0 , 1 ] [0, 1] [0,1] 的概率值,默认以 0.5 0.5 0.5 作为阈值。

如果将一个正常人诊断为癌症患者,则会使其承担不必要的治疗。因此我们可以在保持模型不变的情况下提高阈值,如 0.7 0.7 0.7 0.9 0.9 0.9,进而提高精确率——即只在非常有把握的情况下诊断为癌症。然而,如果漏识了一个潜在的癌症患者,带来的灾难可能是更巨大的。因此我们也可以降低阈值,进而提高召回率——即让所有潜在病人都得到进一步地检查。

为此,我们定义了一个统一的指标来衡量模型的召回率与精确率,即:
F -score = ( 1 + β 2 ) Precision ⋅ Recall β 2 ⋅ Precision + Recall F\text{-score} = (1 + \beta^2) \frac{\text{Precision} \cdot \text{Recall}}{\beta^2 \cdot \text{Precision} + \text{Recall}} F-score=(1+β2)β2Precision+RecallPrecisionRecall

其中 β \beta β 越大表示越强调精确率,反之则强调召回率。当 β = 1 \beta = 1 β=1 时,得到我们最常用的 F 1 F1 F1 值:
F1-score = 2 ⋅ Precision ⋅ Recall Precision + Recall \text{F1-score} = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} F1-score=2Precision+RecallPrecisionRecall

对于一个模型来说,如果想要在精确率和召回率之间取得一个较好的平衡,最大化 F 1 F1 F1 值是一个有效的方法。

如果我们有多个模型,如何利用精确率和召回率评估模型之间的优劣呢?通过固定模型后调整阈值大小,我们可以得到一系列精确率和召回率并绘制成一条曲线,而这条曲线就被称为 PR-曲线( Precision-Recall Curve)。
在这里插入图片描述

PR-曲线

在 PR Curve 的基础上,可以曲线下面积(Area Under the Curve, AUC)来得到一个模型整体的评估值,从上图中可以看出,高 AUC 值也就意味着高精确率和高召回率,也就意味着模型的效果越好。

八、多分类的精度和召回率

吴恩达机器学习笔记(5)—逻辑回归(附代码) 中,我们介绍到对于 N N N 分类问题,可以将其转化为
N N N 个二分类问题,并将每个类别单独视为「正例」,其他类型视为「该类别的负例」。

此时的混淆矩阵可以这样统计:

/实际为类 1实际为类 2实际为类 3
预测为类 14352
预测为类 22453
预测为类 30149

此时类 1 的精确率 Precision = 43 43 + 5 + 2 = 0.86 \text{Precision} = \frac{43}{43 + 5 + 2} = 0.86 Precision=43+5+243=0.86,召回率 Recall = 43 43 + 2 + 0 = 0.955556 \text{Recall} = \frac{43}{43 + 2 + 0} = 0.955556 Recall=43+2+043=0.955556

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值