作者wheado (principal component QQ)
看板DataScience
标题[问题] 交叉验证的流程请益
时间Fri Jan 28 12:36:58 2022
最近有一个机器学习任务,是一个简单的二元分类模型,
但是有一个问题想请教大家,
我想用交叉验证 K-fold 的方法来验证并且选择模型,
但我的训练、验证、流程被质疑学理不通,
别人的论文不会这样做,我不知道产品能不能这样做。
我觉得我的作法没有问题,但又有点害怕真的我脑袋有问题,
我想跟版上的有经验的前辈请益,再回头跟长官讨论。
我将我的作法写在下面,
=========================训练、验证、测试流程============================
首先将资料集 Data 切成 train 跟 test
train 切成 k 块,以 4 为例, A, B, C, D
k=1, B + C + D 定义 train-train , A 定义 train-validation
我有七种模型,你可以想像用不同的 backbone (resnet, mobilenet,...)
训练完成我在 A 上可以得到 7 个 AUC 。
k=2, A + C + D 定义 train-train , B 定义 train-validation
我有七种模型,同上
训练完成我在 B 上可以得到 7 个 AUC 。
k=3, A + B + D 定义 train-train , C 定义 train-validation
我有七种模型,同上
训练完成我在 C 上可以得到 7 个 AUC 。
k=4, A + B + C 定义 train-train , D 定义 train-validation
我有七种模型,同上
训练完成我在 D 上可以得到 7 个 AUC 。
以上都跟 test 无关,只在 train 中。
最後我会得到 k*(3+3+1) 个模型,我全部在 test 上做验证,
可以得到所有模型在测试集上的评估数据。
产品端可以将全部的模型都上线,但是伺服器费用高,所以不能全上。
需要挑选上线的模型,挑选 N 个模型,由单一表现最高的开始往下挑,
举个例子来说明我的挑选方法:
fold-k model_n 代表第 k 个 fold 里面第 n 个模型
k = 1,2,3,4 有 4 个 fold
n = 1,2,3,4,5,6,7 我有七个模型架构
top-1 ensemble
挑 test 上表现最好的第一个模型,
假设来自 fold-3 model_1 ,其中 test AUC 0.86 。
top-2 ensemble
挑 test 上表现最好的前两个模型,预测结果两者取平均,
假设来自 fold-3 model_1 、 fold-1 model_3 ,其中 test AUC 0.87
top-3 ensemble
挑 test 上表现最好的前三个模型,预测结果三者取平均,
假设来自 fold-3 model_1 、 fold-1 model_3 、 fold-3 model_2 ,
其中 test AUC 0.88 。
top-4 ensemble
挑 test 上表现最好的前四个模型,预测结果四者取平均,
假设来自 fold-3 model_1 、 fold-1 model_3 、
fold-3 model_2 、 fold-4 model_1,
其中 test AUC 0.875 。
发现在选到第四个模型综合结果下降了,所以就挑选前三个模型,
当作产品的 classifier ,当然预测结果是取平均。
==============================================================
挑选模型是从所有的 fold 当中训练的所有模型来挑选。
请问这样做产品会有很严重的逻辑错误在里面吗?
有的话在哪边?
还是我应该简单点,切 train, validation, test 这样训练一次,
不要做 K-fold ,但先前的经验告诉我 ensemble 这种作法会提昇一个档次,
所以我会想往这样走,
而且透过不同的模型架构以及 K-fold 作法可以获得更多的模型。
我不知道我的逻辑错在哪?
恳请高手指导,谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.254.12.48 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1643344620.A.B8A.html
※ 编辑: wheado (111.254.12.48 台湾), 01/28/2022 12:37:38
※ 编辑: wheado (111.254.12.48 台湾), 01/28/2022 12:39:30
※ 编辑: wheado (111.254.12.48 台湾), 01/28/2022 12:42:36
※ 编辑: wheado (111.254.12.48 台湾), 01/28/2022 12:45:39
※ 编辑: wheado (111.254.12.48 台湾), 01/28/2022 12:50:24
1F:→ linfeelin: top-2 ensemble 01/28 14:12
2F:→ linfeelin: 挑 test 上表现最好的前 01/28 14:12
3F:→ linfeelin: 两个模型,预测结果两者取平均,假设来自 fold-3 model 01/28 14:12
4F:→ linfeelin: _1 、 fold-1 model_3 ,其中 test AUC 0.87 (很好奇 01/28 14:12
5F:→ linfeelin: 是可以这样算?k-fold 算完应该只会有一个结果吧 01/28 14:12
6F:推 lycantrope: 一个模型做完全部k-kold应该只有一个结果吧? 01/28 14:23
7F:推 YogaGAGA: k-fold cv可以防止model刚好遇到一组很符合的data set, 01/28 15:03
8F:→ YogaGAGA: 所以取平均的performance 01/28 15:03
9F:→ YogaGAGA: 看起来你的做法跟这个逻辑刚好反过来,反而去取一组刚好 01/28 15:03
10F:→ YogaGAGA: 表现好的model,可能是这个原因? 01/28 15:03
11F:→ wheado: 我的模型架构有七个,所以会有七个结果 01/28 15:24
12F:推 jigfopsda: 不同 fold 资料不一样,出来的数字不能直接比较 01/28 15:35
13F:→ andrew43: 如果共有100笔资料拿去切4份,那每一个auc也是基於100 01/28 17:30
14F:→ andrew43: 笔资料算的。 01/28 17:30
15F:→ andrew43: 而不是25笔资料算得一个auc 01/28 17:30
16F:推 yoyololicon: test data被你拿来当val 上线後那才是真的test data 01/28 17:30
17F:→ yoyololicon: 有个正解的回文在下面 01/28 17:32
18F:→ andrew43: 所以你漏了把4个25再集合才算AUC 01/28 17:32
19F:→ wheado: 感谢各位的指教 01/28 18:11