赞
踩
∗
∗
∗
点
击
查
看
:
吴
恩
达
机
器
学
习
—
—
整
套
笔
记
+
编
程
作
业
详
解
∗
∗
∗
\color{#f00}{***\ 点击查看\ :吴恩达机器学习 \ —— \ 整套笔记+编程作业详解\ ***}
∗∗∗ 点击查看 :吴恩达机器学习 —— 整套笔记+编程作业详解 ∗∗∗
注:本章没有枯燥的算法讲解,主要讲的是在机器学习实践过程中的一些应用建议。
前5周我们学习了线性回归,逻辑回归,神经网络来训练数据得到预测模型。但是如何评价预测模型的优劣,如何对预测模型进行误差分析以及如何改进,这是实际应用中所关注的。
本周,将要针对模型的评估,优化改进进行学习,旨在对模型进行进一步完善做出明确的指导。
以往的做法是:用训练集进行训练得到最终参数,并还是用训练集计算模型的准确率。
该做法的问题:易产生过拟合,将模型推广到新的数据集上效果并不好。
改进的做法:将数据集分为训练集和测试集,训练集用于训练得到最优参数,测试集用于评估模型准确率。
提出新问题:假如我们还未确定训练模型,需要在以下多项式模型中选择最优的模型进行训练,用哪部分数据进行训练得到最优模型呢?
进一步改进为:在数据集中再抽出一部分来作为交叉验证集用于上述模型选择。
我们可以把数据集分为三个部分:训练集(Training Set)、交叉验证集(Cross Validation Set)、测试集(Test Set)。这三者的分配比例可以是:60%,20%,20%。(注意:分配数据前需要将数据打乱)
这三部分的误差计算公式如下:
需要注意的是,当计算训练集、交叉验证集和测试集误差时,不计算正则项。
可以大致理解训练模型的步骤:
评价模型,一般评价其偏差和方差:
以多项式回归为例,训练集的误差
J
t
r
a
i
n
(
θ
)
J_{train}(θ)
Jtrain(θ) 以及交叉验证集的误差
J
c
v
(
θ
)
J_{cv}(θ)
Jcv(θ) 随多项式次数
d
d
d 的变化曲线如下图:
曲线左边 多项式的次数过小,欠拟合,导致无论在训练集还是交叉验证集上拟合效果都不好,即 高偏差。
曲线右边 多项式的次数太大,过拟合,虽然在训练集上拟合得很好,但在交叉验证集上的误差则很大,即 高方差。
同理,我们也可以得到正则化系数 λ \lambda λ 的大小与 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ)、 J c v ( θ ) J_{cv}(θ) Jcv(θ)的关系:
学习曲线是训练集的误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 与交叉验证集的误差 J c v ( θ ) J_{cv}(θ) Jcv(θ)关于训练集样本数量 m m m的函数图像。
- 对于训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) :当只有几个数据训练算法时(例如1、2、3),很容易就可以得到零误差,因为我们总能找到一条二次曲线与它们完美拟合。但是随着数据的增加,二次曲线的误差就会越大,经过一定的 m m m值以后,误差就会趋于稳定。
- 对于交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ):当训练集大小 m m m 很小时,拟合出的假设函数泛化到新样本的能力很差,交叉验证误差就很大,随着训练集不断增大,可能会拟合出更好的假设函数,泛化到新样本的能力增强,交叉验证误差会逐渐减小。
- 对于训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) :
- 当训练集 m m m 很小时,拟合出的直线对于每个样本的拟合效果不算差,因此训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 也较小;
- 随着训练集不断增大,直线对训练样本的拟合能力就差了很多,因此训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 续增大直到接近交叉验证误差;
- m m m 大到一定值之后,对于训练样本的拟合就没那么准确了,故训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 会持续增大直到接近交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ)。
- 对于交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ):
- 当训练集集 m m m 很小时,拟合出的直线泛化到新样本的能力很差,交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ) 很大;
- 随着训练集不断增大,训练出的直线更好的适应训练集,泛化到新样本的能力略有增强,交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ) 稍有减小
- m m m 大到一定值之后,训练出的还是一条差不多的直线,交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ) 将不再变化并接近水平。
- 当训练集大小 m m m很小时,因为存在过拟合,训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 会非常小,同时过拟合的存在使假设函数泛化到新样本的能力不足,交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ) 很大 ;
- 随着训练集不断增大,想要完美拟合所有训练数据变得没那么容易,训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 会稍微增大,但因为 hθ(x)hθ(x) 的阶次很高,仍然存在过拟合,总体来说 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 还是很小的。训练集增大让交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ) 有减小的趋势,但因为过拟合依然存在,故 J c v ( θ ) J_{cv}(θ) Jcv(θ) 只是稍微减小,仍然较大, J c v ( θ ) J_{cv}(θ) Jcv(θ) 与 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 间还是有很大差距。
总而言之,学习曲线能让我们发现是否存在高方差/高偏差问题,以及采取某些手段(如:增加训练样本数)是否有意义,避免我们在调试学习算法时浪费时间。
(Error Metrics for Skewed Classes)
以我们之前提到的肿瘤恶性与良性检测问题为例。患有癌症为 1,没有患癌症为 0。假如我们在测试集上进行测试,结果只有 1% 的误分类率,看起来结果好像不错,但如果测试集中真正患有癌症的病人只有 0.50%,这个结果就不太理想了。
这个例子中,正样本的数量远远大于负样本,这种情况我们称之为偏斜类(Skewed Class)。对于这种情况,原来的误分类率不能再作为算法好坏的度量标准。所以我们需要另一种的评估方法,叫做 查准率(Precision)和召回率(Recall)(或称 查全率)。
查准率和召回率越高,算法性能越好。
仍然以肿瘤良性与恶性为例。之前我们的预测结果如下:
如果我们希望在更确定的情况下再判断患者得了癌症,因为这是一个坏消息,误诊可能造成患者的恐慌。这样的话,我们可以把临界值 0.5 改为 0.7,这样就可以得到较高的查准率,但召回率相对会降低。
如果我们希望保证癌症患者及时得到医治,不放过任何一个可能病例,我们需要把临界值降低,比如改为 0.3。这样会得到较高的召回率,但查准率相对会降低。
那么我们可不可以自动选取临界值呢?
如下面几个算法(可能算法相同,临界值不同),我们如何判断哪个更好?
可能会有人想到求平均值
A
v
e
r
a
g
e
=
P
+
R
2
Average=\frac{P+R}{2}
Average=2P+R,看哪个更高。但显然这并不是一个很好的解决办法。因为按平均值来看,算法3是最高的,但这不是我们希望的。
一般来说,我们用 F 1 S c o r e = 2 P R P + R F_1Score=2\frac{PR}{P+R} F1Score=2P+RPR 值来评估(调和平均数):
参考:机器学习笔记week6
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。