机器学习(六)——正则化
当我们训练得到了一个模型之后,我们如何评估它?如何决定下一步要执行怎样的操作对我们的模型进行调整?本文将简要介绍机器学习诊断。
文章目录
1. 训练集、验证集、测试集
相信接触过机器学习深度学习的都知道训练集、验证集、测试集这三个名词,本人在初次接触机器学习的时候,一直以为训练集就是用来训练模型的,验证集和测试集是分别用来验证和测试模型的。当时我只是从字面上来理解,后来学习了之后才对它们有较为清晰的认识,才知道为什么要对数据做这样的划分。
1.1 数据划分的意义
如果我们将所有的样本数据用来训练模型,通过最小化损失函数,我们得到了一个在样本数据上表现不错的模型。我们训练模型的目的是为了使模型在真实环境中得到较好的效果,而不仅仅是在我们的样本数据上呈现较好的效果,所以我们需要防止模型出现过拟合的问题,提高模型的泛化能力。但如我们之前提到的,如果模型出现了过拟合的问题,这个时候我们怎么判断模型是否存在过拟合的问题?
如果我们将样本数据的一部分划分出来作为测试集,并使用测试集来判断我们模型的泛化能力,计算模型在测试集上的误差,并最小化该误差。这个想法似乎不错,而且这也确实是一种划分数据的方法,一般采用训练集:测试集 = 8 : 2。但是,如果我们的模型针对测试集数据出现了过拟合的情况,又该怎么办呢?
我们再将训练集数据的一部分划分出来作为验证集,使用训练集训练模型,然后在验证集上评估模型,找到最合适的参数,然后在测试集上测试一次得到误差,这样就解决了先前提到的问题。一般采用训练集 : 验证集 : 测试集 = 6 : 2 : 2,当数据量是万级以上时,也可以将比例调整为98 : 1 : 1。
需要说明的是,在进行数据划分时要随机划分数据,一般打乱数据后再划分。
1.2 模型选择
(1)假设使用训练集得到a个模型;
(2)对这a个模型,在验证集上使用交叉验证计算验证误差;
(3)选择验证误差最小的模型;
(4)对于选出来的模型,在测试集上计算推广误差。
1.3 交叉验证 Cross Validation
交叉验证就是以某种方式把原始数据分为训练集和验证集,使用训练集训练模型,使用验证集测试训练得到的模型性能。
常用的交叉验证方法
(1)K-fold交叉验证
将样本数据分为K组,每次保留一组作为验证集,剩余K-1组作为训练集训练模型,交叉验证重复K次,即每一组都会作为验证集验证一次,最后对所有的评估结果取平均作为最终评分。一般K取5或10。
(2)留一验证LOOCV
每次只保留原始数据中的一项数据进行验证,剩余的作为训练集,重复执行直到样本数据中的每一项数据都被当做验证。
更多关于交叉验证的内容可参考:链接
2. 偏差和方差
在之前介绍正则化的时候,我们提到了模型欠拟合时存在高偏差,过拟合时存在高方差。从一张图直观的理解一下高偏差和高方差:
注:图片来自网络,侵删。
把我们的模型比作射击运动员的话,就像上图的射击结果:
(1)如果射击结果的偏差较大,即射击位置偏离靶心过远,就说这个运动员的命中率很低。
(2)如果射击结果方差较大,即射击的位置很分散不集中,就说这个运动员的射击水平很不稳定。
对应到我们的模型上,当模型存在高偏差问题时,模型的预测准确率会很低;当模型存在高方差问题时,模型会很不稳定。
我们在估计模型误差时,会认为:误差 = 偏差 + 方差,所以我们希望模型的偏差和误差都尽可能的小,这样我们的模型误差就会越小。接下来我们就看看偏差和方差是如何影响模型的。
假设在训练集和验证集上的误差分别为
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ),计算公式为:
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2
Jtrain(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
m
m
m是训练集中的样本数据数量,
x
(
i
)
x^{(i)}
x(i)和
y
(
i
)
y^{(i)}
y(i)是训练集中的样本数据和输出标记。
J
c
v
(
θ
)
=
1
2
m
c
v
∑
i
=
1
m
c
v
(
h
θ
(
x
c
v
(
i
)
)
−
y
c
v
(
i
)
)
2
J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_{\theta}(x_{cv}^{(i)})-y_{cv}^{(i)})^2
Jcv(θ)=2mcv1i=1∑mcv(hθ(xcv(i))−ycv(i))2
m
c
v
m_{cv}
mcv是验证集中的样本数据数量,
x
c
v
(
i
)
x_{cv}^{(i)}
xcv(i)和
y
c
v
(
i
)
y_{cv}^{(i)}
ycv(i)是验证集中的样本数据和输出标记。
2.1 诊断偏差和方差
首先来看训练集和验证集的损失函数误差图:
横轴:degree——高次方项的次数
纵轴:损失函数误差
(注:图片来自吴恩达老师的PPT)
我们会看到:
(1)训练集:degree较小时,模型拟合程度低(欠拟合),误差较大;degree逐渐增大,拟合程度逐渐提高,误差减小。
(2)验证集:degree较小时,模型拟合程度低(欠拟合),误差较大;随着degree的增大,误差先减小后增大,转折点就是模型开始过拟合训练数据集的时候。
2.2 正则化和偏差方差
如果为损失函数添加了正则项,那么模型的损失函数就是:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
2
m
∑
j
=
1
n
θ
j
2
J(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_{\theta}(x^{(i)}) - y^{(i)})^2 + \frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2+2mλj=1∑nθj2
选择不同的 λ \lambda λ值对方差和偏差有影响。
来看一下训练集和验证集的损失函数误差图:
横轴:
λ
\lambda
λ的大小
纵轴:损失函数误差
我们可以看到:
(1)训练集:
λ
\lambda
λ较小时,训练集误差较小(过拟合);
λ
\lambda
λ逐渐增大,训练集的误差不断增大(欠拟合)。
(2)验证集:
λ
\lambda
λ较小时,验证集的误差较大(过拟合);
λ
\lambda
λ逐渐增大,验证集的误差先减小后增大,转折点就是最合适的
λ
\lambda
λ的值的位置。
3. 学习曲线
3.1 什么是学习曲线
学习曲线是学习算法的一个很好的合理检验;它是将训练集误差和验证集误差作为训练集样本数据量m的函数,绘制而成的图表。
3.2 学习曲线能告诉我们什么
我们可以通过学习曲线来判断算法是否处于偏差、方差问题。假设
m
m
m为样本数据量。
1.欠拟合(高偏差问题)
当模型存在高偏差问题时,随着
m
m
m越来越大,训练集误差和验证集误差都没有较大的改变。
2.过拟合(高方差问题)
假设使用一个高次多项式模型,而且正则化程度较低。若模型存在高方差问题,随着
m
m
m的增大,验证集误差与训练集误差之间的差距逐渐缩小。即当验证集误差远大于训练集误差时,增大训练集的样本数量可以提高模型效果。
3.3 下一步怎么做
根据学习曲线我们就能知道下一步要做什么了。我们可以知道我们的模型此时是存在欠拟合(高偏差问题)还是过拟合(高方差问题),从而采取相应的措施:
1.解决欠拟合(高偏差)问题
(1)获得更多的特征
(2)增加多项式特征(degree)
(3)减小正则化程度
2.解决过拟合(高方差)问题
(1)获取更多的训练样本数据
(2)减少特征数量
(3)增大正则化的程度
4. 误差分析
4.1 类偏斜的误差度量
类偏斜:训练集中有非常多的同一类的样本实例,只有很少或者没有其他种类的样本实例。
比如:在预测肿瘤是良性的还是恶性的,我们的训练集中有99.5%的样本数据是良性肿瘤的数据,剩余0.5%的样本数据时恶性肿瘤的数据。此时就说我们的样本数据存在类偏斜情况。
若此时我们在所有情况下都预测肿瘤是良性的,那就只有0.5%的误差;若我们设计算法训练得到的模型有1%的误差,那么此时的误差大小是不能作为评价算法效果的依据的。
对于这种情况,我们引入查准率和查全率指标。
4.2 查准率和查全率
4.2.1 混淆矩阵
对于二分类问题,我们用0代表negative(假),用1代表positive(真),那么真实值和预测值之间就会有这样的关系:
- True Positive: 预测为真,实际为真
- True Negative:预测为假,实际为假
- False Positive:预测为真,实际为假
- False Negative:预测为假,实际为真
将这四种关系对应画出来,我们就能得到:
这个就是混淆矩阵,它展现了真实值和预测值之间的四种关系。
4.2.2 查准率和查全率
查准率(
p
r
e
c
i
s
i
o
n
precision
precision)和查全率(
r
e
c
a
l
l
recall
recall)有的地方将它们称作“精准率”和“召回率”。通常使用这两个指标来衡量二分类的模型效果。它们对应的计算公式为:
p
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
precision = \frac{TP}{TP+FP}
precision=TP+FPTP
r
e
c
a
l
l
=
T
P
T
P
+
F
N
recall = \frac{TP}{TP+FN}
recall=TP+FNTP
借用西瓜书中的话来理解查准率和查全率:
如果把算法的预测过程比作挑西瓜
(1)查准率:算法挑出来的西瓜中,有多少比例是好西瓜;
(2)查全率:所有的好西瓜中,有多少比例被算法挑了出来。
4.2.3 查准率和查全率之间的权衡
我们在预测时当然希望算法的查准率和查全率能够保持相对的平衡,这样有利于我们更好更方便的取评估模型。然而事实会如我们所愿吗?
例子:不同阈值对查准率和查全率的影响
我们思考之前预测肿瘤的例子:
(1)当
h
θ
(
x
)
>
=
0.5
h_{\theta}(x) >= 0.5
hθ(x)>=0.5时,预测为1;
(2)当
h
θ
(
x
)
<
0.5
h_{\theta}(x) < 0.5
hθ(x)<0.5时,预测为0。
这里的0.5就是阈值。倘若我们采用不同的阈值,对查准率和查全率有什么影响呢?
假设图中的蓝色点表示良性肿瘤,红色点表示恶性肿瘤。
当采用0.5为阈值时,我们计算precision和recall:
(1)
p
r
e
c
i
s
i
o
n
=
5
1
+
5
=
5
6
precision = \frac{5}{1+5} = \frac{5}{6}
precision=1+55=65
(2)
r
e
c
a
l
l
=
5
0
+
5
=
1
recall= \frac{5}{0+5}=1
recall=0+55=1
若采用0.7作为阈值,我们计算precision和recall:
(1)
p
r
e
c
i
s
i
o
n
=
4
0
+
4
=
1
precision = \frac{4}{0+4} =1
precision=0+44=1
(2)
r
e
c
a
l
l
=
4
1
+
4
=
4
5
recall= \frac{4}{1+4}=\frac{4}{5}
recall=1+44=54
若采用0.4作为阈值,我们计算precision和recall:
(1)
p
r
e
c
i
s
i
o
n
=
5
2
+
5
=
5
7
precision = \frac{5}{2+5} =\frac{5}{7}
precision=2+55=75
(2)
r
e
c
a
l
l
=
5
0
+
5
=
1
recall= \frac{5}{0+5}=1
recall=0+55=1
由此可见不同的阈值对于查准率和查全率是有影响的:
模型 | Precision | Recall |
---|---|---|
阈值为0.5的 m o d e l 1 model_1 model1 | 5 6 \frac{5}{6} 65 | 1 |
阈值为0.7的 m o d e l 2 model_2 model2 | 1 | 4 5 \frac{4}{5} 54 |
阈值为0.4的 m o d e l 2 model_2 model2 | 5 7 \frac{5}{7} 75 | 1 |
那么此时问题来了:我们怎么根据precision和recall来评估我们这三个模型的效果?这两个指标发生冲突时,我们很难在模型之间进行比较。在这里介绍
F
1
S
c
o
r
e
F_1 Score
F1Score:
F
1
S
c
o
r
e
=
2
P
R
P
+
R
F_1 Score = 2 \frac{PR}{P+R}
F1Score=2P+RPR
其中P代表查准率,R代表查全率。其取值范围为0~1.
其实
F
1
S
c
o
r
e
F_1 Score
F1Score是
p
r
e
c
i
s
i
o
n
precision
precision和
r
e
c
a
l
l
recall
recall的调和平均值,它兼顾了二者:
1
F
1
=
1
2
(
1
p
r
e
c
i
s
i
o
n
+
1
r
e
c
a
l
l
)
\frac{1}{F_1} = \frac{1}{2}(\frac{1}{precision}+\frac{1}{recall})
F11=21(precision1+recall1)
这样我们就能根据模型的
F
1
S
c
o
r
e
F_1 Score
F1Score在模型之间进行比较评估。对应到本例中,我们就可以通过计算
m
o
d
e
l
1
model_1
model1
m
o
d
e
l
2
model_2
model2
m
o
d
e
l
3
model_3
model3的
F
1
S
c
o
r
e
F_1 Score
F1Score的值来对这三个模型进行评估,选出最合适的那一个。
5. ROC曲线
5.1 什么是ROC曲线
ROC 全称为Receiver Operating Characteristic Curve,受试者工作特征曲线。它是这样的一条曲线:
注:图片来自网络,侵删。
横轴为FPR : False Positive Rate,纵轴为TPR : True Positive Rate。ROC曲线反映了二者之间的关系。
5.2 FPR与TPR
F
P
R
=
F
P
T
N
+
F
P
FPR = \frac{FP}{TN+FP}
FPR=TN+FPFP
T
P
R
=
T
P
T
P
+
F
N
TPR=\frac{TP}{TP+FN}
TPR=TP+FNTP
对FPR和TPR 的理解:
(1)FPR表示:实际值为假时,预测值为真的比例。
(2)TPR表示:实际值为真,预测值为真的比例。
对应到肿瘤预测的例子中,FPR表示患者的肿瘤是良性的但我们却将其预测为恶性,TPR表示患者的肿瘤是恶性的,我们给患者的预测结果也是恶性的。所以我们在预测时,希望FPR的值越小越好,TPR的值越大越好,但我们会发现这两个指标之间是互相影响的。假设我们不管三七二十一均认为患者的肿瘤是恶性的,那么TPR就会很高,但相应的,FPR也会升高。因此我们就会看到如同上图ROC曲线的例子,TPR升高时FPR也升高。
那么问题又来了,我们如何通过模型的ROC曲线来评估它的效果呢?
5.3 AUC
AUC 全称为Area Under Curve,在ROC曲线图中将其定义为ROC曲线下的面积。我们很难直接从ROC曲线图中判断哪个模型的效果好,因此AUC作为一个数值就能清晰的告诉我们模型的效果。关于为什么使用AUC作为评估指标可参考:链接
引用这篇文章中的话,AUC是一个概率值:当随机挑选一个正样本和负样本,算法根据计算得到的score将正样本排在负样本的前面的概率就是AUC的值。
补充:我刚开始对正负样本的概念不清除,所以在此记录一下。
针对分类问题,正样本就是我们希望正确分类出的类别对应的样本,负样本就是其他类别对应的样本。比如分类图片中的狗,那么分类时,狗的图片就是正样本,不是狗的图片就是负样本。
参考:机器学习中的正负样本
通常ROC曲线都位于(0,0) (1, 1)连线的上方,(0,0) (1, 1)连线形成的是随机分类器的ROC曲线,一般来说模型的效果都要好于随机分类器的效果,但也可能会出现相反的结果。
(1)AUC 极限接近1时,我们认为这是个完美分类器;
(2)0.5 < AUC < 1 时,说明模型效果优于随机分类器效果;
(3)AUC = 0.5 说明模型的效果和随机分类器的效果是一样的;
(4)AUC < 0.5 时,模型效果就很差,连随机分类器都不如,这时候可以考虑将预测结果取反。
总之AUC的值越高,说明模型的效果越好。
5.4 ROC曲线的优势
ROC曲线的一个明显优势是:当样本中的正负样本数据的分布出现变化时,ROC曲线几乎没有变化,也就是说ROC曲线很稳定。所以当我们的样本数据出现类偏斜时,或者正负样本数据分布出现较大波动时,ROC曲线能够保持不变。使用网络上的一张图片来做说明:(侵删)
图(a)与图(c)为ROC曲线,图(b)与图(d)为查准率-查全率曲线。(a)(b)展示了在正负样本分布平衡的情况下的ROC曲线和precision-recall曲线;(c)(d)展示了当负样本增加到原来的10倍以后的ROC曲线和precision-recall曲线。由此可见ROC曲线很稳定。
6. 总结
本文主要介绍了当获得了一个模型后,如何对模型效果进行评估。
(1)首先介绍了训练集、验证集、测试集,以及数据划分的意义和交叉验证;
(2)引入偏差和方差的概念,并介绍了偏差和方差对模型的影响,模型什么情况下会出现高偏差问题、什么情况下会出现高方差问题;
(3)之后介绍了学习曲线,介绍了学习曲线能反映什么信息,告诉我们接下来该怎么做;
(4)之后又引入了混淆矩阵、precision、recall,F1 Score等概念,最后又介绍了ROC曲线以及如何使用它来评估模型效果。
文章内容有些杂乱,对一些知识点做了简单的整理,并不是很详细。由于本人也是机器学习的初学者,文章可能存在错误与不足,欢迎大家的指正与补充!
参考内容:
[1] 训练集、验证集和测试集
[2] 机器学习基础(1)- ROC曲线理解
[3] 什么是ROC曲线?为什么要使用ROC?以及 AUC的计算