机器学习手札:模型评估

机器学习手札:模型评估

Author:雾雨霜星

Time:2021-09-15
我的网站:雾雨霜星

误差指标

  • 经验误差:模型在训练样本集上得到的误差
  • 泛化误差:模型在未参与训练的样本集上得到的误差

模型的验证方法

留出法(hold-out):

将数据集划分为两个互斥集合,其中一个为训练集,另一个为测试集。

分层采样:按照数据集原有的数据分布模式(类别比例)进行采样,来划分训练集和测试集。

交叉验证法(cross validation):

使用分层采样的方法,将数据集划分为k个互斥子集,每次使用k-1个子集作为并集进行训练,余下的子集用于测试。

由此需要进行k此训练/验证,得到k组结果,最终评估效果为k个模型测试结果的均值。

自助法(bootstrapping):

对于带有m个数据的数据集D,每次随机选择一个放入初始空数据集Dt,进行m次后得到一个与训练集大小相同的"拷贝"数据集。

显然,数据集D中的样本部分将会在数据集Dt中多次出现,部分则不会出现。

一般使用数据集Dt进行训练,使用数据集D\Dt进行测试,这种方法称为"外包估计"

缺点:改变了初始数据集的分布,引入估计偏差。

模型的性能度量

精度与错误率

  • 精度:
    a c c ( f ; D ) = 1 N ∑ i = 1 N [ f ( x i ) = y i ] acc(f;D)=\frac{1}{N}\sum_{i=1}^{N}[f(x_i)=y_i] acc(f;D)=N1i=1N[f(xi)=yi]

  • 错误率:
    e r r ( f ; D ) = 1 N ∑ i = 1 N [ f ( x i ) ≠ y i ] err(f;D)=\frac{1}{N}\sum_{i=1}^{N}[f(x_i)\neq y_i] err(f;D)=N1i=1N[f(xi)=yi]

查准率与查全率

查准率/查全率:

  • 查准率(precision):检测到的所有正例中正确的数量所在比例,又称"精准率"。
  • 查全率(recall):实际所有正例中被检测出来的正确正例数量所占比例,又称"召回率"。

P-R曲线:即查全率为横坐标,查准率为纵坐标的曲线。

若一个模型的P-R曲线被另一个模型的P-R曲线完全包住,则可以断言,后一个模型的性能更好。

ROC曲线

  • ROC:受试工作者特征曲线,纵轴为真正例率(TPR),横轴为假正例率(FRP)。

  • AUC:Area Under ROC curve,ROC曲线下的面积

  • TPR:即查全率;

  • FRP:实际所有反例中被被模型标记为正例的数量所占比例。

  • ROC使用对象:分类任务中进行使用。

  • ROC在多分类任务中的使用:

    在多分类任务中,每种类别可以得到一条ROC曲线,最终的ROC曲线是所有ROC曲线的平均。

ROC曲线的绘制

将样本按照模型计算赋予的分数排序,按样本顺序来绘制曲线的点。

假设样本实际上共有m1个正例,m2个假例。(标签标记的,而非模型统计的)

从(0,0)开始,依次将每个样本划分为正例。上一个点为(x,y)下。若当前为真正例,对应坐标为(x,y+1/m1);若为假正例,则对应坐标为(x+1/m2,y)。

AUC的估计

若 R O C 曲 线 坐 标 为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , . . . } , 估 算 A U C 如 下 : A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ⋅ ( y i + y i + 1 ) ) 若ROC曲线坐标为\{(x_1,y_1),(x_2,y_2),(x_3,y_3),...\},估算AUC如下:\\ AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\cdot (y_i+y_{i+1})) ROC线{(x1,y1),(x2,y2),(x3,y3),...},AUC:AUC=21i=1m1(xi+1xi)(yi+yi+1))

假设检验

意义:进行机器学习模型的性能比较,基于假设检验下,若测试集上观察到学习器A比学习器B好,则A的泛化性能是否优于B,以及该结论的把握有多大。

ML Hypothesis Test:假设学习器的泛化错误率符合某种分布或某个结论,根据测试错误率进行推导得到泛化错误率。

置信度

又称置信水平,表示准确值落在这个区间的概率。

二项检验

适用对象:采用"留出法"对模型进行性能检验的状况

假设:每次数据都是独立采样获得的,泛化错误率是二分类任务中分类错误的样本所占总样本数的比例。即每一个样本在模型的计算下相当于一次试验,而这个试验分为成功和失败两种状况。对于泛化错误率而言,试验成功就是模型分了错误的状况。

二项分布函数式:
n 次 试 验 中 正 好 得 到 k 次 成 功 的 概 率 : P { X = k } = C k n p k ( 1 − p ) n − k 二 项 式 系 数 : C k n = n ! k ! ( n − k ) ! n次试验中正好得到k次成功的概率: P\{ X=k \}=C_{k}^{n}p^k(1-p)^{n-k}\\ 二项式系数:C_{k}^{n}=\frac{n!}{k!(n-k)!} nk:P{X=k}=Cknpk(1p)nkCkn=k!(nk)!n!
在如下假设下,总共m个样本的数据集上,若泛化错误率为ψ,得到测试错误率为ψt的概率为:
P ( ψ , ψ t ) = C ψ t ⋅ m m ψ ψ t ⋅ m ( 1 − ψ ) m − ψ t ⋅ m P(\psi,\psi_t)=C_{\psi_t\cdot m}^{m}\psi^{\psi_t\cdot m}(1-\psi)^{m-\psi_t\cdot m} P(ψ,ψt)=Cψtmmψψtm(1ψ)mψtm
本质就是一个二项试验,m次试验中,发生模型分类错误事件的次数k为ψt*m次的概率。

对 “泛化错误率ψ < ψ0” 结论的检验

条件:样本总数为m,结论的置信度为1-α(常用α=0.05/0.1),假设泛化错误率不大于ψ0。

计算临界值:
临 界 值 : ψ c = m i n   ψ s . t .   ∑ i = ψ 0 × m + 1 m C i m ψ i ( 1 − ψ ) m − i < α 临界值:\psi_c=min\ \psi \quad s.t.\ \sum_{i=\psi_0\times m+1}^{m}C_i^m\psi^i(1-\psi)^{m-i}<\alpha ψc=min ψs.t. i=ψ0×m+1mCimψi(1ψ)mi<α
若此时样本的测试错误率ψt小于临界值ψc,则:

在α的显著度下,假设ψ<ψ0不能被拒绝。即可以1-α的置信度认为,学习器的泛化错误率不大于ψ0。

t检验

适用对象:采用"交叉验证法"对模型进行性能检验的状况

  • t分布:

    样本数较小时估计呈正态分布且方差未知的总体的均值。

    构成t分布的样本,一般就是符合正态分布的数据总体的其中一部分。因为不清楚全部数据总体,因而无法得到总体均值,无法给出明确的标准正态分布,就使用了已知数据的样本均值代替之,从而得到t分布。

    t分布曲线是曲线族,随着样本数的改变,其分布曲线也会变化。

  • t分布函数:
    定 义 : X ∼ N ( 0 , 1 ) , Y ∼ χ 2 ( n ) , 则 τ = X Y / n ∼ t ( n ) 定义:X\sim N(0,1),Y\sim \chi^2(n),则\tau=\frac{X}{\sqrt{Y/n}}\sim t(n)\\ :XN(0,1),Yχ2(n),τ=Y/n Xt(n)
    原理:根据中心极限定理,通过抽样模拟试验表明,在正态分布总体中以固定n抽取若干个样本时,样本均数的分布仍服从正态分布,所以对样本均数的分布进行u变换,也可变换为标准正态分布N (0,1)。

    t分布_百度百科 (baidu.com)

    推导如下:
    设 X ∼ N ( μ , σ 2 ) , { X 1 , X 2 , . . . , X k } 是 来 源 于 X 的 部 分 样 本 样 本 均 值 μ s = 1 k ∑ i = 1 k X i 样 本 方 差 σ s 2 = 1 k − 1 ∑ i = 1 k ( X i − μ s ) 2 μ s ∼ N ( μ , σ 2 / k ) X ′ = μ s − μ σ / k ∼ N ( 0 , 1 ) Y = ( k − 1 ) σ s 2 σ 2 ∼ χ 2 ( k − 1 ) τ = X ′ Y / ( k − 1 ) = X ′ ( σ s / σ ) = k ( μ s − μ ) σ s ∼ t ( k − 1 ) 设X\sim N(\mu,\sigma^2),\{X_1,X_2,...,X_k\}是来源于X的部分样本\\ 样本均值\mu_s=\frac{1}{k}\sum_{i=1}^{k}X_i\quad样本方差\sigma_s^2=\frac{1}{k-1}\sum_{i=1}^{k}(X_i-\mu_s)^2\\ \mu_s \sim N(\mu,\sigma^2/k)\\ X'=\frac{\mu_s-\mu}{\sigma/\sqrt{k}}\sim N(0,1)\quad Y=\frac{(k-1)\sigma_s^2}{\sigma^2}\sim \chi^2(k-1)\\ \tau=\frac{X'}{\sqrt{Y/(k-1)}}=\frac{X'}{(\sigma_s/\sigma)}=\frac{\sqrt{k}(\mu_s-\mu)}{\sigma_s}\sim t(k-1)\\ XN(μ,σ2),{X1,X2,...,Xk}Xμs=k1i=1kXiσs2=k11i=1k(Xiμs)2μsN(μ,σ2/k)X=σ/k μsμN(0,1)Y=σ2(k1)σs2χ2(k1)τ=Y/(k1) X=(σs/σ)X=σsk (μsμ)t(k1)
    注意到,在最后使用了样本均值代替总体均值,样本方差代替了总体方差。

    关于t分布的证明 - 可爱的熊乖乖 - 博客园 (cnblogs.com)

对"泛化错误率ψ=ψ0"结论的检验

假设:泛化错误率ψ=ψ0

假设:所有交叉验证所得的测试错误率数据总体符合正态分布

由泛化错误率ψ=ψ0,则可得到:
k 次 交 叉 验 证 得 到 k 个 测 试 错 误 率 : { ψ 1 , ψ 2 , ψ 3 , . . . , ψ k } , μ = 1 k ∑ i = 1 k ψ i σ 2 = 1 k − 1 ∑ i = 1 k ( ψ i − μ ) 2 τ = k ( μ − ψ 0 ) σ ∼ t ( k − 1 ) k次交叉验证得到k个测试错误率:\{ \psi_1,\psi_2,\psi_3,...,\psi_k \},\\ \mu=\frac{1}{k}\sum_{i=1}^{k}\psi_i\\ \sigma^2=\frac{1}{k-1}\sum_{i=1}^{k}(\psi_i-\mu)^2\\ \tau=\frac{\sqrt{k}(\mu-\psi_0)}{\sigma}\sim t(k-1)\\ kk:{ψ1,ψ2,ψ3,...,ψk},μ=k1i=1kψiσ2=k11i=1k(ψiμ)2τ=σk (μψ0)t(k1)
计算得到τ后,查表得到相应显著度α下的t分布曲线双边临界值t(-α/2)与t(α/2),如果τ位于[t(-α/2), t(α/2)]区间内,则不能拒绝假设"ψ=ψ0"。即可认为泛化错误率为ψ0,置信度为1-α。

交叉验证成对t检验

对于两个学习器,在相同的第i折训练与验证中得到测试错误率ψai,ψbi。则有:
k 次 交 叉 验 证 训 练 的 测 试 错 误 率 : { ψ 1 A , ψ 2 A , ψ 3 A , . . . , ψ k A } , { ψ 1 B , ψ 2 B , ψ 3 B . . . , ψ k B } 令 Δ i = ψ i A − ψ i B , 则 有 Δ = { Δ 1 , Δ 2 , Δ 3 , . . . , Δ k } μ 为 Δ 均 值 , σ 为 Δ 方 差 i f τ = ∣ k   μ σ ∣ < t α / 2 , k − 1 则 假 设 不 可 被 拒 绝 t α / 2 , k − 1 是 自 由 度 为 k − 1 的 t 分 布 上 尾 部 累 计 分 布 为 α / 2 的 临 界 值 k次交叉验证训练的测试错误率:\{\psi^A_1,\psi^A_2,\psi^A_3,...,\psi^A_k\},\{\psi^B_1,\psi^B_2,\psi^B_3...,\psi^B_k\}\\ 令\Delta_i=\psi^A_i-\psi^B_i,则有\Delta=\{\Delta_1,\Delta_2,\Delta_3,...,\Delta_k\}\\ \mu为\Delta均值,\sigma为\Delta方差\\ if\quad\tau=|\frac{\sqrt{k}\ \mu}{\sigma}|<t_{\alpha/2,k-1} \quad 则假设不可被拒绝\\ t_{\alpha/2,k-1}是自由度为k-1的t分布上尾部累计分布为α/2的临界值 k:{ψ1A,ψ2A,ψ3A,...,ψkA},{ψ1B,ψ2B,ψ3B...,ψkB}Δi=ψiAψiB,Δ={Δ1,Δ2,Δ3,...,Δk}μΔ,σΔifτ=σk  μ<tα/2,k1tα/2,k1k1tα/2
通常采用的是"5×2交叉验证"法

McNemar检验

适用对象:用于比较两个学习器性能的假设检验方法。

首先建立"列联表",即使用算法A和使用算法B下,得到的正确和错误的数量。

e11:算法A和算法B分类均正确的数量;e01:算法A分类错误而算法B分类正确的数量;

e10:算法A分类正确而算法B分类错误的数量;e11:算法A和算法B分类均错误的数量;

假设:两个学习器的性能相同。则|e01-e10|应服从正态分布。

由此计算下式:
τ = ( ∣ e 01 − e 10 ∣ − 1 ) 2 e 01 + e 10 ∼ χ ( 1 ) \tau=\frac{(|e01-e10|-1)^2}{e01+e10} \sim \chi(1) τ=e01+e10(e01e101)2χ(1)
对于给定的显著度α,当以上变量值小于临界值X(α),不能拒绝假设,即认为两学习器性能没有显著差异。否则拒绝假设,此时平均错误率较小的学习器性能较好。

自由度为1的卡西检验临界值:α=0.05,X(α)=3.8415;α=0.1,X(α)=2.7055。

McNemar检验应用实例:McNemar’s检验(配对卡方检验)(qq.com)

Friedman检验

适用对象:多个算法在一个或多个数据集上性能比较

在多个数据集上对多个算法进行比较:

  1. 每个数据集上进行训练和验证,按照测试性能的好坏对各个算法进行排序

  2. 计算F变量:
    在 N 个 数 据 集 上 比 较 k 个 算 法 , r i 表 示 第 i 个 算 法 法 平 均 值 χ = 12 N k ( k + 1 ) ( ∑ i = 1 k r i 2 − k ( k + 1 ) 2 4 ) F = ( N − 1 ) χ N ( k − 1 ) − χ 在N个数据集上比较k个算法,r_i表示第i个算法法平均值\\ \chi=\frac{12N}{k(k+1)}(\sum_{i=1}^{k}r_i^2-\frac{k(k+1)^2}{4})\\ F=\frac{(N-1)\chi}{N(k-1)-\chi} Nkriiχ=k(k+1)12N(i=1kri24k(k+1)2)F=N(k1)χ(N1)χ
    F变量服从自由度为k-1和(k-1)(N-1)的F分布

  3. 比较曲线临界值

    这部分我也还不清楚该怎么做。。。。。所以先空着吧。

Nemenyi检验

在上述对多个算法进行性能比较时,如果"所有算法的性能相同"假设被拒绝时,则此时使用该检验进行后续检验。

转载请注明出处:雾雨霜星

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是关于Python函数第二次运行报错和retry的简单用法。 首先,如果一个Python函数在第二次运行时出现了错误,可能是由于函数内部的变量状态发生了变化,导致程序出错。为了解决这个问题,可以使用retry功能来多次尝试运行该函数,直到它成功为止。 使用retry功能可以在函数出现错误时自动重试,可以避免手动重复运行该函数,从而提高效率。 下面是一个简单的示例代码,演示了如何使用retry功能: ```python import time from retry import retry @retry(delay=1, backoff=2, max_delay=4) def my_func(): print("Running my_func...") # 模拟函数出错 if time.time() % 2 == 0: raise ValueError("Oops! Something went wrong...") else: print("Success!") my_func() ``` 在这个示例代码中,我们使用了retry库中的retry装饰器来装饰my_func函数,该函数会运行多次,直到成功为止。在retry装饰器中,我们设置了最大延迟时间为4秒,每次重试前等待1秒,重试间隔时间呈指数级增长,即第一次重试后等待1秒,第二次重试后等待2秒,第三次重试后等待4秒,以此类推,直到达到最大延迟时间为止。 当my_func函数第一次运行时,它会输出“Running my_func...”和“Success!”,并正常结束。当函数第二次运行时,它会抛出一个ValueError异常,并重试多次,直到成功为止。 希望这个简单的示例可以帮助你理解如何使用retry功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值