天天看點

《寫給程式員的資料挖掘實踐指南》——5.1訓練集和測試集

本節書摘來自異步社群出版社《寫給程式員的資料挖掘實踐指南》一書中的第5章,第5.1節,作者:【美】ron zacharski(紮哈爾斯基),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

前一章的最後部分中,我們使用了3個不同的資料集:女子運動員資料集、iris資料集以及汽車mpg資料集。我們把每個資料集分成兩個子集,一個用于建構分類器,該資料集稱為訓練集(training set)。另一個資料集用于評估分類器,該資料集稱為測試集(test set)。訓練集和測試集是資料挖掘中的常用術語。

資料挖掘領域的人永遠不會在用于訓練系統的資料上進行測試!

下面以近鄰算法為例來解釋為什麼不能使用訓練資料來測試。如果上述例子中的籃球運動員marissa coleman在訓練資料中存在,那麼身高6英尺1英寸體重160磅的她就會與自己最近。是以,如果對近鄰算法進行評估時,若測試集是訓練資料的子集,那麼精确率總是接近于100%。更一般地,在評估任意資料挖掘算法時,如果測試集是訓練資料的子集,那麼結果就會十分樂觀并且過度樂觀。是以,這種做法看起來并不好。

那麼上一章使用的方法如何?我們将資料集分成兩部分。較大的那部分用于訓練,較小的那部分用于評估。事實表明這種做法也存在問題。在進行資料劃分時可能會極端不走運。例如,所有測試集中的籃球運動員都比較矮(像debbie black的身高隻有5英尺3英寸,體重隻有124磅),他們會被分成馬拉松運動員。而測試集中所有的田徑運動員就像tatyana petrova(俄羅斯馬拉松運動員,身高5英尺3英寸,體重108磅)一樣較矮、體重較輕,可能會被分成體操運動員。如果測試集像上面一樣,分類器的精确率會很差。另一方面,有時候測試集的選擇又會十分幸運。測試集中的每個人都有所從事項目的标準身高和體重,此時分類器精确率接近100%。兩種情況下,精确率都依賴于單個的測試集,并且該測試集可能并不能反映分類器應用于新資料的真實精确率。

上述問題的一種解決方法是重複多次上述過程并對結果求平均。例如,我們可以将資料分成兩半:part 1和part 2。

《寫給程式員的資料挖掘實踐指南》——5.1訓練集和測試集

我們可以使用part 1的資料來訓練分類器,而利用part 2的資料對分類器進行測試。然後,我們重複上述過程,這次用part 2訓練而用part 1測試。最後我們将兩次的結果進行平均。但是,這種方法的問題在于我們每次隻使用了一半資料進行訓練。然而,我們可以通過增加劃分的份數來解決這個問題。例如,我們可以将資料劃分成3部分,每次利用2/3的資料訓練而在其餘1/3的資料上進行測試。是以,整個過程看起來如下:

第一次疊代 使用part 1和part 2訓練,使用part 3測試

第二次疊代 使用part 1和part 3訓練,使用part 2測試

第三次疊代 使用part 2和part 3訓練,使用part 1測試

對上述結果求平均。

在資料挖掘中,最常用的劃分數目是10,這種方法稱為……

10折交叉驗證(10-fold cross validation)

使用這種方法,我們将資料集随機分成10份,使用其中9份進行訓練而将另外1份用作測試。該過程可以重複10次,每次使用的測試資料不同。

考察一個例子。假設我想建構一個分類器,該分類器對于問題“is this person a professional basketball player?”隻回答yes或no。我們的資料由500名籃球運動員和500名非籃球運動員組成。

繼續閱讀