作者ej0cl6 (淡红色枫叶)
看板DataScience
标题Re: [问题] 交叉验证的流程请益
时间Fri Jan 28 15:58:32 2022
应该说你目前的架构不该称作K-fold validation,比较像是某种bootstrap+ensemble
假设有n种模型架构,K-fold validation是用来比较模型架构以及找出最好的模型架构
: =========================训练、验证、测试流程============================
: 首先将资料集 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 。
到这边目前都没问题,但是接下来就不正确了
正常的K-fold validation会将每个模型在不同k上面的AUC做平均
所以你会得到7个平均过後的AUC,分别代表7个不同模型架构
根据这7个AUC选最出好的模型架构,再去测在test set上验证表现以及有没有overfit
正常的K-fold validation到这边就结束了,因为你已经找到一个相对稳定的模型架构
接下来可以考虑拿选出来的模型架构在7个fold上train好的model进行emsemble然後上线
也可以可以考虑用这个模型train在所有data上,然後上线这单一model
或是用这个模型重复整个K-fold validation,只是这次在所有data上,然後emsemble上线
: 以上都跟 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 ,当然预测结果是取平均。
这个其实比较像是bootstrap+ensemble
你有很多个模型架构,train在很多sample过後的training set (类似bootstrap)
最後再从中选出比较好的几个ensemble
所以本质上你直接把test当成是validation set来测model以及如何选model进行ensemble
在不容易overfit的task下的确有可能有比较好的表现,但就不该称作K-fold validation
顺带一提,在你目前的架构下是没有实质上的test set的
: ==============================================================
: 挑选模型是从所有的 fold 当中训练的所有模型来挑选。
: 请问这样做产品会有很严重的逻辑错误在里面吗?
: 有的话在哪边?
: 还是我应该简单点,切 train, validation, test 这样训练一次,
: 不要做 K-fold ,但先前的经验告诉我 ensemble 这种作法会提昇一个档次,
: 所以我会想往这样走,
: 而且透过不同的模型架构以及 K-fold 作法可以获得更多的模型。
: 我不知道我的逻辑错在哪?
: 恳请高手指导,谢谢。
简单说,K-fold是为了找出最好的模型架构,但并不代表这就会给你最好的表现
你可以用K-fold validation找出前几好的模型架构ensemble
也可以用类似你目前的方式,train一大堆model pool直接ensemble
理论上都是可行的
不过还是建议你重新看一遍K-fold validation的定义,希望有帮助到你
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.167.231.116 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1643356714.A.D3B.html
※ 编辑: ej0cl6 (118.167.231.116 台湾), 01/28/2022 15:59:47
1F:→ andrew43: 推这篇。 01/28 17:33
2F:推 YogaGAGA: 有帮助到我,谢谢 01/28 17:45
3F:→ wheado: 谢谢 01/28 21:25