学习总结于《机器学习》周志华、CSDN大佬们的博客
也称经验误差,是指学习器在训练集上的误差
R e m p ( f ^ ) = 1 N ∑ i = 1 N L ( y i , f ^ ( x i ) ) R_{emp}(\hat{f}) = \frac{1}{N}\sum_{i=1}^{N}L(y_i,\hat{f}(x_i)) Remp(f^)=N1i=1∑NL(yi,f^(xi)), N N N是训练样本容量, L L L是损失函数
也称泛化误差,是指学习器在新样本上的误差
R t e s t ( f ^ ) = 1 N ′ ∑ i = 1 N ′ L ( y i , f ^ ( x i ) ) R_{test}(\hat{f}) = \frac{1}{N'}\sum_{i=1}^{N'}L(y_i,\hat{f}(x_i)) Rtest(f^)=N′1i=1∑N′L(yi,f^(xi)), N ‘ N‘ N‘是训练样本容量, L L L是损失函数
直接将数据集 D D D划分为两个互斥的集合,其中一个集合作为训练集 S S S,另一个作为测试集 T T T,在 S S S上训练出模型后,用 T T T来评估其测试误差。
训练集与测试集的划分,存在着一定的问题。一般来说,测试集较小时,评估结果的方差较大;训练集较小时,评估结果偏差较大。常见的做法是将大约2/3~4/5的样本用于训练,剩余样本用于测试。
为了减小因样本划分不同而引入的差别,将数据集进行p次随机划分,每次产生一个训练/测试集用于实验评估,p次后得到p个结果,并返回p次结果的均值。
先将数据集 D D D划分为 k k k个大小相似的互斥子集,每个子集 D i D_i Di都尽可能保持数据分布的一致性,即从 D D D中通过分层采样得到,然后,每次使用 k − 1 k-1 k−1个子集的并集作为训练集,余下的子集作为测试集。如此便可以得到 k k k组训练/测试集,从而进行 k k k次训练和测试,最终返回 k k k个测试结果的均值。
k k k折交叉验证通常随机使用不同的划分重复p次,最终的评估结果是这p次 k k k折交叉验证结果的均值。
若数据集中包含 m m m个样本,令 k = m k=m k=m,则得到了交叉验证法的一个特列:留一法(LOO)。留一法不受随机样本划分方式的影响,因此留一法的评估结果往往被认为比较准确;而然,在数据集比较大时,训练 m m m个模型的计算开销可能是难以忍受的。
给定包含 m m m个样本的数据集 D D D,我们对它进行采样产生数据集 D ′ D' D′:每次随机有放回的从 D D D中挑选一个样本,将其拷贝放入 D ′ D' D′,重复 m m m次,便得到包含 m m m个样本的数据集 D ′ D' D′。样本在 m m m次采样中,始终不被采到的概率是 ( 1 − 1 m ) m (1-\frac{1}{m})^m (1−m1)m,取极限得:
lim m → ∞ ( 1 − 1 m ) m = 1 e ≈ 0.368 \lim\limits_{m\rightarrow\infty}(1-\frac{1}{m})^m = \frac{1}{e}\approx 0.368 m→∞lim(1−m1)m=e1≈0.368
即通过自助采样,初始数据集 D D D中约有36.8%的样本未出现在采样数据集 D ′ D' D′中,于是我们可以将 D ′ D' D′用作训练集, D D D\ D ′ D' D′用作测试集。
自助法在数据集较小,难以有效划分训练/测试集时很有用,自助法能从初始数据集中产生多个不同的训练集,对集成学习等方法有很大好处。而自助法产生的数据集改变了初始数据集的分布,会引入估计偏差,因此,在初始数据量足够时,留出法和交叉验证法更常用一些。
机器学习常涉及两类参数:一类是算法的参数,即超参数;另一类是模型需要学习的参数。前者通常是由人工设定多个参数候选值后产生模型,后者则是通过学习来产生多个候选模型(如神经网络在不同轮数停止训练)。
回归任务的性能度量指标。
E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E(f;D) = \frac{1}{m} \sum_{i=1}^{m}(f(x_i)-y_i)^2 E(f;D)=m1i=1∑m(f(xi)−yi)2
一般的对于数据分布 D D D和概率密度函数 p ( . ) p(.) p(.),均方误差可以描述为:
E ( f ; D ) = ∫ D ( f ( x i ) − y i ) 2 p ( x ) d x E(f;D) = \int_{D} (f(x_i)-y_i)^2p(x)dx E(f;D)=∫D(f(xi)−yi)2p(x)dx
分类任务中最常用的两种性能度量,既适用于二分类,也适用于多分类。
对于样例集D,
错误率的定义为:
E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ≠ y i ) E(f;D) = \frac{1}{m} \sum_{i=1}^{m}I(f(x_i)\not=y_i) E(f;D)=m1i=1∑mI(f(xi)=yi)
精度(accuracy)的定义为:
a c c ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) = y i ) = 1 − E ( f ; D ) acc(f;D) = \frac{1}{m} \sum_{i=1}^{m}I(f(x_i)=y_i) = 1-E(f;D) acc(f;D)=m1i=1∑mI(f(xi)=yi)=1−E(f;D)
一般的对于数据分布 D D D和概率密度函数 p ( . ) p(.) p(.),错误率与精度可以描述为:
E ( f ; D ) = ∫ D I ( f ( x i ) ≠ y i ) p ( x ) d x E(f;D) = \int_{D} I(f(x_i)\not=y_i)p(x)dx E(f;D)=∫DI(f(xi)=yi)p(x)dx
a c c ( f ; D ) = ∫ D I ( f ( x i ) = y i ) p ( x ) d x = 1 − E ( f ; D ) acc(f;D) = \int_{D} I(f(x_i)=y_i)p(x)dx = 1-E(f;D) acc(f;D)=∫DI(f(xi)=yi)p(x)dx=1−E(f;D)
错误率和精度虽然常用,但并不能满足所有任务的需求。如对于信息检索问题,我们往往更关心的是"检索的信息中有多少比例是用户感兴趣的"(查准率),“用户感兴趣的信息又有多少被检索出来”(查全率),因此“查准率(precision)”和“查全率(recall)”是更实用于此类需求的性能指标。
对于二分类问题,根据其真实类别于学习器预测类别,我们有如下的混淆矩阵:
预测结果 | 预测结果 | |
---|---|---|
真实情况 | 正例 | 反例 |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(假正例) | TN(真反例) |
查准率 P P P与查全率 R R R分别定义为:
P ( p r e c i s i o n ) = T P T P + F P P(precision)=\frac{TP}{TP+FP} P(precision)=TP+FPTP
R ( r e c a l l ) = T P T P + F N R(recall) = \frac{TP}{TP+FN} R(recall)=TP+FNTP
查准率与查全率是一对矛盾的度量,通常,查准率高时,查全率往往偏低(如挑选西瓜时,只挑最有把握的瓜,但难免会漏掉不少好瓜);查全率较高时,查准率往往偏低(如想把好瓜尽可能多的跳出来,则可以把所有西瓜都选上,那么所有好瓜必然都被选上了,但真正例的比例在挑出的‘好瓜’中则会明显下降)。
在机器学习中分类器往往输出的不是类别标号,而是属于某个类别的概率值,因此俺顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率,查准率。并以此查准率作为纵轴、查全率作为横轴,就得到了“P-R曲线“。
在很多情况下,人们通过比较P-R曲线下面积的大小,来衡量学习器的性能优劣,它在一定程度上表征了学习器在查准率和查全率上取得相对‘双高’的比例。
很多情况下P-R曲线的下面积值并不易计算,因此通常我们采用以下一些性能度量指标:
平衡点(Break- Even Point)它是“查准率=查全率”时的取值。
F1是基于查准率与查全率的调和平均定义的:
1 F 1 = 1 2 ∗ ( 1 P + 1 R ) \frac{1}{F1} = \frac{1}{2}*(\frac{1}{P}+\frac{1}{R}) F11=21∗(P1+R1)
F 1 = 2 ∗ P ∗ R P + R = 2 ∗ T P 样 例 总 数 + T P − T N F1 = \frac{2*P*R}{P+R} = \frac{2*TP}{样例总数+TP-TN} F1=P+R2∗P∗R=样例总数+TP−TN2∗TP
F β F_\beta Fβ是基于查准率与查全率的加权调和平均定义的,可以表达出对于查准率/查全率的不同偏好:
1 F β = 1 1 + β 2 ∗ ( 1 P + β 2 R ) \frac{1}{F_\beta} = \frac{1}{1+\beta^2}*(\frac{1}{P}+\frac{\beta^2}{R}) Fβ1=1+β21∗(P1+Rβ2)
F 1 = ( 1 + β 2 ) ∗ P ∗ R ( β 2 ∗ P ) + R F1 = \frac{(1+\beta^2)*P*R}{(\beta^2*P)+R} F1=(β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时对查准率由更大影响。
很多时候,我们进行过多次训练/测试、在多个数据集上进行训练/测试或事执行多分类任务,生成了多个二分类混淆矩阵,我们希望在n个二分类混淆矩阵上综合考察查准率和查全率。
macro的做法是现在各混淆矩阵上分别计算查准率和查全率,记为 ( P 1 , R 1 ) , ( P 2 , R 2 ) , . . . , ( P n , R n ) (P_1,R_1),(P_2,R_2),...,(P_n,R_n) (P1,R1),(P2,R2),...,(Pn,Rn),在计算平均值,这样就得到宏查准率(macro- P)、宏查全率(macro-P)、宏F1(macro-F1):
m a c o r − P = 1 n ∑ i = 1 n P i macor-P = \frac{1}{n}\sum_{i=1}^{n}P_i macor−P=n1i=1∑nPi
m a c o r − R = 1 n ∑ i = 1 n R i macor-R = \frac{1}{n}\sum_{i=1}^{n}R_i macor−R=n1i=1∑nRi
m a c r o − F 1 = 2 ∗ m a c r o − P ∗ m a c r o − R m a c r o − P + m a c r o − R macro-F1 = \frac{2*macro-P*macro-R}{macro-P+macro-R} macro−F1=macro−P+macro−R2∗macro−P∗macro−R
micro的做法是将各混淆矩阵的对应元素进行平均,得到TP、FP、TN、FN的平均值,在基于这些平均值计算出微查准率(micro- P)、微查全率(micro-P)、微F1(micro-F1):
m i c r o − P = T P ‾ T P ‾ + F P ‾ micro-P = \frac{\overline{TP}}{\overline{TP}+\overline{FP}} micro−P=TP+FPTP
m i c r o − R = T P ‾ T P ‾ + F N ‾ micro-R = \frac{\overline{TP}}{\overline{TP}+\overline{FN}} micro−R=TP+FNTP
m a c r o − F 1 = 2 ∗ m a c r o − P ∗ m a c r o − R m a c r o − P + m a c r o − R macro-F1 = \frac{2*macro-P*macro-R}{macro-P+macro-R} macro−F1=macro−P+macro−R2∗macro−P∗macro−R
很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值则分为正类,否则为反类。实际上,我们可以根据这个概率预测结果,对测试样本进行排序, “最可能”是正例的排在前面,“最不可能”是正例的排在后面。这样,分类过程就相当于在这个排序中以某个“截断点(cut point)”将样本分为两部分,前一部分分为正例,后一部分分为反例。
如果我们更为关注正负类别判别的质量,这个阈值就可能不是0.5,那么这个阈值怎么取,就需要借助ROC曲线与AUC。
这里引入两个衡量正负类别判别质量的指标:真正例率(TPR)、假正例率(FPR)
Ture Positive Rate: T P R = T P T P + F N TPR = \frac{TP}{TP+FN} TPR=TP+FNTP
False Positive Rate: F P R = F P F P + T N FPR = \frac{FP}{FP+TN } FPR=FP+TNFP
ROC全称“受试者工作特征”,纵轴是“真正例率”,横轴是“假正例率”,ROC曲线如下图所示:
横轴和纵轴都是从0到1的,我们希望FPR尽可能的小,尽可能少的被误判,TPR尽可能的高,即找回尽可能多。所以理想状态ROC曲线应该是尽量向左上方偏斜。
而对角线则意味着一个随机变量的分类,即如果有一个随机判别为正类或者负类的判别器,就会沿着对角线走,在随机分类中,被正确分类的和被错误分类的比例相等,这样我们就需要确定一个阈值,让FPR尽可能小,让TPR尽可能大。而为了兼顾FPR与TPR,即尽量接近于拐点。
AUC的值就是处于ROC curve下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的performance。假定ROC曲线是由坐标为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) } \{(x_1,y_1),(x_2,y_2),...(x_m,y_m)\} { (x1,y1),(x2,y2),...(xm,ym)}的点按序连接而形成,则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)
形式化地看,AUC考虑点是样本预测的排序质量,因此它与排序误差有紧密联系。给定 m + m^+ m+个正例和 m − m^- m−个反例,令 D + D^+ D+和 D − D^- D−分别表示正、反例集合,则排序损失定义为:
l r a n k = 1 m + m − ∑ x + ∈ D + ∑ x − ∈ D − ( I ( f ( x + ) < f ( x − ) ) + 1 2 I ( f ( x + ) = f ( x − ) ) ) l_{rank} = \frac{1}{m^+m^-}\sum_{x^+\in D^+}\sum_{x^-\in D^-}(I(f(x^+)
考虑每一对正反例,若正例预测值小于反例,则记一个罚分,若相等,则记0.5个罚分。容易看出, l r a n k l_{rank} lrank对应的是ROC曲线之上的面积,因此有
A U C = 1 − l r a n k AUC = 1-l_{rank} AUC=1−lrank
上面的方法中,将学习器的犯错同等对待,但在现实生活中,将正例预测成假例与将假例预测成正例的代价常常是不一样的,因此为了权衡不同类型错误所造成的不同损失,可以为错误赋予“非均等代价”
一般来说, c o s t i i = 0 cost_{ii}=0 costii=0;若将第0类判别为第1类所造成的损失更大,则 c o s t 01 > c o s t 10 cost_{01}>cost_{10} cost01>cost10;损失程度相差越大, c o s t 01 cost_{01} cost01与 c o s t 10 cost_{10} cost10值的差别越大。
令 D + D^+ D+和 D − D^- D−分别表示正、反例集合,则**“代价敏感”错误率**:
E ( f ; D ; c o s t ) = 1 m ( ∑ x i ∈ D + I ( f ( x i ) ≠ y i ) × c o s t 01 + ∑ x i ∈ D − I ( f ( x i ) ≠ y i ) × c o s t 10 ) E(f;D;cost)=\frac{1}{m}(\sum_{x_i\in D^+}I(f(x_i)\not=y_i)\times cost_{01}+\sum_{x_i\in D^-}I(f(x_i)\not=y_i)\times cost_{10}) E(f;D;cost)=m1(xi∈D+∑I(f(xi)=yi)×cost01+xi∈D−∑I(f(xi)=yi)×cost10)
在非均等代价下,ROC曲线不能直接反映出机器学习的期望总体代价,而“代价曲线”则可以达到该目的, p p p是样例为正例的概率
代价曲线图的横轴是取值为 [ 0 , 1 ] [0,1] [0,1]的正例概率代价
P ( + ) c o s t = p × c o s t 01 p × c o s t 01 + ( 1 − p ) × c o s t 01 P(+)cost = \frac{p \times cost_{01}}{p \times cost_{01}+(1-p)\times cost_{01}} P(+)cost=p×cost01+(1−p)×cost01p×cost01
纵轴是取值为 [ 0 , 1 ] [0,1] [0,1]的归一化代价
c o s t n o r m = F N R × p × c o s t 01 + F P R × ( 1 − p ) × c o s t 10 p × c o s t 01 + ( 1 − p ) × c o s t 01 cost_{norm} = \frac{FNR\times p \times cost_{01}+FPR\times (1-p)\times cost_{10}}{p \times cost_{01}+(1-p)\times cost_{01}} costnorm=p×cost01+(1−p)×cost01FNR×p×cost01+FPR×(1−p)×cost10
其中FPR是假正例率,而 F N R = 1 − T P R FNR = 1-TPR FNR=1−TPR是假反例率。
代价曲线的绘制很简单:设ROC曲线上一点的坐标为(TPR,FPR) ,则可相应计算出FNR,然后在代价平面上绘制一条从(0,FPR) 到(1,FNR) 的线段,线段下的面积即表示了该条件下的期望总体代价;如此将ROC 曲线土的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价,如图所示:
我们常用ACC准确率来判断分类器分类结果的好坏,既然有了ACC为什么还需要ROC和PR呢,很重要的一个因素是实际的样本数据集中经常会出现数据偏斜的情况,要么负类样本数大于正类样本数,要么正类样本数大于负类样本数。
比如说我负类样本数有9,000个,正类样本数有100个,如果阈值选得过高,正类样本都判断为负类,同样负类样本都判定为负类,那么准确率90%,看起来还不错,但是如果考虑ROC中的TPR和FPR的话就会知道,此时的TPR=0,FPR=0,也就是误纳率是0,但是误拒率是100%,是左下角的点,并不是很好的一个点,而原来的ACC就不具有代表性。
ROC曲线和PR曲线都能用于评价分类器的效果,并且还可以缓解数据偏斜带来的模型评价不准确的问题。但是由于两者的计算方式(or 重点 or 思路)不同,运用场景也会有所区别。
ROC:分别用正类总数目与负类总数目去‘归一化’TP和FP,当数据集的分布改变时,ROC曲线不会跟着剧烈改变,比较稳定,着重于考察模型的排序能力,能用于评估分类器的整体性能。
PR:相比而言PR曲线完全聚焦于正例,当我关心模型在特定数据分布上的预测效果,并且只关心precision 和 recall时,PR可以更精确地选出此场景下需要的模型。