机器学习-模型评估与选择(1)

一、经验误差与过拟合

  1. 错误率与精度
  • 错误率(error rate):分类错误的样本数占样本总数的比例,即如果在mm个样本中有aa个样本分类错误,则错误率为E=amE = \frac {a}{m}
  • 精度(accuracy):1am1-\frac {a}{m},即精度=1-错误率

  1. 误差(error)

定义:学习器的实际预测输出与样本的真实输出之间的差异

  • 训练误差(training error)或经验误差(empirical error):学习器在训练集上的误差
  • 泛化误差(generalization error):在新样本上的误差

  1. 过拟合与欠拟合
  • 过拟合(overfitting):当学习器把训练样本学得“太好”了的时候,很可能已经把训练样本自身的一些特点当作所有潜在样本都会具有的一般性质,这样会导致泛化性能下降。
    PS:很多因素可能导致过拟合,最常见的情况是由于学习能力过于强大,过拟合是无法彻底避免的,只能缓解或者说减少其风险
  • 欠拟合(underfitting):对训练样本的一般性质尚未学好,由学习能力低下造成的

二、评估方法

通常,可通过实验测试来对学习器的泛化误差进行评估并进而做出选择。为此,需使用一个测试集来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”作为泛化误差的近似。通常,假设测试样本也是从样本真实分布中独立同分布采样而得。需注意的是,测试集应该尽可能与训练集互斥,即测试样本尽量不在训练集中出现、未在训练过程中使用过。



只有一个包含mm个样例的数据集D={(x1,y1),(x2,y2),,(xm,ym)}D=\{(x_1,y_1),(x_2,y_2),\ldots,(x_m,y_m)\},既要训练,又要测试,就需要对DD进行适当的处理,从中产生出训练集SS和训练集TT.以下为几种常见的做法.


2.1 留出法(hold-out)

直接将数据集DD划分为两个互斥的集合,其中一个集合作为训练集SS,另一个作为测试集TT,即D=ST,ST=D = S \cup T, S \cap T = \varnothing. 在SS上训练出模型后,用TT来评估其测试误差,作为对泛化误差的估计。

注意:
① 训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。例如在分类任务中至少要保持样本的类别比例相似.如果从采样(sampling)的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为“分层采样”(stratified sampling)
② 即便在给定训练/测试集的样本比例后,仍存在多种划分方式对初始数据集DD进行分割。这些不同的划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差别。因此,单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复实验评估后取平均值作为留出法的评估结果。


缺点:
我们希望评估的是用DD训练出的模型的性能,但留出法需划分训练/测试集,会导致一个窘境:令训练集SS包含绝大多数样本,则训练出的模型可能更接近于用DD训练出的模型,但由于TT比较小,评估结果可能不够稳定准确;若令测试集TT多包含一些样本,则训练集SSDD差别更大了,被评估的模型与用DD训练出的模型相比可能有较大差别,从而降低了评估结果的保真性(fidelity).

这个问题没有完美的解决方案,常见做法是将大约23\frac {2}{3} ~ 45\frac {4}{5}的样本用于训练,剩下样本用于测试

2.2 交叉验证法(cross validation)

先将数据集DD划分为kk个大小相似的互斥子集,即D=D1D2Dk,DiDj=(ij)D = D_1 \cup D_2 \cup \ldots \cup D_k, D_i \cap D_j = \varnothing(i \neq j). 每个子集DiD_i都尽可能保持数据分布的一致性,即从DD中通过分层采样得到。然后,每次用k1k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得kk组训练/测试集,从而可进行kk次训练和测试,最终返回的是这kk个测试结果的均值。

  • 显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于kk的取值,为强调这点,通常把交叉验证法称为“kk折交叉验证(kk-fold cross validation)”
  • kk最常用的取值为10;其他常用的取值有5,20等

与留出法相似,将数据集DD划分为kk个子集同样存在多种划分方式。为减少因样本划分不同而引入的差别,kk折交叉验证通常要随机使用不同的划分重复pp次,最终的评估结果是这ppkk折交叉验证结果的均值,例如常见的有“10次10折交叉验证”。


留一法(Leave-One-Out,简称LOO):

交叉验证的一个特例。假定数据集DD中包含mm个样本,令k=mk=m.

  • 留一法不受随机样本划分方式的影响,因为mm个样本只有唯一的方式划分为mm个子集--每个子集包含一个样本
  • 留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的DD训练出的模型很相似。

优缺点:

  • 优点:留一法的评估结果往往被认为比较准确
  • 缺点:
    • 在数据集比较大时,训练mm个模型的计算开销可能是难以忍受的
    • 留一法的估计结果也未必永远比其他评估方法准确,"没有免费的午餐"定理对实验评估方法同样适用

2.3 自助法(bootstrapping)

我们希望评估的是用DD训练出的模型,但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比DD小,这必然会引入一些因训练样本规模不同而导致的估计误差。而留一法虽受训练样本规模变化的影响较小,但计算复杂度太高了。"自助法"是一个较好的解决方案。

定义:

  • 以自助采样法(也称可重复采样或有放回采样)为基础
  • 给定包含mm个样本的数据集DD,对它进行采样产生数据集DD':每次随机从DD中挑选一个样本,将其拷贝放入DD',然后再将该样本放回初始数据集DD中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行mm次后,就得到了包含mm个样本的数据集DD',这就是自助采样的结果。
  • 显然,DD中有一部分样本会在DD'中多次出现,而另一部分样本不出现。样本在mm次采样中始终不被采到的概率是(11m)m(1-\frac {1}{m})^m,取极限得到m(11m)m=1e0.368\lim_{m \to \infty} (1-\frac{1}{m})^m = \frac{1}{e}\approx0.368.即通过自助采样,初始数据集DD中约有36.8%36.8\%的样本未出现在采样数据集DD'中,于是将DD'用作训练集,D\DD\backslash D'用作测试集

包外估计(out-of-bag estimate)

实际评估的模型与期望评估的模型都使用mm个训练样本,而仍有数据总量约13\frac {1}{3}的、没在训练集中出现的样本用于测试,这样的测试结果被称为"包外估计"

优缺点:

  • 优点:
    • 在数据集较小、难以有效划分训练/测试集时很有用
    • 自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处
  • 缺点:
    • 自助法产生的数据集改变了初始数据集的分布,会引入估计偏差,因此在初始数据量足够时,留出法和交叉验证法更常用一些

2.4 调参与最终模型


参数调节(简称调参(parameter tuning))

大多数学习算法都有些参数需要设定,参数配置不同,学得模型的性能往往有显著差别。因此,在进行模型评估与选择,还需对算法参数进行设定。

  • 调参和算法的选择类似:对每种参数配置都训练出模型,然后把对应最好的模型的参数作为结果
  • 注意:学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型是不可行的。现实中常用做法,是对每个参数选定一个范围和变化步长。显然,这样选定的参数值往往不是"最佳"值,但这是在计算开销和性能估计之间进行折中的结果,通过这个折中,学习过程才变得可行。事实上,即便在进行这样的折中之后,调参依然很困难。很多强大的学习算法有不少参数需设定,这将导致极大的调参工程量,以至于在不少应用任务中,参数调得好不好往往对最终模型性能有关键性影响

最终模型

给定包含mm个样本的数据集DD,在模型评估与选择过程中由于需要留出一部分数据进行评估测试,事实上只用了一部分数据训练模型。因此,在模型选择完成后,学习算法和参数配置已选定,此时应该用数据集DD重新训练模型。这个模型在训练过程中使用了所有mm个样本,这才是最终提交给用户的模型

  • 注意:通常把学得模型在实际使用中遇到的数据称为测试集,为了加以区分,模型评估与选择中用于评估测试的数据集常称为"验证集"(validation set)

在研究对比不同算法的泛化性能时,用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参

全部评论

相关推荐

1. 自我介绍2. 项目都是自己写的吗?3. 我看你用 koa2 写后端,为什么选择它,能讲讲吗?4. 那你提到 koa2 它是不提供中间件的,你是怎么解决的?5. 中间件的原理是什么?(洋葱模型)6. 你刚刚说碰到 next() 就进入下一个中间件,那 next 只能执行同步,如果是异步的话,你是怎么处理的?(async/await,但是我发现,有的中间件需要在异步中间件之前执行,所以我用 try/catch 来处理异步中间件的异常)7. JS 异步发展史,以及它们的优缺点说一下 (回调函数--Promise--Generator--async/await)8. 你刚刚说 Promise 状态不能更改,那如果我要设计一个能修改 Promise 状态的函数,你会怎么设计?9. CSS 水平垂直居中的方法(flex、grid、绝对定位 + margin:auto、绝对定位 + 负 margin、绝对定位 + transform、table-cell)10. 你刚刚说到 flex 布局,那 flex:1 是什么意思?(flex: flex-grow  flex-shrink  flex-basis;等价 flex:1 1 0%表示元素可以均分剩余空间,可拉伸、可压缩,不依赖内容宽度,自动自适应填充布局。)11. 父容器宽是 500px,然后它左右各有两个子容器是 100px,如果设置 flex: 1,那它的宽度是多少?(500-100-100=300px)12. 说说你对浏览器缓存的理解(强缓存、协商缓存)13. 如果一个用户,他怎么去刷新都无法刷到最新版的代码,你能说下可能的原因吗?(版本号、hash等)还有吗?(我说我不知道了,面试官说还有 CDN 没有同步,我说企业才会这么干,自己写项目一般不会,我知道 cdn 是用来解决高并发的手段)14. React你熟吗?说下 React 函数组件和类组件的区别15. 怎么避免 Hooks 导致组件重新渲染?(使用 useCallback、useMemo、React.memo、useRef等等)16. 谈一下我对 React 的状态管理的理解(Redux、Mobx、Zustand,我说 Zustand 用的最多)17. React 常见的 hooks 有哪些?(useState、useEffect、useRef、useCallback、useMemo、useReducer、useContext、useImperativeHandle、useLayoutEffect、useDebugValue)18. TS 你熟吗?我们引进 TS 的目的是为什么?19. interface 和 type 的区别20. 说下 TS 里的泛型21. 我现在有十个字段,比如十个字段就要 A B C D E F G 这种。那我现在另有另外一个方法,这个方法接受的参数呢,必须是这个 interface A 里面的这个 K。就比如说你可以是 A B C 可以 A B C D 任何组合都可以,但是必须是这个 interface 里面的 A 里面的定义的。这个 K 这种类型的话是怎么去定义呢?(说实话我有点不太理解啥意思,反正我说了 keyof)``` TypeScriptinterface Obj {A: stringB: stringC: stringD: stringE: string// 其他字段...}```22. vite 用过吗?说说和 webpack 的区别。vite 的优缺点是什么23. 说说 Tree shaking(树摇) 和 Code Splitting (代码分割)的区别24. Git 你熟吗?说说 git merge 和 git rebase 的区别,什么时候用 git merge,什么时候用 git rebase?25. web3 你熟吗?(不太熟,听说过而已)26. 我看你自我介绍说了 AI,你是怎么用的?27. 除了提示词,还有什么能让 AI 更聪明?28. AI 的优缺点你说一下29. AI 发展这么快,你觉得我们以后会扮演什么角色?30. 反问基本都答上来了。面了我80分钟,我还以为稳过的
查看29道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务