????"對抗驗證",一個無論你使用百度厚骗、google或是知乎都無法獲取答案的中文詞條,當(dāng)然兢哭,輸入英文是可以搜索到答案的领舰。如此拗口且看似逼格很高的東西,到底是干啥的呢迟螺?
????引用kaggle大佬的一段話冲秽。
? ? 當(dāng)面試時,考官問你矩父,“如果模型過擬合锉桑,你會用什么方法處理?”? ? 答曰:“正則化技術(shù)及對抗驗證自編碼窍株!”“當(dāng)訓(xùn)練集與測試集相差很大時民轴,你會怎么辦?”答曰:“對抗驗證自編碼球订!”
? ? “恭喜你后裸,你被錄用了!”來自HR的信息冒滩。
? ? 如此來說對抗驗證有點玩笑微驶,不過足以說明此貨還是挺好使的。下面進入正題,來說說
? ? ? ? 對抗驗證是模型驗證的一種因苹,通常苟耻,我們在訓(xùn)練模型的時候,不會將所有的數(shù)據(jù)用于訓(xùn)練扶檐,而是留出部分?jǐn)?shù)據(jù)(驗證集)用于評估模型的效果凶杖,這樣做可以一定程度減少過擬合,經(jīng)常會使用的到的交叉驗證有:留出法 (holdout cross validation)蘸秘,k 折交叉驗證(k-fold cross validation)官卡。對其中的留出法作簡單舉例說明:
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)以上為留出法,留出20%作為驗證集醋虏。
? ? 什么是對抗驗證?對抗驗證是什么哮翘?怎么用颈嚼?如何實現(xiàn)?
? ? 對抗驗證饭寺,通常是在發(fā)現(xiàn)在訓(xùn)練集上模型表現(xiàn)得非常好阻课,AUC非常高,此時如果采用k-fold交叉驗證艰匙,模型在驗證集上卻表現(xiàn)非常糟糕限煞。一種可能性就是訓(xùn)練集與測試集相差非常大。就如同許多數(shù)據(jù)科學(xué)競賽都面臨著測試集與訓(xùn)練集明顯不同的問題(這違反了“相同分布”的假設(shè))员凝。因此很難建立一個具有代表性的驗證集署驻。對抗驗證,選擇與測試樣本最相似的訓(xùn)練樣本健霹,并將其作為驗證集旺上。這個方法的核心思想是訓(xùn)練一個分類器來區(qū)分訓(xùn)練/測試樣本。相反糖埋,理想情況下宣吱,來自同一分布的訓(xùn)練和測試樣本,驗證誤差就可以很好地估計測試誤差瞳别,分類器就可以很好地泛化到未發(fā)現(xiàn)的測試樣本征候。
? ???此時,你心里肯定有很多疑問祟敛,比如疤坝,這樣選擇的話,那豈不是過度擬合測試集了嗎垒棋?
? ??對抗驗證在訓(xùn)練集和測試集分布“不同”的情況下卒煞,它做的選擇是,寧可過擬合和測試集最相似的訓(xùn)練樣本(用于驗證)叼架,也不去過擬合那些與測試集相去甚遠的樣本畔裕,通過這個方法降低模型的置信度衣撬,從而降低AUC。
? ? 這么做會達到什么目的呢扮饶?這樣做的結(jié)果是具练,我模型訓(xùn)練的效果可以與模型測試的效果相匹配,降低模型訓(xùn)練表現(xiàn)特別好甜无,而測試時一團糟的情況扛点。
? ? 如何實現(xiàn)呢?
? ? 先分享幾個實現(xiàn)的鏈接岂丘,實現(xiàn)過程很簡單陵究。然后簡單描述一下實現(xiàn)的步驟。鏈接:
? ? 1.kaggle-vsb?奥帘; 2.fastml?铜邮; 3.kaggle-svp
? ? 實現(xiàn)步驟:
????1.合并訓(xùn)練集和測試集,并且將訓(xùn)練集和測試集的標(biāo)簽分別設(shè)置為0和1寨蹋;
? ? 2.構(gòu)建一個分類器(CNN,RNN或者決策樹等)松蒜,用于學(xué)習(xí)the?different?between testing and training data;
? ? 3.找到訓(xùn)練集中與測試集最相似的樣本(most resemble data)已旧,作為驗證集秸苗,其余的作為訓(xùn)練集;
? ? 4.構(gòu)建一個用于訓(xùn)練的模型(CNN,RNN或者決策樹等)运褪;
? ? 5.觀察AUC惊楼,理想的狀況是在0.5左右。
? ? BY?yumo:希望可以幫到你吐句!