七 機器學習之路 訓練集 測試集及如何劃分

2021-08-10 03:00:06 字數 2916 閱讀 9174

上乙個部落格講了乙個簡單的例子,根據手頭的房子大小和房價的資料來擬合房子大小和房價的關係曲線,當然這是乙個非常簡單的一元一次方程,y=ax+b。但是最後咱們還少了一樣東西,不知道細心的同學有沒有發現,那就是咱們擬合曲線的準確度到底有多少呢?怎麼來檢測咱們擬合曲線到底有多完美呢?用什麼來驗證咱們的準確度呢?

帶著一肚子疑問,咱們就先來介紹一下資料擬合中的訓練集,測試集,驗證集。字比較多,但都很容易懂,耐心看下去會收穫不少哦。

訓練集(training set):幫助我們訓練模型,簡單的說就是通過訓練集的資料讓我們確定擬合曲線的引數。

驗證集(validation set):用來做模型選擇(model selection),即做模型的最終優化及確定的,用來輔助我們的模型的構建,可選;

測試集(test set):為了測試已經訓練好的模型的精確度。當然,test set這並不能保證模型的正確性,他只是說相似的資料用此模型會得出相似的結果。因為我們在訓練模型的時候,引數全是根據現有訓練集裡的資料進行修正、擬合,有可能會出現過擬合的情況,即這個引數僅對訓練集裡的資料擬合比較準確,這個時候再有乙個資料需要利用模型**結果,準確率可能就會很差。

但實際應用中,一般只將資料集分成兩類,即訓練集training set 和測試集test set,大多數文章並不涉及驗證集validation set。如果後面碰到有這樣的問題,我會再跟大家講解。

細心的小夥伴可能會發現,我們上個房價**的例子裡,將所有的資料用做訓練集,而並沒有測試集來測試模型的準確度,因為資料是我編的哈哈,太少了,還沒涉及到測試模型的問題。別著急,一步一步來,我先介紹一下sklearn裡是怎麼將手頭已有的資料分為訓練集和測試集的。

訓練集和測試集的劃分方法

以下講解摘自周志華老師的《機器學習》一書。同時大家可以先參考饃饃momo博主的如何劃分訓練集和測試集的介紹,講的比較簡單、精煉。

-留出法(hold-out)

留出法的意思是直接將資料集d劃分為兩個互斥的集合,其中乙個集合作為訓練集s,另乙個集合作為測試集t,即d=

s∪t ,s∩

t=∅ 。在s上訓練出模型後,用t來評估其誤差。

需要注意的是,訓練/測試集的劃分要盡可能保持資料分布的一致性,避免因資料劃分過程引入的額外的偏差而對最終結果產生影響。例如在分類任務中,至少要保持樣本的類別比例相似。從」取樣」的角度來看待資料集的劃分過程,則保留類別比例的取樣方式通常稱為「分層取樣」。例如從1000個資料裡,分層取樣獲得70%樣本的訓練集s和30%樣本的測試集t,若d包含500個正例,500個反例,則分層取樣得到的s應包含350個正例,350個反例,t應包含150個正例,150個反例;若s、t中樣本比例差別很大,則最終擬合的誤差將會變大。

一般,在用留出法劃分集合的時候,會通過若干次隨機劃分、重複實驗評估後取平均值作為留出法的評估結果,減少誤差。

留出法還有乙個問題就是,到底我們訓練集和測試集應該按照什麼比例來劃分呢?70% ?60% ? 50% ???,如果我們訓練集的比例比較大,可能會導致訓練出的模型更接近於用d訓練出的模型,同時t較小,評價結果又不夠準確;若t的比例比較大,則有可能導致評估的模型與之前有較大的差別,從而降低了評估的保真性。這個問題沒有完美的解決方案,常見的做法是將大約2/3~4/5的樣本用於訓練。

-交叉驗證法(cross validation)

」交叉驗證法」先將資料集d劃分為k個大小相似的互斥子集,即d=

d1∪d

2∪..

.∪dk

,di∩

dj=∅

(i≠j

) 。每個子集都盡可能保持資料分布的一致性,即從d中通過分層取樣得到。然後,每次用k-1個子集的並集作為訓練集,餘下的子集作為測試集;這樣就可以獲得k組訓練/測試集,從而可以進行k次訓練和測試,最終返回的是k個測試結果的均值。

顯然,交叉驗證法評估結果的穩定性和保真性在很大程度上取決於k的取值,為了強調這一點,通常把交叉驗證法稱為」k折交叉驗證」(k-fold cross validation),k通常取10—10折交叉驗證。

交叉驗證的好處就是從有限的資料中盡可能挖掘多的資訊,從各種角度去學習我們現有的有限的資料,避免出現區域性的極值。在這個過程中無論是訓練樣本還是測試樣本都得到了盡可能多的學習。(by 知乎 張戎

交叉驗證簡介)

交叉驗證法的缺點就是,當資料集比較大時,訓練模型的開銷較大。

我們當然想用手頭所有的資料來訓練模型了,這樣才能更好的擬合,留出法和交叉驗證法都將保留了部分資料用於測試,因此實際評估的模型所使用的訓練集比d小,這必然會引入一些因訓練樣本規模不同而導致的估計偏差。

自助法是乙個比較好的解決方案。給定m個樣本的資料集d,我們對它進行取樣產生資料集d′

,每次隨機從d中挑選乙個樣本,將其拷貝到d′

,這個過程執行m次後,我們就得到了包含m個樣本的資料集d′

。顯然,d中有部分樣本會在d′

中多次出現。做個簡單的估計,樣本在m次取樣中始終不被採到的概率是(1

−1m)

m ,取極限為

limx→∞

(1−1

m)m=

1e≈0.368

即通過自助取樣,初始資料集d中約有36.8%的樣本未出現在取樣集d′

裡。於是 ,實際評估的模型與期望評估的模型都是使用m個樣本,而我們仍有資料總量約1/3的沒在訓練集出現過的樣本用於測試。

自助法在資料集較小、難以有效劃分訓練/測試集時比較有用。然而自助法產生的測試集改變了初始資料集的分布,這會引入誤差,因此在資料集比較大時,採用留出法和交叉驗證法較好。

機器學習 訓練集 驗證集 測試集

為什麼要將資料集分為訓練集 驗證集 測試集三部分?對於很多機器學習的初學者來說,這個問題常常令人很迷惑,特別是對於驗證集和測試集的區別更讓人摸不到頭腦。下面,我談一下這三個資料集的作用,及必要性 訓練集 顯然,每個模型都需要訓練集,訓練集的作用很明顯,就是直接參與模型的訓練過程。測試集 測試集完全不...

機器學習的訓練集 驗證集和測試集

在機器學習中,最佳的資料分類情況是把資料集分為三部分,分別為 訓練集 train set 驗證集 validation set 和測試集 test set 訓練集很好理解就是訓練我們的模型。那麼驗證集和測試集有什麼作用?首先需要了解的是在乙個機器學習模型中,模型的引數分為普通引數和超引數,普通引數比...

機器學習中的訓練集 驗證集 測試集

訓練集用來訓練模型,即確定模型的權重和偏置這些引數,通常我們稱這些引數為學習引數。而驗證集用於模型的選擇,更具體地來說,驗證集並不參與學習引數的確定,也就是驗證集並沒有參與梯度下降的過程。驗證集只是為了選擇超引數,比如網路層數 網路節點數 迭代次數 學習率這些都叫超引數。比如在k nn演算法中,k值...