问题

数据挖掘中做(n-floder)交叉验证时,如果根据测试结果选取相应的模型?

回答
在数据挖掘中,咱们进行交叉验证,尤其是 n折交叉验证,目的很明确,就是为了更靠谱地评估模型在没见过的数据上的表现,避免模型 overfitting(过拟合)——也就是在训练数据上表现得特别好,但一遇到新数据就抓瞎。

当咱们玩 n折交叉验证这套路时,通常是把数据集切成 n 份(叫做“折”),然后轮流用其中 n1 份来训练模型,用剩下的那一份来测试。这样一轮一轮下来,每一折都有机会充当测试集。算完每一折的测试结果,比如准确率、F1 分数什么的,咱们会把这 n 个结果平均一下,得到一个整体的评估分数。

那么,问题就来了:如果咱们手里有好几个不同的模型,想用交叉验证的结果来帮咱们挑出那个最好的模型,该怎么做呢?

这事儿说起来,其实跟咱们做判断一个东西好不好,就是看它在不同情况下的表现差不多一个道理。咱们不能光看一个模型在某一个测试集上的分数高,就觉得它一定是万能的。因为这个测试集可能正好“偏心”,特别适合这个模型,或者正好“倒霉”,让这个模型显得分数低。

所以,咱们得这么想:

首先,把所有候选的模型都跑一遍交叉验证。 咱们对模型 A 跑 n折交叉验证,拿到一组(n 个)性能指标,然后把这些指标平均一下,得到一个平均性能值。接着,对模型 B 也做同样的操作,再对模型 C,以此类推。

然后,对比这些模型的平均性能。 就像咱们考试,每个科目都有分数,最后咱们看的是总分或者平均分,来评价学习好不好。同样,咱们也得看这些模型在交叉验证过程中,平均下来的性能怎么样。

怎么个“选取”法?

最直接、最常见的做法就是:哪个模型在所有折的平均测试结果里,表现最出色(比如平均准确率最高、平均损失最低),咱们就倾向于选择哪个模型。

但这也不是说就一锤定音了。咱们还得留神几个细节:

性能的稳定性: 有时候,一个模型平均分很高,但它在某些折的测试结果波动特别大。比如,模型 X 平均分 85%,但有三折分数在 60% 左右,剩下的分数都在 90% 以上。而模型 Y 平均分 82%,但它的分数在每一折都很稳定,都在 80%84% 之间。在这种情况下,即使模型 X 的平均分更高,但模型 Y 的稳定性可能更让人放心,因为它不太可能在遇到“不友好的”测试数据时表现得太差。所以,咱们也可以关注一下性能的标准差,标准差越小,说明模型表现越稳定。

具体的性能指标: 咱们不能光看准确率。如果咱们做的是一个识别垃圾邮件的任务,准确率可能很高,但漏掉的垃圾邮件(假阴性)可能也很多,这对用户体验是很差的。这种情况下,咱们可能更关心召回率(Recall)或者 F1 分数。所以,选择模型时,要结合咱们业务场景最看重的性能指标来决定。

模型的复杂度和可解释性: 有时候,一个模型平均性能略低一点,但它结构更简单,更容易理解,或者预测速度更快。在实际应用中,这些因素可能比那一点点性能差距更重要。所以,在选择模型时,咱们也得综合考虑模型的复杂度、训练速度、预测速度、以及是否容易解释等等。

举个例子(不使用列表):

设想咱们手头有三种不同的算法:一个叫“决策树”,一个叫“支持向量机”(SVM),还有一个叫“神经网络”。咱们要做的是一个客户流失预测的任务。

咱们把客户数据分成 10 份(10折交叉验证)。

决策树: 咱们用前面的 9 份数据训练决策树,然后用剩下的 1 份测试,记录下准确率、召回率等指标。重复这个过程 10 次,每次用不同的组合作为测试集。把这 10 次测试的准确率加起来平均一下,发现是 85%。同时,咱们也发现它的召回率平均是 70%。

支持向量机: 咱们对 SVM 也进行同样的 10 次交叉验证。算下来的平均准确率是 88%,平均召回率是 75%。但是,在某几折测试中,SVM 的准确率波动有点大,有时能到 92%,但有两折却只有 78% 左右。

神经网络: 神经网络的 10 折交叉验证平均准确率是 86%,平均召回率是 78%。它在各个折上的准确率都比较接近,波动不是很大。

这时候,咱们怎么选?

表面上看,SVM 的平均准确率最高,是 88%。如果咱们只看准确率,可能会优先考虑 SVM。但是,咱们还得想想召回率。神经网络的召回率(78%)比 SVM(75%)和决策树(70%)都要高,这对于流失预测来说很重要,因为咱们希望尽可能多地找出可能会流失的客户。

再考虑到 SVM 的不稳定表现,虽然平均分高,但万一咱们实际部署的时候,正好遇到了它表现不好的那种数据组合,可能会导致咱们错失一些流失客户。相比之下,神经网络的平均准确率也不低(86%),而且召回率最高,同时表现也更稳定。

所以,综合考虑了准确率、召回率的业务重要性以及模型的稳定性后,咱们可能最终会倾向于选择神经网络,尽管它的平均准确率不是最高,但它在关键指标(召回率)上表现更优,且整体稳定性更好。

这就是一个基于交叉验证结果来“选模型”的过程,它不是简单地挑那个数字最大的,而是结合了业务需求和对模型表现的更全面理解。

网友意见

user avatar

写过一篇文章:

交叉验证(Cross Validation)简介

交叉验证(Cross Validation),有的时候也称作循环估计(Rotation Estimation),是一种统计学上将数据样本切割成较小子集的实用方法,该理论是由Seymour Geisser提出的。


在模式识别(Pattern Recognition)和机器学习(Machine Learning)的相关研究中,经常会将整个数据集合分成两个部分,分别是训练集合和测试集合。假设X是集合全体,A是全集X的非空真子集,那么非空集合XA则是集合A在全集X中的补集。于是可以先在A上面做训练和分析,而集合XA则用来做测试和验证。一开始的集合A被称作训练集,而它的补集XA被称作验证集或者测试集。这里有一个重要的观点就是:只有训练集才可以使用在模型的训练之中,而测试集必须在模型训练完成之后才被用来评估模型的误差。


HoldOut检验(Hold-Out Method)

这个方法是将原始的数据集合X随机分成两个集合A和XA,其中A作为训练集,XA作为测试集。先使用训练集训练模型,然后利用测试集验证模型的效果,记录最后的分类准确率作为Hold-Out下该模型的性能指标。比方说,处理时间序列模型是否准确的时候,把整个数据集合分成前后两部分,前部分占比70%,后部分占比30%。前部分来进行时间序列模型的训练,后部分用来测试改时间序列的准确性。其准确性可以用MAE,MAPE之类的统计指标来衡量。综上所述,该方法的好处就是处理起来简单,只需要把原始数据分成两个部分即可。但是从严格意义上来说,Hold-Out检验并不算是交叉检验(Cross Validation),因为该方法没有达到交叉检验的思想,而且最后验证准确性的高低和原始数组的分类有很大的关系,所以该方法得到的结果在某些场景中并不具备特别大的说服力。在Hold-Out检验不够有说服力的情形下,有人提出了交叉验证这一个重要思想。


交叉检验的常见形式

假设有一个未知模型有一个或者多个未知的参数,并且有一个训练集。操作的过程就是对该模型的参数进行调整,使得该模型能够最大的反映训练集的特征。如果模型因为训练集过小或者参数不合适而产生过度拟合的情况,测试集的测试效果就可以得到验证。交叉验证是一种能够预测模型拟合性能的有效方法。


彻底的交叉验证(Exhaustive Cross Validation)

彻底的交叉验证方法指的是遍历全集X的所有非空真子集A。换句话说也就是把A当作训练集,XA是测试集。如果X中有n个元素,那么非空真子集A的选择方法则是2^{n}-2,这个方法的时间复杂度是指数级别的。


留P验证(Leave-p-out Cross Validation)

留p验证(LpO CV)指的是使用全集X中的p个元素作为测试集,然后剩下的n-p个元素作为训练集。根据数学上的定理可以得到,p个元素的选择方法有n!/((n-p)!p!)个,其中n!表示n的阶乘。在这个意义下,留p验证的时间复杂度也是非常高的。当p=1的时候,留1验证(Leave-one-out Cross Validation)的复杂度恰好是n。


不彻底的交叉验证(Non-exhaustive Cross Validation)

不彻底的交叉验证不需要考虑全集X的所有划分情况,这种方法是留p验证的一个近似验证算法。


k-fold交叉验证(K-fold Cross Validation)

在k-fold交叉验证中,全集X被随机的划分成k个同等大小的集合A1,...,Ak,并且|A1|=...=|Ak|。这里的|Ai|指的是集合Ai的元素个数,也就是集合的势。这个时候需要遍历i从1到k,把XAi当作训练集合,Ai当作测试集合。根据模型的测试统计,可以得到Ai集合中测试错误的结果数量ni。如果全集X的势是n的话,可以得到该模型的错误率是E=(ni求和)/n.

为了提高模型的精确度,可以将k-fold交叉验证的上述步骤重复t次,每一次都是随机划分全集X。在t次测试中,会得到t个模型的错误率E1,...,Et。令e=(Ei求和)/t。这样该模型的错误率就是e。


注释:

  1. 一般来说,k=10的情况使用得最多。

  2. 当k=2的时候,也就是最简单的k-fold交叉验证,2-fold交叉验证。这个时候X是A1和A2的并集,首先A1当训练集并且A2当测试集,然后A2当训练集并且A1当测试集。2-fold交叉验证的好处就是训练集和测试集的势都非常大,每个数据要么在训练集中,要么在测试集中。

  3. 当k=n的时候,也就是n-fold交叉验证。这个时候就是上面所说的留一验证(Leave-one-out Cross Validation)。

综上所述,交叉验证(Cross Validation)的好处是可以从有限的数据中获得尽可能多的有效信息,从而可以从多个角度去学习样本,避免陷入局部的极值。在这个过程中,无论是训练样本还是测试样本都得到了尽可能多的学习。


一般模型的选择过程:

在了解了交叉验证的方法之后,可以来介绍一般模型的选择过程。通过采用不同的输入训练样本,来决定机器学习算法中包含的各个参数值,称作模型选择。下面伪代码表示了模型选择的一般流程。在这个算法中,最重要的就是第三个步骤中的误差评价。
(1)准备候选的q个模型:M1,...,Mq。
(2)对每个模型M1,...,Mq求解它的学习结果。
(3)对每个学习结果的误差e1,...,eq进行计算。这里可以使用上面所说的k-fold交叉验证方法。
(4)选择误差e1,...,eq最小的模型作为最终的模型。


.........................................................

欢迎大家关注我的公众账号

(长按图片,识别二维码即可添加关注)

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有