[問題] 交叉驗證的流程請益

看板DataScience作者 (principal component QQ)時間2年前 (2022/01/28 12:37), 2年前編輯推噓4(4015)
留言19則, 7人參與, 2年前最新討論串1/2 (看更多)
最近有一個機器學習任務,是一個簡單的二元分類模型, 但是有一個問題想請教大家, 我想用交叉驗證 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://www.ptt.cc/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

01/28 14:12, 2年前 , 1F
top-2 ensemble
01/28 14:12, 1F

01/28 14:12, 2年前 , 2F
挑 test 上表現最好的前
01/28 14:12, 2F

01/28 14:12, 2年前 , 3F
兩個模型,預測結果兩者取平均,假設來自 fold-3 model
01/28 14:12, 3F

01/28 14:12, 2年前 , 4F
_1 、 fold-1 model_3 ,其中 test AUC 0.87 (很好奇
01/28 14:12, 4F

01/28 14:12, 2年前 , 5F
是可以這樣算?k-fold 算完應該只會有一個結果吧
01/28 14:12, 5F

01/28 14:23, 2年前 , 6F
一個模型做完全部k-kold應該只有一個結果吧?
01/28 14:23, 6F

01/28 15:03, 2年前 , 7F
k-fold cv可以防止model剛好遇到一組很符合的data set,
01/28 15:03, 7F

01/28 15:03, 2年前 , 8F
所以取平均的performance
01/28 15:03, 8F

01/28 15:03, 2年前 , 9F
看起來你的做法跟這個邏輯剛好反過來,反而去取一組剛好
01/28 15:03, 9F

01/28 15:03, 2年前 , 10F
表現好的model,可能是這個原因?
01/28 15:03, 10F

01/28 15:24, 2年前 , 11F
我的模型架構有七個,所以會有七個結果
01/28 15:24, 11F

01/28 15:35, 2年前 , 12F
不同 fold 資料不一樣,出來的數字不能直接比較
01/28 15:35, 12F

01/28 17:30, 2年前 , 13F
如果共有100筆資料拿去切4份,那每一個auc也是基於100
01/28 17:30, 13F

01/28 17:30, 2年前 , 14F
筆資料算的。
01/28 17:30, 14F

01/28 17:30, 2年前 , 15F
而不是25筆資料算得一個auc
01/28 17:30, 15F

01/28 17:30, 2年前 , 16F
test data被你拿來當val 上線後那才是真的test data
01/28 17:30, 16F

01/28 17:32, 2年前 , 17F
有個正解的回文在下面
01/28 17:32, 17F

01/28 17:32, 2年前 , 18F
所以你漏了把4個25再集合才算AUC
01/28 17:32, 18F

01/28 18:11, 2年前 , 19F
感謝各位的指教
01/28 18:11, 19F
文章代碼(AID): #1XytBikA (DataScience)
文章代碼(AID): #1XytBikA (DataScience)