數(shù)據(jù)準(zhǔn)備是將原始數(shù)據(jù)轉(zhuǎn)換為適合建模的形式的過(guò)程。 原始的數(shù)據(jù)準(zhǔn)備方法是在評(píng)估模型性能之前對(duì)整個(gè)數(shù)據(jù)集進(jìn)行處理。這會(huì)導(dǎo)致數(shù)據(jù)泄漏的問(wèn)題, 測(cè)試集中的數(shù)據(jù)信息會(huì)泄露到訓(xùn)練集中。那么在對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)時(shí),我們會(huì)錯(cuò)誤地估計(jì)模型性能。 為了避免數(shù)據(jù)泄漏,我們需要謹(jǐn)慎使用數(shù)據(jù)準(zhǔn)備技術(shù),同時(shí)也要根據(jù)所使用的模型評(píng)估方案靈活選擇,例如訓(xùn)練測(cè)試集劃分或k折交叉驗(yàn)證。 在本教程中,您將學(xué)習(xí)在評(píng)估機(jī)器學(xué)習(xí)模型時(shí)如何避免在數(shù)據(jù)準(zhǔn)備過(guò)程中的數(shù)據(jù)泄漏。 完成本教程后,您將會(huì)知道:
應(yīng)用于整個(gè)數(shù)據(jù)集的簡(jiǎn)單的數(shù)據(jù)準(zhǔn)備方法會(huì)導(dǎo)致數(shù)據(jù)泄漏,從而導(dǎo)致對(duì)模型性能的錯(cuò)誤估計(jì)。
為了避免數(shù)據(jù)泄漏,數(shù)據(jù)準(zhǔn)備應(yīng)該只在訓(xùn)練集中進(jìn)行。
如何在Python中用訓(xùn)練測(cè)試集劃分和k折交叉驗(yàn)證實(shí)現(xiàn)數(shù)據(jù)準(zhǔn)備而又不造成數(shù)據(jù)泄漏。在我的新書(shū)
(https://machinelearningmastery.com/data-preparation-for-machine-learning/)
中了解有關(guān)數(shù)據(jù)清理,特征選擇,數(shù)據(jù)轉(zhuǎn)換,降維以及更多內(nèi)容,包含30個(gè)循序漸進(jìn)的教程和完整的Python源代碼。
讓我們開(kāi)始吧。 目錄 本教程分為三個(gè)部分: 1.原始數(shù)據(jù)準(zhǔn)備方法存在的問(wèn)題 2.用訓(xùn)練集和測(cè)試集進(jìn)行數(shù)據(jù)準(zhǔn)備
用原始數(shù)據(jù)準(zhǔn)備方法進(jìn)行訓(xùn)練-測(cè)試評(píng)估
用正確的數(shù)據(jù)準(zhǔn)備方法進(jìn)行訓(xùn)練-測(cè)試評(píng)估
3 .用K折交叉驗(yàn)證進(jìn)行數(shù)據(jù)準(zhǔn)備
用原始數(shù)據(jù)準(zhǔn)備方法進(jìn)行交叉驗(yàn)證評(píng)估
用正確的數(shù)據(jù)準(zhǔn)備方法進(jìn)行交叉驗(yàn)證評(píng)估
原始數(shù)據(jù)準(zhǔn)備方法的問(wèn)題 應(yīng)用數(shù)據(jù)準(zhǔn)備技術(shù)處理數(shù)據(jù)的方式很重要。 一種常見(jiàn)的方法是首先將一個(gè)或多個(gè)變換應(yīng)用于整個(gè)數(shù)據(jù)集。然后將數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集,或使用k折交叉驗(yàn)證來(lái)擬合并評(píng)估機(jī)器學(xué)習(xí)模型。 1.準(zhǔn)備數(shù)據(jù)集 2.分割數(shù)據(jù) 3.評(píng)估模型 盡管這是一種常見(jiàn)的方法,但在大多數(shù)情況下很可能是不正確的。 在分割數(shù)據(jù)進(jìn)行模型評(píng)估之前使用數(shù)據(jù)準(zhǔn)備技術(shù)可能會(huì)導(dǎo)致數(shù)據(jù)泄漏, 進(jìn)而可能導(dǎo)致錯(cuò)誤評(píng)估模型的性能。 數(shù)據(jù)泄漏是指保留數(shù)據(jù)集(例如測(cè)試集或驗(yàn)證數(shù)據(jù)集)中的信息出現(xiàn)在訓(xùn)練數(shù)據(jù)集中,并被模型使用的問(wèn)題。這種泄漏通常很小且微妙,但會(huì)對(duì)性能產(chǎn)生顯著影響。 ‘’…泄漏意味著信息會(huì)提供給模型,這給它做出更好的預(yù)測(cè)帶來(lái)了不真實(shí)的優(yōu)勢(shì)。當(dāng)測(cè)試數(shù)據(jù)泄漏到訓(xùn)練集中時(shí),或者將來(lái)的數(shù)據(jù)泄漏到過(guò)去時(shí),可能會(huì)發(fā)生這種情況。當(dāng)模型應(yīng)用到現(xiàn)實(shí)世界中進(jìn)行預(yù)測(cè)時(shí),只要模型訪(fǎng)問(wèn)了它不應(yīng)該訪(fǎng)問(wèn)的信息,就是泄漏。 —第93頁(yè),機(jī)器學(xué)習(xí)的特征工程,2018年。” 將數(shù)據(jù)準(zhǔn)備技術(shù)應(yīng)用于整個(gè)數(shù)據(jù)集會(huì)發(fā)生數(shù)據(jù)泄漏。 數(shù)據(jù)泄漏的直接形式是指我們?cè)跍y(cè)試數(shù)據(jù)集上訓(xùn)練模型。而當(dāng)前情況是數(shù)據(jù)泄漏的間接形式,是指訓(xùn)練過(guò)程中,模型可以使用匯總統(tǒng)計(jì)方法捕獲到有關(guān)測(cè)試數(shù)據(jù)集的一些知識(shí)。對(duì)于初學(xué)者而言很難察覺(jué)到第二種類(lèi)型的數(shù)據(jù)泄露。 “重采樣的另一個(gè)方面與信息泄漏的概念有關(guān),信息泄漏是在訓(xùn)練過(guò)程中(直接或間接)使用測(cè)試集數(shù)據(jù)。這可能會(huì)導(dǎo)致過(guò)于樂(lè)觀的結(jié)果,這些結(jié)果無(wú)法在將來(lái)的數(shù)據(jù)上復(fù)現(xiàn)。 —第55頁(yè),特征工程與選擇,2019年。” 例如,在某些情況下我們要對(duì)數(shù)據(jù)進(jìn)行歸一化,即將輸入變量縮放到0-1范圍。 當(dāng)我們對(duì)輸入變量進(jìn)行歸一化時(shí),首先要計(jì)算每個(gè)變量的最大值和最小值, 并利用這些值去縮放變量. 然后將數(shù)據(jù)集分為訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集,但是這樣的話(huà)訓(xùn)練數(shù)據(jù)集中的樣本對(duì)測(cè)試數(shù)據(jù)集中的數(shù)據(jù)信息有所了解。數(shù)據(jù)已按全局最小值和最大值進(jìn)行了縮放,因此,他們掌握了更多有關(guān)變量全局分布的信息。 幾乎所有的數(shù)據(jù)準(zhǔn)備技術(shù)都會(huì)導(dǎo)致相同類(lèi)型的泄漏。例如,標(biāo)準(zhǔn)化估計(jì)了域的平均值和標(biāo)準(zhǔn)差,以便縮放變量;甚至是估算缺失值的模型或統(tǒng)計(jì)方法也會(huì)從全部數(shù)據(jù)集中采樣來(lái)填充訓(xùn)練數(shù)據(jù)集中的值。 解決方案很簡(jiǎn)單。 數(shù)據(jù)準(zhǔn)備工作只能在訓(xùn)練數(shù)據(jù)集中進(jìn)行。也就是說(shuō),任何用于數(shù)據(jù)準(zhǔn)備工作的系數(shù)或模型都只能使用訓(xùn)練數(shù)據(jù)集中的數(shù)據(jù)行。 一旦擬合完,就可以將數(shù)據(jù)準(zhǔn)備算法或模型應(yīng)用于訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集。 1.分割數(shù)據(jù)。 2.在訓(xùn)練數(shù)據(jù)集上進(jìn)行數(shù)據(jù)準(zhǔn)備。 3.將數(shù)據(jù)準(zhǔn)備技術(shù)應(yīng)用于訓(xùn)練和測(cè)試數(shù)據(jù)集。 4.評(píng)估模型。 更普遍的是,僅在訓(xùn)練數(shù)據(jù)集上進(jìn)行整個(gè)建模工作來(lái)避免數(shù)據(jù)泄露。這可能包括數(shù)據(jù)轉(zhuǎn)換,還包括其他技術(shù),例如特征選擇,降維,特征工程等等。這意味著所謂的“模型評(píng)估”實(shí)際上應(yīng)稱(chēng)為“建模過(guò)程評(píng)估”。 “為了使任何重采樣方案都能產(chǎn)生可泛化到新數(shù)據(jù)的性能估算,建模過(guò)程中必須包含可能顯著影響模型有效性的所有步驟。
—第54-55頁(yè),特征工程與選擇,2019年。”
既然我們已經(jīng)熟悉如何應(yīng)用數(shù)據(jù)準(zhǔn)備以避免數(shù)據(jù)泄漏,那么讓我們來(lái)看一些可行的示例。 準(zhǔn)備訓(xùn)練和測(cè)試數(shù)據(jù)集 在本節(jié)中,我們利用合成二進(jìn)制分類(lèi)數(shù)據(jù)集分出訓(xùn)練集和測(cè)試集,并使用這兩個(gè)數(shù)據(jù)集評(píng)估邏輯回歸模型, 其中輸入變量已歸一化。 首先,讓我們定義合成數(shù)據(jù)集。 我們將使用make_classification()函數(shù)創(chuàng)建包含1000行數(shù)據(jù)和20個(gè)數(shù)值型特征的數(shù)據(jù)。下面的示例創(chuàng)建了數(shù)據(jù)集并總結(jié)了輸入和輸出變量數(shù)組的形狀。
運(yùn)行這段代碼會(huì)得到一個(gè)數(shù)據(jù)集, 數(shù)據(jù)集的輸入部分有1000行20列, 20列對(duì)應(yīng)20個(gè)輸入變量, 輸出變量包含1000個(gè)樣例對(duì)應(yīng)輸入數(shù)據(jù),每行一個(gè)值。
接下來(lái)我們要在縮放后的數(shù)據(jù)上評(píng)估我們的模型, 首先從原始或者說(shuō)錯(cuò)誤的方法開(kāi)始。 用原始方法進(jìn)行訓(xùn)練集-測(cè)試集評(píng)估 原始方法首先對(duì)整個(gè)數(shù)據(jù)集應(yīng)用數(shù)據(jù)準(zhǔn)備方法,其次分割數(shù)據(jù)集,最后評(píng)估模型。 我們可以使用MinMaxScaler類(lèi)對(duì)輸入變量進(jìn)行歸一化,該類(lèi)首先使用默認(rèn)配置將數(shù)據(jù)縮放到0-1范圍,然后調(diào)用fit_transform()函數(shù)將變換擬合到數(shù)據(jù)集并同步應(yīng)用于數(shù)據(jù)集。得到歸一化的輸入變量,其中數(shù)組中的每一列都分別進(jìn)行過(guò)歸一化(例如,計(jì)算出了自己的最小值和最大值)。
下一步,我們使用train_test_split函數(shù)將數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集, 其中67%的數(shù)據(jù)用作訓(xùn)練集,剩下的33%用作測(cè)試集。
通過(guò)LogisticRegression 類(lèi)定義邏輯回歸算法,使用默認(rèn)配置, 并擬合訓(xùn)練數(shù)據(jù)集。
擬合模型可以對(duì)測(cè)試集的輸入數(shù)據(jù)做出預(yù)測(cè),然后我們可以將預(yù)測(cè)值與真實(shí)值進(jìn)行比較,并計(jì)算分類(lèi)準(zhǔn)確度得分。
把上述代碼結(jié)合在一起,下面列出了完整的示例。
運(yùn)行上述代碼, 首先會(huì)將數(shù)據(jù)歸一化, 然后把數(shù)據(jù)分成測(cè)試集和訓(xùn)練集,最后擬合并評(píng)估模型。 由于學(xué)習(xí)算法和評(píng)估程序的隨機(jī)性,您的具體結(jié)果可能會(huì)有所不同。 在本例中, 模型在測(cè)試集上的準(zhǔn)確率為84.848%
我們已經(jīng)知道上述代碼中存在數(shù)據(jù)泄露的問(wèn)題, 所以模型的準(zhǔn)確率估算是有誤差的。 接下來(lái),讓我們來(lái)學(xué)習(xí)如何正確的進(jìn)行數(shù)據(jù)準(zhǔn)備以避免數(shù)據(jù)泄露。 用正確的數(shù)據(jù)準(zhǔn)備方法進(jìn)行訓(xùn)練集-測(cè)試集評(píng)估 利用訓(xùn)練集-測(cè)試集分割評(píng)估來(lái)執(zhí)行數(shù)據(jù)準(zhǔn)備的正確方法是在訓(xùn)練集上擬合數(shù)據(jù)準(zhǔn)備方法,然后將變換應(yīng)用于訓(xùn)練集和測(cè)試集。
這要求我們首先將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集。 然后,我們可以定義MinMaxScaler并在訓(xùn)練集上調(diào)用fit()函數(shù),然后在訓(xùn)練集和測(cè)試集上應(yīng)用transform()函數(shù)來(lái)歸一化這兩個(gè)數(shù)據(jù)集。
我們只用了訓(xùn)練集而非整個(gè)數(shù)據(jù)集中的數(shù)據(jù)來(lái)對(duì)每個(gè)輸入變量計(jì)算最大值和最小值, 這樣就可以避免數(shù)據(jù)泄露的風(fēng)險(xiǎn)。 然后可以按照之前的評(píng)估過(guò)程對(duì)模型評(píng)估。 整合之后, 完整代碼如下:
運(yùn)行示例會(huì)將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集,對(duì)數(shù)據(jù)進(jìn)行正確的歸一化,然后擬合并評(píng)估模型。 由于學(xué)習(xí)算法和評(píng)估程序的隨機(jī)性,您的具體結(jié)果可能會(huì)有所不同。 在本例中,我們可以看到該模型在測(cè)試集上預(yù)測(cè)準(zhǔn)確率約為85.455%,這比上一節(jié)中由于數(shù)據(jù)泄漏達(dá)到84.848%的準(zhǔn)確性更高。 我們預(yù)期數(shù)據(jù)泄漏會(huì)導(dǎo)致對(duì)模型性能的錯(cuò)誤估計(jì),并以為數(shù)據(jù)泄漏會(huì)樂(lè)觀估計(jì),例如有更好的性能。然而在示例中,我們可以看到數(shù)據(jù)泄漏導(dǎo)致性能更差了。這可能是由于預(yù)測(cè)任務(wù)的難度。
用K折交叉驗(yàn)證進(jìn)行數(shù)據(jù)準(zhǔn)備 在本節(jié)中,我們將在合成的二分類(lèi)數(shù)據(jù)集上使用K折交叉驗(yàn)證評(píng)估邏輯回歸模型, 其中輸入變量均已歸一化。 您可能還記得k折交叉驗(yàn)證涉及到將數(shù)據(jù)集分成k個(gè)不重疊的數(shù)據(jù)組。然后我們只用一組數(shù)據(jù)作為測(cè)試集, 其余的數(shù)據(jù)都作為訓(xùn)練集對(duì)模型進(jìn)行訓(xùn)練。將此過(guò)程重復(fù)K次,以便每組數(shù)據(jù)都有機(jī)會(huì)用作保留測(cè)試集。最后輸出所有評(píng)估結(jié)果的均值。 k折交叉驗(yàn)證過(guò)程通常比訓(xùn)練測(cè)試集劃分更可靠地估計(jì)了模型性能,但由于反復(fù)擬合和評(píng)估,它在計(jì)算成本上更加昂貴。 我們首先來(lái)看一下使用k折交叉驗(yàn)證的原始數(shù)據(jù)準(zhǔn)備。 用K折交叉驗(yàn)證進(jìn)行原始數(shù)據(jù)準(zhǔn)備 具有交叉驗(yàn)證的原始數(shù)據(jù)準(zhǔn)備首先要對(duì)數(shù)據(jù)進(jìn)行變換,然后再進(jìn)行交叉驗(yàn)證過(guò)程。 我們將使用上一節(jié)中準(zhǔn)備的合成數(shù)據(jù)集并直接將數(shù)據(jù)標(biāo)準(zhǔn)化。
首先要定義k折交叉驗(yàn)證步驟。我們將使用重復(fù)分層的10折交叉驗(yàn)證,這是分類(lèi)問(wèn)題的最佳實(shí)踐。重復(fù)是指整個(gè)交叉驗(yàn)證過(guò)程要重復(fù)多次,在本例中要重復(fù)三次。分層意味著每組樣本各類(lèi)別樣本的比例與原始數(shù)據(jù)集中相同。我們將使用k = 10的10折交叉驗(yàn)證。 我們可以使用RepeatedStratifiedKFold(設(shè)置三次重復(fù)以及10折)來(lái)實(shí)現(xiàn)上述方案,然后使用cross_val_score()函數(shù)執(zhí)行該過(guò)程,傳入定義好的模型,交叉驗(yàn)證對(duì)象和要計(jì)算的度量(在本例中使用的是準(zhǔn)確率 )。
然后,我們可以記錄所有重復(fù)和折疊的平均準(zhǔn)確度。 綜上,下面列出了使用帶有數(shù)據(jù)泄漏的數(shù)據(jù)準(zhǔn)備進(jìn)行交叉驗(yàn)證評(píng)估模型的完整示例。
運(yùn)行上述代碼, 首先對(duì)數(shù)據(jù)進(jìn)行歸一化,然后使用重復(fù)分層交叉驗(yàn)證對(duì)模型進(jìn)行評(píng)估。 由于學(xué)習(xí)算法和評(píng)估程序的隨機(jī)性,您的具體結(jié)果可能會(huì)有所不同。 在本例中,我們可以看到該模型達(dá)到了約85.300%的估計(jì)準(zhǔn)確度,由于數(shù)據(jù)準(zhǔn)備過(guò)程中存在數(shù)據(jù)泄漏,我們知道該估計(jì)準(zhǔn)確度是不正確的。
接下來(lái),讓我們看看如何使用交叉驗(yàn)證評(píng)估模型同時(shí)避免數(shù)據(jù)泄漏。 具有正確數(shù)據(jù)準(zhǔn)備的交叉驗(yàn)證評(píng)估 使用交叉驗(yàn)證時(shí),沒(méi)有數(shù)據(jù)泄漏的數(shù)據(jù)準(zhǔn)備工作更具挑戰(zhàn)性。 它要求在訓(xùn)練集上進(jìn)行數(shù)據(jù)準(zhǔn)備,并在交叉驗(yàn)證過(guò)程中將其應(yīng)用于訓(xùn)練集和測(cè)試集,例如行的折疊組。 我們可以通過(guò)定義一個(gè)建模流程來(lái)實(shí)現(xiàn)此目的,在要擬合和評(píng)估的模型中該流程定義了要執(zhí)行的數(shù)據(jù)準(zhǔn)備步驟的順序和結(jié)束條件。 “ 為了提供可靠的方法,我們應(yīng)該限制自己僅在訓(xùn)練集上開(kāi)發(fā)一系列預(yù)處理技術(shù),然后將這些技術(shù)應(yīng)用于將來(lái)的數(shù)據(jù)(包括測(cè)試集)。
—第55頁(yè),特征工程與選擇,2019年。”
評(píng)估過(guò)程從錯(cuò)誤地僅評(píng)估模型變?yōu)檎_地將模型和整個(gè)數(shù)據(jù)準(zhǔn)備流程作為一個(gè)整體單元一起評(píng)估。 這可以使用Pipeline類(lèi)來(lái)實(shí)現(xiàn)。 此類(lèi)使用一個(gè)包含定義流程的步驟的列表。列表中的每個(gè)步驟都是一個(gè)包含兩個(gè)元素的元組。第一個(gè)元素是步驟的名稱(chēng)(字符串),第二個(gè)元素是步驟的配置對(duì)象,例如變換或模型。盡管我們可以在序列中使用任意數(shù)量的轉(zhuǎn)換,但是僅在最后一步才應(yīng)用到模型。
之后我們把配置好的對(duì)象傳入cross_val_score()函數(shù)進(jìn)行評(píng)估。
綜上所述,下面列出了使用交叉驗(yàn)證時(shí)正確執(zhí)行數(shù)據(jù)準(zhǔn)備而不會(huì)造成數(shù)據(jù)泄漏的完整示例。
運(yùn)行該示例可在評(píng)估過(guò)程進(jìn)行交叉驗(yàn)證時(shí)正確地歸一化數(shù)據(jù),以避免數(shù)據(jù)泄漏。 由于學(xué)習(xí)算法和評(píng)估程序的隨機(jī)性,您的具體結(jié)果可能會(huì)有所不同。 本例中,我們可以看到該模型的估計(jì)準(zhǔn)確性約為85.433%,而數(shù)據(jù)泄漏方法的準(zhǔn)確性約為85.300%。 與上一節(jié)中的訓(xùn)練測(cè)試集劃分示例一樣,消除數(shù)據(jù)泄露帶來(lái)了性能上的一點(diǎn)提高, 雖然直覺(jué)上我們會(huì)認(rèn)為它應(yīng)該會(huì)帶來(lái)下降, 以為數(shù)據(jù)泄漏會(huì)導(dǎo)致對(duì)模型性能的樂(lè)觀估計(jì)。但是,這些示例清楚地表明了數(shù)據(jù)泄漏確實(shí)會(huì)影響模型性能的估計(jì)以及在拆分?jǐn)?shù)據(jù)后通過(guò)正確執(zhí)行數(shù)據(jù)準(zhǔn)備來(lái)糾正數(shù)據(jù)泄漏的方法。
總結(jié) 在本教程中,您學(xué)習(xí)了評(píng)估機(jī)器學(xué)習(xí)模型時(shí)如何避免在數(shù)據(jù)準(zhǔn)備期間出現(xiàn)數(shù)據(jù)泄露的問(wèn)題。 具體來(lái)說(shuō),您了解到:
直接將數(shù)據(jù)準(zhǔn)備方法應(yīng)用于整個(gè)數(shù)據(jù)集會(huì)導(dǎo)致數(shù)據(jù)泄漏,從而導(dǎo)致對(duì)模型性能的錯(cuò)誤估計(jì)。
為了避免數(shù)據(jù)泄漏,必須僅在訓(xùn)練集中進(jìn)行數(shù)據(jù)準(zhǔn)備。
如何在Python中為訓(xùn)練集-測(cè)試集分割和k折交叉驗(yàn)證實(shí)現(xiàn)數(shù)據(jù)準(zhǔn)備而又不會(huì)造成數(shù)據(jù)泄漏。
-
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86223 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1223瀏覽量
25283
原文標(biāo)題:準(zhǔn)備數(shù)據(jù)時(shí)如何避免數(shù)據(jù)泄漏
文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論