机器学习算法完整版见fenghaootong-github
模型评估与选择
- 经验误差与过拟合
- 评估方法
- 性能度量
- 比较检验
- 偏差与方差
经验误差与过拟合
- 误差率:分类错误的样本数占样本总数的比例
- 精度:1 - 错误率
- 误差:学习器的实际预测输出与样本的真实输出之间的差异
- 过拟合:训练样本学的太好,就是把训练样本的所有特征当作了所有样本的特征
评估方法
留出法
留出法比较简单,就是把数据集进行划分,划分为两个互斥的集合,一个作为训练集,一个作为测试集,至于怎么分,采用什么样的采样方法,可以自己决定
交叉验证法
- 首先把数据集划分为k个大小相同的互斥子集
- 每次用k-1个子集作为训练集,一个子集作为测试集
- 交叉使用这k个子集作为测试集,从而进行k次训练和测试,最终返回这k个结果的均值
- 这就是k折交叉验证
自助法
自助法和交叉验证法有点相似,不同的是,两个划分数据的方式不同,自助法方法如下:
- 首先首先从m个样本的数据集D中,可放回的重复抽样m次,得到一个有m个样本的数据集 D i D_i Di
- 这样的抽样方式在 D i D_i Di肯定有重复的数据,有一部分数据肯定没有抽到,没有抽到的概率为 ( 1 − 1 m ) m (1-\frac{1}{m})^m (1−m1)m
- 用含有m个样本的数据集 D i D_i Di作为训练集,剩下的没有抽到的作为测试集
- 将这样的动作重复多次就可以训练出多个模型
自助法在数据集较小、难以有效划分训练/测试集时很有用,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法很有效
自助法产生的数据集改变了初始数据集的分布,这会引入估计误差,因此数据量足够时,留出法和交叉验证法更常用
调参与最终模型
- 大多数的学习算法都有参数需要设定,参数配置不同学习的模型的性能往往有显著差别
- 但是在调参的时候要注意设置步长,否则在实数范围内,对每种参数配置训练出模型来是不可能的
- 调参是一件困难的工程,比如算法有3个参数,每个参数考虑5个候选参数,这就有 5 3 = 125 5^3 = 125 53=125个模型
- 模型选择时要把训练数据分成训练集和验证集,选择最好的模型,然后用所有的训练数据重新训练模型,最后再用测试集测试结果
性能度量
举个例子, y y y为真是值, f ( x ) f(x) f(x)为预测结果
回归任务最常用的性能度量时“均方误差“:
E ( f : D ) = 1 m ∑ i = 1 m ( f ( x ) − y ) 2 E(f:D) = \frac{1}{m} \sum_{i=1}^{m}(f(x)-y)^2 E(f:D)=m1i=1∑m(f(x)−y)2
更一般的,对于数据分布 D D D和概率密度函数 p ( ⋅ ) p(\cdot) p(⋅),均方误差:
E ( f : D ) = ∫ x ∽ D p ( x ) ( f ( x ) − y ) 2 d x E(f:D) = \int_{x\backsim D} p(x)(f(x)-y)^2 dx E(f:D)=∫x∽Dp(x)(f(x)−y)2dx
错误率与精度
分类任务,最常用的性能测量
错误率:
E ( f : D ) = 1 m ∑ i = 1 m ⨿ ( f ( x ) ≠ y i ) E(f:D) = \frac{1}{m} \sum_{i=1}^{m} \amalg (f(x)\ne y_i) E(f:D)=m1i=1∑m⨿(f(x)̸=yi)
精度:
a c c ( f : D ) = 1 m ∑ i = 1 m ⨿ ( f ( x ) = y i ) = 1 − E ( f : D ) acc(f:D) = \frac{1}{m} \sum_{i=1}^{m} \amalg (f(x) = y_i) = 1 - E(f:D) acc(f:D)=m1i=1∑m⨿(f(x)=yi)=1−E(f:D)
更一般的,对于数据分布 D D D和概率密度函数 p ( ⋅ ) p(\cdot) p(⋅),错误率和精度:
E ( f : D ) = ∫ x ∽ D p ( x ) ⨿ ( f ( x ) ≠ y i ) d x E(f:D) = \int_{x\backsim D} p(x) \amalg (f(x)\ne y_i) dx E(f:D)=∫x∽Dp(x)⨿(f(x)̸=yi)dx
a c c ( f : D ) = ∫ x ∽ D p ( x ) ⨿ ( f ( x ) = y i ) d x = 1 − E ( f : D ) acc(f:D) = \int_{x\backsim D} p(x) \amalg (f(x) = y_i) dx = 1 - E(f:D) acc(f:D)=∫x∽Dp(x)⨿(f(x)=yi)dx=1−E(f:D)
查准率、查全率和F1
举一个医院的例子,错误率就是一个医生对病人的误判率,但是并没有说时把健康的人误判为病人还是把病人误判为健康的人,这是两种完全不同的结果,所以错误率这时候就不够用了。
还有就是信息检索时,我们经常关心”检索出来的信息有多少比例是用户感兴趣的“ ”用户感兴趣的信息中有多少被检索出来了“,这两个就分别对应了“查准率”和“查全率”
对于二分类问题,用一个分类结果混淆矩阵说明:
真实情况 | 预测结果 | 预测结果 |
---|---|---|
正例 | 反例 | |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(假正例) | TN(真反例) |
查准率:
P
=
T
P
T
P
+
F
P
P = \frac{TP}{TP + FP}
P=TP+FPTP
查全率:
R
=
T
P
T
P
+
F
N
R = \frac{TP}{TP + FN}
R=TP+FNTP
查准率和查全率的不同偏好:
F
β
=
(
1
+
β
2
)
×
P
×
R
(
β
2
×
P
)
+
R
F_\beta = \frac{(1 + \beta^2) \times P \times R}{(\beta^2 \times P) + R}
Fβ=(β2×P)+R(1+β2)×P×R
其中 β > 0 \beta > 0 β>0度量了查全率对查准率的相对重要性, β = 1 \beta = 1 β=1是标准的 F 1 F_1 F1, β > 1 \beta > 1 β>1时查全率有更大的影响, β < 1 \beta < 1 β<1时查准率有更大的影响
ROC和AUC
ROC曲线的横纵坐标分别是:
横坐标为假正例率:
F
P
R
=
F
P
F
P
+
T
N
FPR = \frac{FP}{FP + TN}
FPR=FP+TNFP
纵坐标为真正例率:
T
P
R
=
T
P
T
P
+
F
N
TPR = \frac{TP}{TP + FN}
TPR=TP+FNTP
若一个学习器的ROC曲线被另一个学习器的ROC曲线包裹,则后者优于前者,如果两条曲线发生重合,则使用ROC曲线下的面积,即AUC
A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ( y i + y i + 1 ) AUC = \frac{1}{2} \sum_{i=1}^{m-1}(x_{i+1} - x_i)(y_i + y_{i+1}) AUC=21i=1∑m−1(xi+1−xi)(yi+yi+1)
比较检验
本节默认以错误率为性能测量,用 ϵ \epsilon ϵ表示
假设检验
假设检验中的“假设”是对学习器泛化错误率分布的某种判断或者猜想,例如“ ϵ \epsilon ϵ= ϵ 0 \epsilon_0 ϵ0”。现实任务中我们并不知道学习器的泛化错误率,只能获知其测试错误率 ϵ ^ \widehat{\epsilon} ϵ 。泛化错误率与测试错误率未必相同,但二者接近的可能性比较大,因此,可根据测试错误率推出泛化错误率的分布。
- 泛化错误率 ϵ \epsilon ϵ的学习器在一个样本上犯错的概率为 ϵ \epsilon ϵ;
- 测试错误率 ϵ ^ \widehat{\epsilon} ϵ 意味着在m个测试样本中恰有 ϵ ^ ∗ m \widehat{\epsilon}* m ϵ ∗m个被误分类。
- 在包含m个样本的测试集上,泛化错误率为
ϵ
\epsilon
ϵ的学习器被测得测试错误率为
ϵ
^
\widehat{\epsilon}
ϵ
的概率:
P ( ϵ ^ ; ϵ ) = ⟮ ϵ ^ ∗ m m ⟯ ϵ ϵ ^ ∗ m ( − ϵ ) m − ϵ ^ ∗ m P(\widehat{\epsilon};\epsilon) = \lgroup_{\widehat{\epsilon} * m}^{m} \rgroup\epsilon^{\widehat{\epsilon} * m}(- \epsilon )^{m - \widehat{\epsilon} * m} P(ϵ ;ϵ)=⟮ϵ ∗mm⟯ϵϵ ∗m(−ϵ)m−ϵ ∗m - 显著度为 α \alpha α
- 交叉验证法要进行多次训练和测试,会得到多个测试错误率,我们使用“t检验”,假定我们得到了k个测试错误率,
ϵ
^
1
\widehat{\epsilon}_{1}
ϵ
1,
ϵ
^
2
\widehat{\epsilon}_{2}
ϵ
2,…,
ϵ
^
k
\widehat{\epsilon}_{k}
ϵ
k,则平均测试错误率
μ
\mu
μ和方差
σ
2
\sigma^2
σ2为:
μ = 1 k ∑ i = 1 k ϵ ^ i \mu = \frac{1}{k}\sum_{i = 1}^{k}\widehat{\epsilon}_{i} μ=k1i=1∑kϵ i
σ 2 = 1 k − 1 ∑ i = 1 k ( ϵ ^ i − μ ) 2 \sigma^{2} = \frac{1}{k-1}\sum_{i = 1}^{k}(\widehat{\epsilon}_{i}-\mu)^2 σ2=k−11i=1∑k(ϵ i−μ)2 - 考虑到这k个测试错误率可看作泛化错误率
ϵ
0
\epsilon_{0}
ϵ0的独立采样,则变量
τ t = k ( μ − ϵ 0 ) σ \tau_t= \frac{\sqrt{k}(\mu - \epsilon_{0})}{\sigma} τt=σk(μ−ϵ0)
服从k-1的t分布
- 对于假设“ μ = ϵ 0 \mu = \epsilon_{0} μ=ϵ0”和显著度 α \alpha α,若平均错误率 μ \mu μ和 ϵ 0 \epsilon_{0} ϵ0之差 ∣ μ − ϵ 0 ∣ |\mu - \epsilon_{0}| ∣μ−ϵ0∣位于临界值范围 [ t − α 2 , t α 2 ] [t_{-\frac{\alpha}{2}}, t_{\frac{\alpha}{2}}] [t−2α,t2α],则不能拒绝假设“ μ = ϵ 0 \mu = \epsilon_{0} μ=ϵ0”,即可认为泛化错误率为 ϵ 0 \epsilon_{0} ϵ0,置信度为 1 − α 1-\alpha 1−α;否则拒绝该假设,即在该显著度下可认为泛化错误率与 ϵ 0 \epsilon_{0} ϵ0有显著不同。 α \alpha α常用取值为0.05和0.01。
McNemar检验
- 对于二分类的问题,使用留出法,不仅可估计学习器A和B的测试错误率,还可获得两学习器分类结果的差别,如下列联表所示:
算法B | 算法A | 算法A |
---|---|---|
正确 | 错误 | |
正确 | e 00 e_{00} e00 | e 01 e_{01} e01 |
错误 | e 10 e_{10} e10 | e 11 e_{11} e11 |
- 若我们做的假设是两学习器性能相同,则应有
e
01
=
e
10
e_{01}=e_{10}
e01=e10,那么变量
∣
e
01
−
e
10
∣
|e_{01}-e_{10}|
∣e01−e10∣应当服从正态分布。McNemar检验考虑变量为:
τ χ 2 = ( ∣ e 01 − e 10 ∣ − 1 ) 2 e 01 + e 10 \tau_{\chi^2} = \frac{(|e_{01}-e_{10}|-1)^2}{e_{01}+e_{10}} τχ2=e01+e10(∣e01−e10∣−1)2
服从自由度1的 χ 2 \chi^2 χ2分布,即标准正态分布变量的平方
- 给定显著度 α \alpha α,当以上变量小于临界值 χ α 2 \chi_{\alpha}^2 χα2时,不能拒绝假设,即认为两学习器的性能没有显著差别。
Friedman和Nemenyi检验
- 用于在一组数据上对多个算法进行比较
- 一种是在每个数据集上分别列出两两比较的结果
- 另一种是基于算法排序的Friedman检验
- 如果Friedman检验得到的结果是所有算法的性能相同,这时候再用Nemenyi检验
偏差与方差
- 泛化误差是指在新样本上的误差
- 泛化误差等于偏差、方差与噪声之和
- 偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力
- 方差度量了同样大小的训练集的变动所导致的学习性能的变化,即数据扰动所造成的影响
- 噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度