題:
在交叉驗證後對整個數據集進行培訓?
Amelio Vazquez-Reina
2011-06-05 21:50:51 UTC
view on stackexchange narkive permalink

TL:DR :在將ML模型發佈到生產之前,對所有可用數據進行訓練都是一個好主意嗎?換句話說,是否可以對所有可用數據進行訓練,並且檢查模型是否過擬合,或者最終讀取模型的預期性能?


說我有一個由 $ \ alpha $ span>參數化的模型家族。我可以在 $ \ alpha $ span>上進行搜索(例如,網格搜索),例如,對每個候選人進行k倍交叉驗證。

使用交叉驗證選擇 $ \ alpha $ span>的要點是,我可以檢查 a 學習的模型 $ \ beta_i $ span>用於 特定的 $ \ alpha_i $ 有例如通過在每個CV迭代(驗證集)中的“看不見的數據”上進行測試來進行過度擬合。在遍歷所有 $ \ alpha_i $ span>之後,我可以選擇一個模型 $ \ beta _ {\ alpha ^ *} $ span>學習了似乎在網格搜索中效果最好的參數 $ \ alpha ^ * $ span>

現在,說選型後,我想使用 all 嘗試中的可用數據運送生產中最好的模型。為此,我可以使用通過交叉驗證通過網格搜索選擇的參數 $ \ alpha ^ * $ span>,然後在對模型進行全面訓練後( $ F $ span>)數據集,我將得到一個單一的 new 學習模型 $ \ beta ^ {F} _ {\ alpha ^ *} $ span>

問題在於,如果我將整個數據集用於訓練,我將無法可靠地檢查這種新學習的模型 $ \ beta ^ { F} _ {\ alpha ^ *} $ span> 過擬合,或它如何處理看不見的數據。那麼這完全是一種好習慣嗎?考慮這個問題的好方法是什麼?

幾乎完全相同:http://stats.stackexchange.com/questions/52274,其中包含許多有價值的答案。也許這些線程應該合併,但是我不確定哪個方向。雙方都接受了非常好的答案。
五 答案:
Dikran Marsupial
2012-04-16 18:56:46 UTC
view on stackexchange narkive permalink

考慮交叉驗證的方法是估計使用構建模型的方法獲得的性能,而不是估計模型的性能。

如果使用交叉驗證來估計模型的超參數($ \ alpha $ s),然後使用這些超參數將模型擬合到整個數據集,那麼很好,只要您認識到性能的交叉驗證估計可能是(可能是實質性的)樂觀偏見。這是因為已選擇模型的一部分(超參數)以最大程度地減少交叉驗證性能,因此,如果交叉驗證統計信息的方差非零(並且將會),則可能會過度擬合模型選擇標準。

如果要選擇超參數並估計所得模型的性能,則需要執行嵌套交叉驗證,其中使用外部交叉驗證來評估模型的性能,以及在每個折疊中使用交叉驗證來分別確定每個折疊中的超參數。您可以通過對整個集合進行交叉驗證以選擇超參數來構建最終模型,然後使用優化的超參數對整個數據集進行分類。

這當然在計算上很昂貴,但值得一提的是,由於不正確的性能估算所帶來的偏差可能很大。請參閱我的論文

G。 C. Cawley和N. L. C. Talbot,模型選擇中的過擬合和性能評估中的後續選擇偏差,《機器學習研究雜誌》,2010年。 11,第2079-2107頁,2010年7月。( www pdf

但是,仍然可能在模型選擇中過度擬合(嵌套交叉驗證僅允許您對其進行測試)。我發現一種​​有用的方法是在交叉驗證錯誤中添加一個正則化項,以懲罰可能導致模型過於復雜的超參數值,請參見

G。 C. Cawley和NLC Talbot,通過超參數的貝葉斯正則化防止模型選擇過擬合,《機器學習研究雜誌》,第8卷,第841-861頁,2007年4月。( www pdf

因此,您的問題的答案是(i)是,您應該使用完整的數據集來生成最終模型,因為您使用的數據越多,就越有可能進行概括,但(ii)確保通過嵌套交叉驗證獲得公正的性能估計,並可能考慮對交叉驗證統計數據進行懲罰,以進一步避免模型選擇過擬合。

+1:回答問題:“如果使用交叉驗證來估計模型的超參數(αs),然後使用那些超參數將模型擬合到整個數據集,那麼很好……”
與嵌套的交叉驗證有什麼不同?我們可以運行一些初始實驗並觀察超參數的正確設置,然後對參數使用交叉驗證嗎?
@soufanom,不行,使用“初始實驗”進行模型選擇可能會導致擬合過度,並且幾乎可以肯定的是,性能分析中會引入樂觀的偏見。用於性能分析的交叉驗證必須在每個折疊中重複用於獨立擬合模型的每個步驟。我的論文中的實驗表明,內核模型對這種偏差可能非常敏感,因此至關重要的是,要盡可能嚴格地執行模型選擇和性能評估。
感謝您的直接回复。由於它的高計算時間成本,我想避免嵌套交叉驗證。可以說我有一個alpha和lambda參數。我是否可以遍歷alpha值,並且在每個值中我們對lambda應用交叉驗證?這可能仍比嵌套交叉驗證更為樂觀,但是可以接受嗎?
對於諸如SVM之類的內核方法,通常可以以幾乎沒有計算成本的方式執行留一法式交叉驗證(請參閱我的答案中列出的論文)。我使用這種“虛擬的”留一法式交叉驗證來調整超參數,並嵌套在k倍交叉驗證中以進行性能評估。這樣的成本是相當合理的。在我看來,使用任何過程都無法通過對超參數進行調整而使性能評估產生偏差的做法是不可接受的。獲得可靠的估計值是值得的計算費用。
@DikranMarsupial。我不太明白你的回答中的第三段。如果我進行嵌套交叉驗證,則對於**外部** CV的每一折,我將獲得一組不同的超參數(即,通過在參數網格上運行**內部** CV得到一組超參數) 。然後,如何選擇最佳的超參數集?
交叉驗證本質上是一種估計擬合模型的“方法”的性能的方法,而不是方法本身的性能。因此,在執行嵌套的交叉驗證以獲取性能估計後,只需使用交叉驗證的過程(包括選擇超參數),使用整個數據集重建最終模型。
這是一個很好的答案(+1)。我一直在審查您對此主題的回答,並且也在您的2010年Cawley&Talbot論文中進行了研究,因為我遇到了一個簡單的情況,無論是否進行嵌套交叉驗證,我都會得到完全相同的錯誤估計。這讓我想知道嵌套CV在什麼情況下會有所作為。我在這裡問了這個問題:http://stats.stackexchange.com/questions/178174,對您的輸入非常感興趣!謝謝。
因此,如果使用嵌套交叉驗證,則在執行嵌套交叉驗證後,可以使用優化的超參數在整個數據集上構建最終模型。但是,如果我們使用評估來評估模型性能並在訓練集上進行交叉驗證以調整參數,那麼我們將無法進行。這是為什麼?我不明白請參閱以下問題:http://stats.stackexchange.com/questions/153366/question-about-training-set-and-test-set。謝謝
我認為我在回答中沒有提到堅持。但這取決於如何使用交叉驗證和保留。如果對所有可用數據進行交叉驗證,然後將數據分為訓練集和測試集,並使用交叉驗證的超參數,則將得出樂觀的性能估計。但是,沒有理由不應該對所有可用數據進行再培訓。關鍵是交叉驗證是對生成模型的方法的性能的估計,而不是對模型本身的性能的估計。
@DikranMarsupial謝謝您的回答。在上面的註釋中,您寫道:“在執行嵌套的交叉驗證以獲取性能估計後,只需使用交叉驗證的過程,使用整個數據集重建最終模型。”明確一點-您應該只報告最終模型的嵌套CV的性能估算值-對嗎?
@BerkU。是的,那是我會做的。
必須強調這個答案。人們通常對嵌套交叉驗證後的操作一無所知,
@DikranMarsupial:說,我使用嵌套的CV來評估建模過程,該過程包括在range(3,4)中搜索一些hyperP lambda。我得到0.2倍的平均誤差(不適用於應用程序)。我重做嵌套的CV,但是這次我搜索range(1,6)中的lambda。我收到錯誤0.01。如果我選擇第二個建模過程,那麼我將成為您論文中提到的樂觀主義者的受害者。如果不通過這種方法,我們應該如何找到搜索空間呢?https://stats.stackexchange.com/questions/282954/does-changing-the-parameter-search-space-after-nested-cv-introduce-optimistic-bi
從哲學上講,您為什麼要使用化名並張貼您的論文,從而可以推斷出您的真實姓名?(順便說一句:很好的答案,謝謝你,也提供本書的鏈接)
Momo
2012-04-15 04:37:02 UTC
view on stackexchange narkive permalink

Max Kuhn的 caret 程序包(分類和回歸訓練)只是通過@ mark999來補充答案,它是R中基於引導程序進行模型選擇的最全面的資源交叉驗證或N折CV以及其他一些方案。

不要忽視 rms 軟件包的強大之處,但是 caret 可以讓您適應R中幾乎所有可用的學習方法,而 validate 僅適用於 rms 方法(我認為)。

caret 包是用於預處理數據,擬合和評估任何流行模型的單一基礎結構,因此它易於用於所有方法,並提供許多性能指標的圖形化評估(過擬合問題旁邊的某些內容也可能會極大地影響模型選擇)對您的網格和重要性的影響。

請參閱程序包漸近入門(使用非常簡單)
數據預處理
帶有脫字符號的變量選擇
帶有脫字符號的模型構建
變量重要性

您還可以查看插入符號網站以獲取有關該軟件包的更多信息以及具體的實現示例:
官方插入符號網站

謝謝。您是否知道,在選擇模型後(通過調用“ train”來完成),是否可以在插入符號中使用完整的數據集進行訓練?
不確定這是個好主意還是為什麼要這麼做,但是您可以將火車返回的最終模型擬合到完整的數據集。
mark999
2011-06-06 00:13:11 UTC
view on stackexchange narkive permalink

我認為,Frank Harrell建議使用引導程序驗證,而不是交叉驗證。 Bootstrap驗證可讓您驗證裝配在完整數據集上的模型,並且比交叉驗證更穩定。您可以使用Harrell的 rms 包中的 validate 在R中完成此操作。有關更多信息,請訪問Efron和Tibshirani的文章。

省略關於“ CV差”的下一個神話,這是一個術語問題-Harrell的“交叉驗證”表示N倍CV,“引導驗證”表示重新採樣CV。顯然,我同意第二種味道更穩定且總體上更好,但這也是一種交叉驗證。
您想介意mark999或@mbq,引導程序如何使人們能夠驗證適合整個數據集的模型嗎?
@user27915816好吧,原則上是這樣;交叉驗證的思想是,您測試給定的*訓練方法*是否能在與最終模型非常相似的集合上可靠地製作出良好的模型,如果是,則在無奇怪假設的情況下將此觀察結果推廣到整個集合將會發生,並且您使用的CV方法沒有任何偏見。當然,這幾乎總是足夠好,但仍然不能確保基於所有數據構建的模型不會過擬合。
cbeleites unhappy with SX
2012-04-20 00:30:45 UTC
view on stackexchange narkive permalink

我認為您在這裡有很多不同的問題:

問題是,如果我使用數據集中的所有點進行訓練,則無法檢查這個新學習的模型β完全過擬合!

問題是,您只能對一個事物使用(一個)驗證步驟:用於參數優化,(x)或估計泛化性能。

因此,如果通過交叉驗證(或任何其他類型的數據驅動的參數確定)進行參數優化,則需要獨立於那些訓練和優化樣本的測試樣本。 Dikran稱其為嵌套交叉驗證,另一個名稱是雙交叉驗證。或者,當然,是一個獨立的測試集。

所以這是本文的問題:在進行k折交叉驗證後,使用完整的數據集進行訓練是一個好主意嗎?還是堅持使用在交叉驗證拆分之一中學習到的模型中的一種來獲得最佳結果?

使用其中一種交叉驗證模型通常是更糟糕的 em>比完整訓練(至少如果您的學習曲線性能= f(nsamples)仍在增加。實際上,是:如果不是,則您可能會保留一個獨立的測試集。) / p>

如果您發現交叉驗證模型(具有相同參數)之間存在較大差異,則您的模型將不穩定。在那種情況下,與使用對整個數據訓練的 one 模型相比,匯總模型可以有所幫助,甚至更好。

更新::這種匯總是裝袋背後的思想,適用於無替換的重採樣(交叉驗證),而不是帶替換的重採樣(bootstrap / out-引導程序驗證)。

這是我們使用此技術的論文:
Beleites,C。& Salzer,R .:在小樣本量情況下評估和改進化學計量學模型的穩定性,Anal Bioanal Chem, 390,1261-1271(2008)。
DOI:10.1007 / s00216-007-1818-6

也許最重要的是,我該如何訓練數據集中的所有點並仍然與過度擬合作鬥爭?

通過對“最佳”模型所允許的自由度非常保守,即通過考慮優化交叉驗證結果的(隨機)不確定性。如果d.f.實際上適用於交叉驗證模型,對於更大訓練集來說,它們不太可能很好。陷阱是,參數優化實際上是多次測試。您需要防止偶然看起來好看的參數集。
如果發現交叉驗證模型(具有相同參數)之間存在較大差異,則您的模型將不穩定。在這種情況下,匯總模型可以有所幫助...`您能對此多解釋一下嗎?例如如果我在10 k交叉驗證的設置中運行logistic回歸併最終得到10組係數,您是否建議匯總coeff估計值以形成最終模型?如果是這樣,那麼僅憑手段怎麼做?
@cbeleites您能詳細說明一下“如果d.f.實際上適用於交叉驗證模型。根據我的理解,您認為訓練/驗證集與完整的數據集相比不是很大,對嗎?
@Zhubarb您是指10倍k倍(例如5倍)嗎?如果是這樣,我相信最佳實踐將是使用具有最佳模型選擇參數的模型,該參數來自10倍k折。對於每k倍,在回歸的情況下,您將獲得平均RMSE或R2,因此您已經獲得了一種匯總模型。但是在存在不穩定模型的情況下應格外小心。也許“最佳”模型不是來自簡歷的模型,而是第二或第三模型,具體取決於火車/測試數據集。我想嘗試就很難知道。
參見`http:// ai.stanford.edu /〜ang / papers / cv-final.pdf`
@Zhubarb:聚合通常是通過預測完成的AFAIK。對於線性模型,如果對係數或預測取平均,結果將是相同的,但是對於LR,由於非線性變換,結果將有所不同。請參閱本文中的文章以獲取更多詳細信息和示例。
-1
更重要的是:迭代的交叉驗證代理模型共享同一組超參數。也就是說,它們在您認為很重要的所有方面都是等效的,但可以隨意選擇培訓和測試用例。因此,選擇一個“好的”模型實際上應該首先選擇一個好的測試/培訓集組合-從根本上講,這是我們通常*不*想要的:我們想要一個能夠很好地概括並因此不僅適用於有利情況的選擇。從這個角度來看,從“正常”交叉驗證中選擇代理模型對我來說沒有任何意義。
-1
user88
2011-06-06 01:49:08 UTC
view on stackexchange narkive permalink

您要做的不是交叉驗證,而是某種隨機優化。

CV的想法是通過在對象的子集上執行幾輪構建模型並在其餘對像上進行測試來模擬看不見數據的性能。所有回合的平均結果是在整個集合上訓練的模型的性能近似值

在選擇模型的情況下,您應該為每個模型執行完整的簡歷參數集,從而獲得每個設置的全性能近似值,因此似乎是您想要的東西。

不過,請注意,實際上並不能完全保證最佳近似精度的模型將是最佳模型-您可以對整個模型選擇過程進行交叉驗證,以了解其中存在一定範圍模型精度差異不明顯的參數空間。

感謝@mbq,,但不確定我是否遵循。我對超參數空間中網格搜索的每個點值進行N折交叉驗證。 N折的平均結果為您提供了您提到的近似值,我將其用於比較模型並通過選擇最適合驗證集的模型來進行模型選擇。我的問題是當我訓練完整的數據集時會發生什麼。我認為學習型模型會發生變化(學習型模型的$ \ vec \ beta $參數會發生變化),原則上我無法知道是否遭受過度擬合。
@AmV如果是這樣,那麼好了-正如我所寫的那樣,CV已經測試了完整的方案,如果沒有新數據,您不能說更多。同樣,您最多可以進行嵌套的CV,以查看模型選擇本身是否沒有過擬合(如果選擇提供了很好的改進或數據嘈雜,則這樣做的風險會很大)。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...