【机器学习】模型评估与选择(留出法、交叉验证法、查全率、查准率、偏差、方差)

本文深入探讨了机器学习中的过拟合现象,介绍了留出法、交叉验证等评估方法,并讨论了查准率、查全率及F1值等性能度量。此外,还解析了泛化误差、偏差、方差和噪声的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其他机器学习系列文章见于专题:机器学习进阶之路——学习笔记整理,欢迎大家关注。

1. 过拟合

  过拟合是指学习模型对训练样本预测得很好,但对新样本预测很差的现象。这通常是由于学习模型能力过于强大,以至于把训练样本自身的一些特点当做了一般性质。

  过拟合是无法彻底避免的,只能缓解。模型选择就是要旨在避免过拟合并提高模型的预测能力。

2. 评估方法

  通常用测试误差来近似模型的泛化误差。下面介绍几种常用的评估方法:

2.1 留出法(hold-out)

  留出法直接将数据集 D D D划分为两个互斥的部分,其中一部分作为训练集 S S S,另一部分用作测试集 T T T

  通常训练集和测试集的比例为70%:30%。同时,训练集测试集的划分有两个注意事项:

    1. 尽可能保持数据分布的一致性。避免因数据划分过程引入的额外偏差而对最终结果产生影响。在分类任务中,保留类别比例的采样方法称为“分层采样”(stratified sampling)。

    2. 采用若干次随机划分避免单次使用留出法的不稳定性。

2.2 交叉验证法(cross validation)

  交叉验证法先将数据集 D D D划分为 k k k个大小相似的互斥子集,每次采用 k − 1 k-1 k1个子集的并集作为训练集,剩下的那个子集作为测试集。进行 k k k次训练和测试,最终返回 k k k个测试结果的均值。又称为“ k k k折交叉验证”(k-fold cross validation)。

图1:10折交叉验证示意图

  为减少因样本划分带来的偏差,通常重复 p p p次不同的划分,最终结果是 p p p k k k折交叉验证结果的均值。

2.3 留一法(leave-one-out,LOO)

  留一法是 k k k折交叉验证 k = m k=m k=m m m m为样本数)时候的特殊情况。即每次只用一个样本作测试集。该方法计算开销较大。

2.4 自助法(bootstrapping)

  自助法以自助采样为基础(有放回采样)。每次随机从 D D D中挑选一个样本,放入 D ′ D' D中,然后将样本放回 D D D中,重复 m m m次之后,得到了包含 m m m个样本的数据集。

  样本在 m m m次采样中始终不被采到的概率是 ( 1 − 1 m ) m \left( 1 - \frac { 1 } { m } \right) ^ { m } (1m1)m,取极限得到 lim ⁡ m → ∞ ( 1 − 1 m ) m = 1 e = 0.368 \lim _ { m \rightarrow \infty } \left( 1 - \frac { 1 } { m } \right) ^ { m } = \frac { 1 } { e } = 0.368 limm(1m1)m=e1=0.368。即 D D D中约有36.8%的样本未出现在 D ′ D' D中。于是将 D ′ D' D用作训练集, D \ D ′ D \backslash D ^ { \prime } D\D用作测试集。这样,仍然使用 m m m个训练样本,但约有1/3未出现在训练集中的样本被用作测试集。

  优点:自助法在数据集较小、难以有效划分训练/测试集时很有用。

  缺点:然而自助法改变了初始数据集的分布,这回引入估计偏差。

3. 性能度量

  二分类问题常用的评价指标时查准率和查全率。

  根据预测正确与否,将样例分为以下四种:

    TP(True positive,真正例)——将正类预测为正类数。

    FP(False postive,假正例)——将反类预测为正类数。

    TN(True negative,真反例)——将反类预测为反类数。

    FN(False negative,假反例)——将正类预测为反类数。

  (1)查准率(precision,精确率):

P = T P T P + F P P = \frac { T P } { T P + F P } P=TP+FPTP

    即将正类预测为正类数与预测为正类的总数的比值。

  (2)查全率(recall,召回率)

R = T P T P + F N R = \frac { T P } { T P + F N } R=TP+FNTP

    即将正类预测为正类数与正类总数的比值。

  查准率和查全率是一对矛盾的度量。是查准率和查全率的调和平均:

1 F 1 = 1 2 ( 1 P + 1 R ) \frac { 1 } { F _ { 1 } } = \frac { 1 } { 2 } \left( \frac { 1 } { P } + \frac { 1 } { R } \right) F11=21(P1+R1)

F 1 = 2 P R P + R F _ { 1 } = \frac { 2 P R } { P + R } F1=P+R2PR

  当查重率和查准率都高时, F 1 F_1 F1也会高。

4. 泛化能力

  泛化误差(Generalization error)是学得的模型 f ^ \widehat { f } f 对未知数据预测的误差。

  对测试样本 x x x,令 y D y _ { D } yD x x x在数据集中的标记, y y y x x x的真实标记, f ( x ; D ) f ( x ; D ) f(x;D)为训练集 D D D上学得的模型 f f f x x x上的预测输出。

  学习算法的期望输出是:

f ‾ ( x ) = E D [ f ( x ; D ) ] \overline { f } ( x ) = \mathrm { E } _ { D } [ f ( x ; D ) ] f(x)=ED[f(x;D)]

  偏差是期望输出与真实标记之间的差别:

bias ⁡ 2 ( x ) = ( f ‾ ( x ) − y ) 2 \operatorname { bias } ^ { 2 } ( x ) = ( \overline { f } ( x ) - y ) ^ { 2 } bias2(x)=(f(x)y)2

  方差是预测值与期望输出之间的方差:

var ⁡ ( x ) = E D [ ( f ( x ; D ) − f ‾ ( x ) ) 2 ] \operatorname { var } ( x ) = \mathrm { E } _ { D } \left[ ( f ( x ; D ) - \overline { f } ( x ) ) ^ { 2 } \right] var(x)=ED[(f(x;D)f(x))2]

  噪声是标记与真实标记之间的方差:

ε 2 = E D [ ( y D − y ) 2 ] \varepsilon ^ { 2 } = \mathrm { E } _ { D } \left[ \left( y _ { D } - y \right) ^ { 2 } \right] ε2=ED[(yDy)2]

  偏差度量了学习算法的期望预测与真实结果的偏离程度,刻画了学习算法本身的拟合能力。

  方差度量了同样大小的训练集的变动所导致的学习性能的变化,刻画了数据扰动造成的影响。

  噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,刻画了学习问题本身的难度。

  算法的期望泛化误差 E ( f ; D ) \mathrm { E } ( f ; D ) E(f;D)可以分解为偏差、方差和噪声之和:(推导过程见参考文献1)

E ( f ; D ) = bias ⁡ 2 ( x ) + var ⁡ ( x ) + ε 2 E ( f ; D ) = \operatorname { bias } ^ { 2 } ( \boldsymbol { x } ) + \operatorname { var } ( \boldsymbol { x } ) + \varepsilon ^ { 2 } E(f;D)=bias2(x)+var(x)+ε2

参考文献:

  1. 《统计学习方法》第一章统计学习方法概论——李航
  2. 《机器学习》第二章模型评估与选择——周志华
### 交叉验证概述 在机器学习领域,模型评估至关重要。为了有效估计模型性能并防止过拟合现象的发生,交叉验证成为一种广泛应用的技术[^2]。 #### 概念定义 交叉验证是一种统计分析方,用于评估预测模型的表现。通过该技术可以更可靠地衡量不同参数设置下模型的效果,并有助于选择最优配置方案。具体而言,在训练过程中数据集被划分为若干子集;每次迭代时部分作为测试样本其余则用来构建模型,从而获得多个独立的结果以综合判断整体表现情况。 #### 主要用途 此方主要用于解决经验风险最小化算容易产生的过拟合问题。当面对有限规模的数据资源时尤为适用,因为它能够充分利用已有资料进行多次实验对比,进而提高最终结论的可信度稳定性。 #### 实现方式 常见的几种实现形式如下: ##### 简单交叉验证 将原始数据随机分成两份——一份用于训练另一份负责检验。这种方式操作简便快捷但存在较大偶然性不确定性因素影响评价准确性。 ##### K交叉验证 (K-Fold Cross Validation) 这是最常用的版本之一。它会把整个数据集合均匀分割成\(k\)个互不重叠的小批次(fold),依次轮流选取其中一组当作验证集而剩余全部组合起来构成新的训练集来进行一轮完整的建模过程。如此循环往复直至每一批次都曾担任过一次验证角色为止。最后汇总各轮得分取平均值得到总体评分指标。 ```python from sklearn.model_selection import KFold, cross_val_score from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression # 加载鸢尾花数据集 data = load_iris() X, y = data.data, data.target # 定义逻辑回归模型 model = LogisticRegression(max_iter=200) # 使用KFold划分数据,默认shuffle=False kf = KFold(n_splits=5) # 计算交叉验证分数 scores = cross_val_score(model, X, y, cv=kf) print(f'Cross-validation scores: {scores}') print(f'Mean score: {"{:.4f}".format(scores.mean())}') ``` ##### 留一 Leave-One-Out Cross Validation(LOOCV) 即令\(k=n\)(n表示总样本数量),也就是除了单独挑出来的一个个体外其他所有成员共同组成临时性的训练库去调整权重系数再反过来针对那个唯一例外者做出预测推断。这种方理论上可以获得最为精确无偏倚的信息反馈不过计算成本相对较高因为需要重复执行N次同样的流程才能完成整个周期内的全面审查工作。 ```python from sklearn.model_selection import LeaveOneOut loo = LeaveOneOut() for train_index, test_index in loo.split(X): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] model.fit(X_train, y_train) prediction = model.predict(X_test) # 进一步处理... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值