數據集的劃分——交叉驗證法

2021-02-20 Stata and Python數據分析

本文作者:王 歌 

文字編輯:戴 雯 

技術總編:張 邯

      重大通知!!!爬蟲俱樂部於2020年7月11日至14日在線上舉行為期四天的Stata編程技術定製培訓,招生工作已經圓滿結束啦!!!

      另外,應廣大學員需求,爬蟲俱樂部將於2020年7月25日至28日線上舉行Python編程技術訓練營,本次培訓採用理論與案例相結合的方式,幫助大家在掌握Python基本思想的基礎上,學習科學計算技術與網絡數據抓取技術,詳情可點擊《Python雲端培訓課程開始報名~》,或點擊文末閱讀原文直接提交報名信息呦~

前面我們在舉例時,通常是將所使用的數據集按照75%和25%的比例劃分為訓練集和測試集,這主要是為了我們舉例方便,同時劃分後的數據量也依然符合大樣本的要求。其實在機器學習中還有其他劃分數據集的方法,可以在本身數據總量就比較小時使模型達到很好的效果,我們今天介紹的交叉驗證法就是比較常用的方法,它在我們將要介紹的集成學習的Stacking算法中經常使用到。
1方法介紹我們往往會得到多個模型,而最終選擇的模型必定是泛化能力強,也就是在未知的新數據上效果最好的模型,因此我們在訓練模型前就要將我們所掌握的數據進行劃分,嚴格來說一般會劃分為訓練集、驗證集和測試集,在訓練集上進行訓練模型,在驗證集上試驗效果、調整參數設置,在測試集上進行最終的測試。為了保證最終的效果,這三個集合不能有交集,常見的比例是8:1:1。當然,通常我們只有訓練集和測試集也是可以的,前面我們使用的樣例數據集只有幾百個,因此也沒有劃分驗證集。我們所使用的train_test_split屬於留出法,也就是隨機將一部分數據作為訓練集,剩下的作為測試集。但對樣本信息的利用往往不充分,並且需要的樣本量較大。如果我們本身樣本量有限,並且想充分利用數據集中的信息,我們可以採用交叉驗證法。交叉驗證法是將數據集劃分為k個大小相似的互斥子集,並在劃分時保持數據分布的一致性,每次用k-1個子集的併集作為訓練集,剩餘的做測試集,進行k次訓練,最後取k次結果的均值。該方法依賴於k值的選取,通常取10,因此也稱為k折交叉驗證(k-fold-cross-validation),當k=1時稱為留一法(Leave-One-Out)。由於留一法在樣本量大時計算量較大,所以主要用於樣本量比較少的情況。在實際應用中,我們只進行一次交叉驗證可能是不夠的,而要進行多次,稱為p次k折交叉驗證,一般取p=k=10。以上方法在sklearn中都有相應的類來實現,我們下面來看一下。2程序實現

       我們這裡依然使用的是鳶尾花的數據,同時使用Logistic回歸訓練模型。在sklearn中,通常使用 cross_val_predict實現k折交叉驗證,它返回的是一個使用交叉驗證以後的輸出值,若要返回準確度評分,可以使用 cross_val_score。兩者參數相同,第一個參數為所使用的分類器,第二個和第三個參數分別是屬性值和標籤值,最後一個參數 cv確定折數。我們這裡進行5折的交叉驗證,程序如下:

from sklearn.datasets import load_irisfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_score, cross_val_predictiris_sample = load_iris()x = iris_sample.datay = iris_sample.targetlrclf = LogisticRegression()predicted = cross_val_predict(lrclf, x, y, cv=5) print('5折交叉驗證預測值:', predicted)scores = cross_val_score(lrclf, x, y, cv=5)  print('評分:', scores)print('準確度:', metrics.accuracy_score(predicted, y))  

結果如下:

       若使用留一法,則要使用 LeaveOneOut類,沒有參數需要設置。具體程序如下:

from sklearn.model_selection import LeaveOneOutloo = LeaveOneOut()scores = cross_val_score(lrclf, x, y, cv=loo)predicted = cross_val_predict(lrclf, x, y, cv=loo)print('留一法預測值:', predicted)scores = cross_val_score(lrclf, x, y, cv=loo)print('評分:', scores)print('準確度:', metrics.accuracy_score(predicted, y)

結果如下:

       假設進行5次5折交叉驗證,我們使用 RepeatedKFold類,有三個參數:

(1) n_split表示要劃分的折數;

(2) n_repeats表示重複幾次;

(3) random_state設置隨機種子。

from sklearn.model_selection import RepeatedKFoldkf = RepeatedKFold(n_splits=5, n_repeats=5, random_state=0)  predicted = cross_val_predict(lrclf, x, y, cv=5)print('5次5折交叉驗證預測值:', predicted)scores = cross_val_score(lrclf, x, y, cv=kf)print('評分:', scores)print('準確度:', metrics.accuracy_score(predicted, y))

結果如下:

       在sklearn中還提供了許多其它交叉驗證的類,比如使用 ShuffleSplit類可以隨機的把數據打亂,然後分為訓練集和測試集;對於時間序列的數據,可以使用 TimeSeriesSplit;若要實現分層抽樣式的交叉驗證,可以使用 StratifiedKFold;分層隨機劃分可以使用 StratifiedShuffleSplit,等等,大家可以根據自己的需要來選擇合適的交叉驗證方式。

以上就是本期推文的全部內容啦,感興趣的小夥伴快動手試試吧~對我們的推文累計打賞超過1000元,我們即可給您開具發票,發票類別為「諮詢費」。用心做事,不負您的支持!

微信公眾號「Stata and Python數據分析」分享實用的stata、python等軟體的數據處理知識,歡迎轉載、打賞。我們是由李春濤教授領導下的研究生及本科生組成的大數據處理和分析團隊。

此外,歡迎大家踴躍投稿,介紹一些關於stata和python的數據處理和分析技巧。投稿郵箱:statatraining@163.com投稿要求:
1)必須原創,禁止抄襲;
2)必須準確,詳細,有例子,有截圖;
注意事項:
1)所有投稿都會經過本公眾號運營團隊成員的審核,審核通過才可錄用,一經錄用,會在該推文裡為作者署名,並有賞金分成。
2)郵件請註明投稿,郵件名稱為「投稿+推文名稱」。
3)應廣大讀者要求,現開通有償問答服務,如果大家遇到有關數據處理、分析等問題,可以在公眾號中提出,只需支付少量賞金,我們會在後期的推文裡給予解答。

相關焦點

  • sklearn實現數據集劃分
    小編在文章 機器學習之模型評估 介紹了數據集劃分的方法,本文從就專門針對數據集劃分的sklearn實現做一個詳細介紹。如果要進行若干次隨機劃分,那麼要使用train_test_split若干次,每次設置不同的random_state即可。也可以通過ShuffleSplit實現。ShuffleSplit分兩部分組成,第一部分Shuffle,是指對數據集進行隨機打亂;第二部分Split,就是切分的意思。也就是對數據集打亂並且切分。
  • R語言——交叉驗證法計算線性回歸模型擬合優度的第三種R方
    第三種R方的計算源於交叉驗證 (cross validation) 裡的留一法 (leave one out cross validation),交叉驗證也是當前比較熱門的機器學習裡的用來驗證模型匹配度較為常用的方法。傳統的線性回歸是對所有樣本數據進行回歸,根據線性回歸的計算公式,我們的模型能夠使得均方誤差最小。但是,如果樣本中存在異常值,就會嚴重影響我們的回歸模型的準確度。
  • 手把手教你做交叉驗證(Cross Validation)
    方法簡介交叉驗證法可以用來估計一種指定的統計學習方法的測試誤差,從而來評價這種方法的表現(模型評價),目前已成為業界評估模型性能的標準;或者為這種方法選擇合適的光滑度(模型選擇)。K折交叉驗證法(k-fold CV)是將觀測集隨機地分為k個大小基本一致的組,或者說折(fold),第一折作為驗證集,然後在剩下的k-1個折上擬合模型,均方誤差MSE1(響應變量Y為定性變量時則為錯誤率)由保留折的觀測計算得出。重複這個步驟k次,每一次把不同折作為驗證集,整個過程會得到k個測試誤差的估計MSE1,MSE2,…, MSEk。
  • 【1083.】交叉驗證是啥個意思,是換妻遊戲嗎?
    K折交叉驗證:(K-Folder Cross Validation)。和第一種方法不同,K折交叉驗證會把樣本數據隨機的分成K份,每次隨機的選擇K-1份作為訓練集,剩下的1份做測試集。當這一輪完成後,重新隨機選擇K-1份來訓練數據。若干輪(小於K)之後,選擇損失函數評估最優的模型和參數。
  • 三分鐘重新學習交叉驗證
    「交叉驗證」是一種模型驗證技術,可用於評估統計分析(模型)結果在其它獨立數據集上的泛化能力。它主要用於預測,我們可以用它來評估預測模型在實踐中的準確度。 交叉驗證的目標是定義一個數據集,以便於在訓練階段(例如,驗證數據集)中測試模型,從而限制模型過擬合、欠擬合等問題,並且幫助我們了解模型在其它獨立數據集上的泛化能力。
  • Sklearn 劃分訓練集和測試集
    因為測試集本身有標籤參照,跟模型預測的標籤一對比就能知道模型效果如何。下面我們仍然以葡萄酒數據集為例,把數據集劃分為訓練集和測試集建立模型,最後測試模型效果。這份葡萄酒數據集來源於1988 年義大利的葡萄酒產地,屬於 sklearn 自帶的分類數據集,Sklearn 自帶好幾個常用的分類和回歸數據集,之後會一一拿來做例子。
  • 判斷推理:「反向驗證法」解決可能性推理前提型題目
    今天中公教育會將上次的話題做進一步的延伸,傳授給大家新的技巧:利用「反向驗證法」解決前提型題目。一、反向驗證法的原理是什麼?前提,我們最初接觸的時候是在學習必要條件時,用《墨經》的話叫「無之必不然」。所以前提指的就是必不可少的條件。既然是必不可少的,那麼當這個前提不存在的時候,題幹的結論肯定也會不成立。即非B→非A。
  • 使用python+sklearn實現交叉驗證
    為了解決這個問題,可以將數據集的另一部分作為「驗證集(validation set)」:在訓練集上進行訓練,然後對驗證集進行評估,當實驗效果達到最佳時,對測試集進行最終評估。然而,通過將可用數據劃分為三組,我們大大減少了可用於學習模型的樣本數,並且結果可以依賴於(訓練集,驗證集)對的隨機選擇。解決這個問題的方法是一個稱為交叉驗證(cross-validation)(簡稱CV)的過程。
  • 一文簡述如何使用嵌套交叉驗證方法處理時序數據
    本文討論了對時序數據使用傳統交叉驗證的一些缺陷。具體來說,我們解決了以下問題:1)在不造成數據洩露的情況下,對時序數據進行分割;2)在獨立測試集上使用嵌套交叉驗證得到誤差的無偏估計;3)對包含多個時序的數據集進行交叉驗證。
  • 如何用R進行數據挖掘?(下)
    4、連續變量和分類變量的處理在數據處理中,對連續數據集和分類變量的非別處理是非常重要的。
  • MIND:高質量的新聞推薦數據集
    目前,許多有關新聞推薦的研究是在私有數據集上開展的,而已有的公開數據集往往規模較小。高質量基準數據集的缺乏限制了新聞推薦領域的研究進展。因此,微軟亞洲研究院聯合微軟新聞產品團隊在 ACL 2020上發布了一個大規模的英文新聞推薦數據集 MIcrosoft News Dataset (MIND[1]),並於2020年7月-9月在condalab平臺舉辦了MIND新聞推薦比賽。
  • 8種交叉驗證類型的深入解釋和可視化介紹
    ,該方法根據數據分析將數據集隨機分為訓練數據和測試數據。缺點:不適合不平衡數據集。Repeated random subsampling validation重複的隨機子採樣驗證(也稱為蒙特卡洛交叉驗證)將數據集隨機分為訓練和驗證。數據集的k倍交叉驗證不太可能分成幾類,而不是成組或成對,而是在這種情況下隨機地成組。
  • 機器學習數據分析極簡思路及sklearn算法實踐小試
    實際上,測試評估模型應該在你建模之前就考慮,例如是否需要設置純粹的外部數據驗證集,若沒有這樣的數據,你怎樣劃分數據進行建模預測?在實際訓練中,模型通常對訓練數據好,但是對訓練數據之外的數據擬合程度差。用於評價模型的泛化能力(即模型普適性)。
  • 機器學習 | 「交叉驗證」到底如何選擇K值?
    因此我們必須首先決定K折交叉驗證中的K。K折交叉驗證(K-fold cross validation)指的是把訓練數據D 分為 K份,用其中的(K-1)份訓練模型,把剩餘的1份數據用於評估模型的質量。將這個過程在K份數據上依次循環,並對得到的K個評估結果進行合併,如求平均或投票。
  • 機器學習 - 訓練集、驗證集、測試集
    通常在有了一套數據時,需要拆分為訓練集、測試集。數據集一般按比例8:2,7:3,6:4等分為訓練集和測試集。如果數據集很大,測試集不需要完全按比例分配,夠用就好。測試集完全不用於訓練模型。驗證集不是必須的。如果不需要調整超參數,則可以不用驗證集。驗證集獲得的評估結果不是模型的最終效果,而是基於當前數據的調優結果。使用所有訓練集(含從中分出的驗證集)數據和選擇的最優超參數完成最終模型構建。測試集測試評估最終模型指標,如準確率、敏感性等。
  • NBA球員數據集聚類分析
    Kmeans算法是非監督的學習裡面的一個經典算法,也是一個典型的基於距離的非層次聚類算法,在小化誤差函數的基礎上,將數據劃分為預定的類數K(這個k我們稍後說),採用距離作為相似性的評價指標,及認為倆個對象的距離越近,其相似度越高。