机器学习笔记(七)
- 1️⃣评估模型
- 🎗️使用测试集评估模型
- 🎗️交叉验证集(cross validation)
- 2️⃣偏差和方差(Bias / Variance)
- 3️⃣学习曲线(Learning curves)
- 🎗️High bias
- 🎗️High variance
- 4️⃣数据增强(Data augmentation)
- 5️⃣迁移学习(Transfer learning)
- 6️⃣评估指标
- 🎗️精度(Accuracy)
- 🎗️精确率(Precision)
- 🎗️召回率(Recall)
- 🎗️F 值(Fmeasure)
1️⃣评估模型
🎗️使用测试集评估模型
🎈使用数据集训练模型时,可能会导致过拟合现象,模型很好的拟合了训练数据,但是无法泛化到新的数据样例中。
🤓 为了更好的评估模型,可以将数据集中的70%划分为训练集,30%划分为测试集。比较一下在训练集训练出来的模型在测试集的表现如何,大概可以评估模型好坏。
✨计算测试集和训练集中的代价 J t e s t J_{test} Jtest 和 J t r a i n J_{train} Jtrain,两者的数值差距可以反映一些模型的问题。
🎈对于过拟合的情况, 通过对比 J t e s t J_{test} Jtest 和 J t r a i n J_{train} Jtrain 可以看出这不是一个好模型,这就达到了评估模型的目的。
🎗️交叉验证集(cross validation)
🎈我们可以通过训练集和测试集去选择一个相对较好的模型,对于一个多项式模型,可以通过训练集训练出 d d d 阶的模型( d : d: d: 1~10),我们想知道哪个模型的泛化程度最好,这时候可以拿测试集去评估,计算 J t e s t J_{test} Jtest ,而 J t e s t J_{test} Jtest 最小的 d d d 阶模型的就是最好的模型,泛化程度最好。但是,相当于是使用测试集去选择了 d d d,可以看作测试集“变相”参与了最终模型的训练,其实它的泛化误差是一个乐观的估计,它比实际上的泛化误差要小。
✨要更好的评估模型的话,我们需要用一个完全和模型无关的测试集去评估,那么谁去选出这个 d d d 呢?这时需要我们去多划分一个交叉验证集。
🤓这样可以通过训练集训练出多个模型的参数,交叉验证集选择出性能最好模型,最后用测试集评估模型。由于测试集完全没有参与到最终模型的选择中,这时的测试集对模型的泛化程度的评估是公平的而不是乐观的,这种方法是模型选择的一种最佳实践。
✨同样,可以将该最佳实践应用到神经网络架构的选择中,通过训练集拟合参数 w w w, b b b,再通过交叉验证集选择性能最好的模型(即 J c v J_{cv} Jcv 最小的模型),最后使用测试集的 J t e s t J_{test} Jtest 去评估模型的泛化程度。
2️⃣偏差和方差(Bias / Variance)
🎈对于单个特征时,我们可以通过图表直接看出模型是欠拟合还是过拟合,左图中的模型为欠拟合,通常欠拟合也成为高偏差;右图中的模型为过拟合,通常过拟合成为高方差。而对于多个特征时,不好用图像之间展示,我们可以直接考察模型的偏差和方差来诊断模型的好坏。
✨对于欠拟合的模型,它有 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 的性质,因为它非常好的拟合了训练数据,但泛化性相当差;而一个好的模型, 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。
🤓可以看到随着模型多项式次数的变化, 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 和 J t r a i n J_{train} Jtrain 的差值大小。(注意:通常总是 J c v J_{cv} Jcv > J t r a i n J_{train} Jtrain)
同时具有高偏差和高方差的情况:
🎈正则化参数对偏差和方差的影响:
3️⃣学习曲线(Learning curves)
🎗️High bias
✨对于高偏差(欠拟合)的情况,一开始数据量很小甚至只有 1 个时, 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 会越来越小,但是数据量上来了,模型拟合训练数据就不想拟合1、2个点那么准确,所以 J t r a i n J_{train} Jtrain 越来越大。最终达到一个稳定状态(欠拟合),高 J t r a i n J_{train} Jtrain 且 J t r a i n ≈ J c v J_{train} ≈ J_{cv} Jtrain≈Jcv,此后再怎么添加数据和基准水平的差距都难以缩小,所以添加数据量将不能帮助解决高偏差问题。
🎗️High variance
✨对于高方差(过拟合)的情况,在低数据量时出现过拟合, J c v J_{cv} Jcv >> J t r a i n J_{train} Jtrain 且 J t r a i n J_{train} Jtrain 很低。增加数据量后可以很好的解决高方差问题,让模型达到基准水平。
4️⃣数据增强(Data augmentation)
🎈增加数据量经常可以帮助我们得到更好的模型,但是提供的数据量可能就那么多,无法得到更多的数据量或者可能得到更多数据量需要很多资金成本,而数据增强方法可以在现有的数据样例上创建新的数据。
✨对图像数据通过放大、缩小、旋转不同角度、改变对比度、镜像、网格随机扭曲等方法创造更多新的图像数据;对音频数据通过剪辑增加不同噪声等方式,创造更多新的音频数据。这些新数据也非常具有挑战性,可以让模型有更强的泛化程度。
5️⃣迁移学习(Transfer learning)
🎈Transfer learning: using data from a different task.
✨使用其他任务已经训练好的模型作为自己的预训练模型,这就是迁移学习。例如,我们要训练一个数字识别的模型,但是我们可以使用别人训练好的大型动物识别模型作为我们的预训练模型,只需将最后一层输出层替换,训练出输出层的参数,就成为了一个数字识别模型。① 可以选择只训练输出层的参数。② 可以重新训练整个模型的参数,导入的模型参数作为初始化参数,这样也比随机初始化参数的梯度下降更快。(小型模型倾向于选择 ①,大型模型倾向于选择 ②)
🧐为什么可以迁移学习?因为对于同样的输入类型,图像、文字、音频等,在训练过程中会有一些共通的训练情况。例如,对于训练图像,不管是什么任务,对于图像类型的训练都会存在边缘特征训练、拐角特征训练、曲线特征训练等情况。所以如果想搭建一个图像处理模型,直接迁移其他模型来训练,总比自己随机初始化的效果要好。(类比会骑单车的人学习骑电动车总比小白学电动车要更快更好)
6️⃣评估指标
🎈有一个回归问题,对图像是横向的还是纵向的进行了分类,关于分类是否成功就有4种情况:
● 图像是横向的,被正确分类了
● 图像被分类为横向,但实际上不是横向的
● 图像不是横向的,被正确分类了
● 图像被分类为非横向,但实际上是横向的
🎈分类结果为正的情况是 Positive、为负的情况是 Negative。分类成功为 True、分类失败为 False。
🎗️精度(Accuracy)
✨对于一个模型,我们希望它分类正确的数据越多越好,这才是一个好的模型。可以使用 精度(Accuracy) 来衡量模型整体的正确率。
A
c
c
u
r
a
c
y
=
T
P
+
T
N
T
P
+
F
P
+
F
N
+
T
N
,它表示的是在整个数据集中,被正确分类的数据
T
P
和
T
N
所占的比例。
Accuracy = \frac {TP+TN} {TP + FP + FN + TN},它表示的是在整个数据集中,被正确分类的数据 TP 和 TN 所占 的比例。
Accuracy=TP+FP+FN+TNTP+TN,它表示的是在整个数据集中,被正确分类的数据TP和TN所占的比例。
假如 100 个数据中 80 个被正确地分类了, A c c u r a c y = 80 100 = 0.8 Accuracy = \frac {80} {100}= 0.8 Accuracy=10080=0.8,值越高精度越高,也就意味着模型越好。
🧐但是对于数据量极其不平衡的情况:
😞假设有 100 个数据,其中 95 个是 Negative。那么,哪怕出现模型把数据全部分类为 Negative 的极端情况,Accuracy 值也为 0.95,也就是说模型的精度是 95%。但是一个把所有数据都分类为 Negative 的模型,不能说它是好模型。这种情况,只看精度就看不出来模型存在的问题了,所以需要引入一些其他指标。
对于这种情况,我们假设模型的结果:
项 | 个数 |
---|---|
Positive 数据 | 5 个 |
Negative 数据 | 95 个 |
True Positive | 1 个 |
False Positive | 2 个 |
False Negative | 4 个 |
True Negative | 93 个 |
Accuracy | 94% |
🎗️精确率(Precision)
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
Precision = \frac {TP} {TP+FP}
Precision=TP+FPTP
✨这个指标只关注 TP 和 FP。根据表达式来看,它的含义是在被分类为 Positive 的数据中,实际就是 Positive 的数据所占的比例:
计算得出: P r e c i s i o n = 1 1 + 2 = 1 3 = 0.333... 计算得出:Precision = \frac {1}{1+2}=\frac13=0.333... 计算得出:Precision=1+21=31=0.333...
🤓这个值越高,说明分类错误越少。拿这个例子来说,虽然被分类为 Positive 的数据有 3 个,但其中只有 1 个是分类正确的。所以计算得出的精确率很低。
🎗️召回率(Recall)
R e c a l l = T P T P + F N Recall=\frac {TP} {TP+FN} Recall=TP+FNTP
✨这个指标只关注 TP 和 FN。根据表达式来看,它的含义是在Positive 数据中,实际被分类为 Positive 的数据所占的比例:
计算得出:
R
e
c
a
l
l
=
1
1
+
4
=
1
5
=
0.2
计算得出:Recall=\frac 1 {1+4}=\frac 1 5=0.2
计算得出:Recall=1+41=51=0.2
🤓这个值越高,说明被正确分类的数据越多。拿这个例子来说,虽然 Positive 数据共有 5 个,但只有 1 个被分类为 Positive。所以计算得出的召回率也很低。
🎗️F 值(Fmeasure)
🎈由上可知,如果是一个精确率和召回率都很高的模型,它当然是个好模型,不过通常情况下精确率和召回率会一个高一个低,需要我们取舍。那取它们的平均值怎么样?假设现在有两个模型,
它们的精确率和召回率如下:
🧐可以看出模型B过于极端。如果将所有的数据都分类为 Positive,那么召回率就是 1.0。但是这样一来,Negative 数据也会被分类为 Positive,所以精确率会变得很低。但是对于两个模型的平均值,会发现模型 B 的更高。但它是把所有数据都分类为 Positive 的模型,精确率极低,仅为 0.02,并不能说它是好模型。所以只看平均值确实无法知道模型的好坏。
✨这时需要评定综合性能的指标 F F F 值出场了:
F m e a s u r e = 2 1 P r e c i s i o n + 1 R e c a l l Fmeasure=\frac 2 {\frac 1 {Precision} + \frac 1 {Recall}} Fmeasure=Precision1+Recall12
🎈此时,精确率和召回率只要有一个低,就会拉低 F 值。再计算一下前面两个模型的 F F F 值:
和简单取平均值时得到的结果不同,模型 A 的 F F F 值更高。这说明该指标考虑到了精确率和召回率的平衡。(有时称 F F F 值为 F 1 F1 F1 值会更准确, F 1 F1 F1 值在数学上是精确率和召回率的调和平均值。)
✨除 F1 值之外,还有一个带权重的
F
F
F 值指标:
W
e
i
g
h
t
e
d
F
m
e
a
s
u
r
e
=
(
1
+
β
2
)
⋅
P
r
e
c
i
s
i
o
n
⋅
R
e
c
a
l
l
β
2
⋅
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
WeightedFmeasure=\frac{(1+β^2) · Precision · Recall} {β^2 · Precision + Recall}
WeightedFmeasure=β2⋅Precision+Recall(1+β2)⋅Precision⋅Recall
我们可以认为 F F F 值指的是带权重的 F F F 值,当权重为 1 时才是刚才介绍的 F 1 F1 F1 值。
🧐前面介绍的精确率和召回率都是以 TP 为主进行计算的,那么也能以 TN 为主吗?完全没问题,以 TN 为主来计算精确率和召回率的表达式是这样的:
P
r
e
c
i
s
i
o
n
=
T
N
T
N
+
F
N
Precision=\frac {TN} {TN+FN}
Precision=TN+FNTN
R
e
c
a
l
l
=
T
N
T
N
+
F
P
Recall=\frac {TN} {TN+FP}
Recall=TN+FPTN
🌹当数据不平衡时,使用数量少的那个会更好。