一文簡述如何使用嵌套交叉驗證方法處理時序數據

2021-02-20 Datawhale

選自toward data science

作者:Courtney Cochrane

編譯:機器之心

本文簡要講解了交叉驗證和嵌套交叉驗證,並介紹了針對單個時序數據和多個時序數據的嵌套交叉驗證方法。

本文討論了對時序數據使用傳統交叉驗證的一些缺陷。具體來說,我們解決了以下問題:

1)在不造成數據洩露的情況下,對時序數據進行分割;2)在獨立測試集上使用嵌套交叉驗證得到誤差的無偏估計;3)對包含多個時序的數據集進行交叉驗證。


本文主要針對缺乏如何對包含多個時間序列的數據使用交叉驗證的在線信息。

本文有助於任何擁有時間序列數據,尤其是多個獨立的時間序列數據的人。這些方法是在醫療研究中被設計用於處理來自多個參與人員的醫療時序數據的。

交叉驗證

交叉驗證(CV)是一項很流行的技術,用於調節超參數,是一種具備魯棒性的模型性能評價技術。兩種最常見的交叉驗證方式分別是 k 折交叉驗證和 hold-out 交叉驗證。

由於文獻中術語的不同,本文中我們將明確定義交叉驗證步驟。首先,將數據集分割為兩個子集:訓練集和測試集。如果有需要被調整的參數,我們將訓練集分為訓練子集和驗證集。模型在訓練子集上進行訓練,在驗證集上將誤差最小化的參數將最終被選擇。最後,模型使用所選的參數在整個訓練集上進行訓練,並且記錄測試集上的誤差。

圖 1:hold-out 交叉驗證的例子。數據被分為訓練集和測試集。然後訓練集進一步進行分割:一部分用來調整參數(訓練子集),另一部分用來驗證模型(驗證集)。

為什麼時序數據的交叉驗證會有所不同?

在處理時序數據時,不應該使用傳統的交叉驗證方法(如 k 折交叉驗證),原因有2:

1. 時序依賴

為了避免數據洩露,要特別注意時間序列數據的分割。為了準確地模擬「我們現在所處、預測未來的真實預測環境」(Tashman 2000),預測者必須保留用於擬合模型的事件之後發生的事件的數據。因此,對於時間序列數據而言,我們沒有使用 k 折交叉驗證,而是使用 hold-out 交叉驗證,其中一個數據子集(按照時間順序分割)被保留下來用於驗證模型性能。例如,圖 1 中的測試集數據在時間順序上是位於訓練數據之後的。類似地,驗證集也在訓練集之後。

2. 任意選擇測試集

你可能注意到了,圖 1 中測試集的選擇是相當隨意的,這種選擇也意味著我們的測試集誤差是在獨立測試集上不太好的誤差估計。為了解決這個問題,我們使用了一種叫做嵌套交叉驗證(Nested Cross-Validation)的方法。嵌套交叉驗證包含一個用於誤差估計的外循環,以及一個用於調參的內循環(如圖 2 所示)。內循環所起的作用和之前談到的一樣:訓練集被分割成一個訓練子集和一個驗證集,模型在訓練子集上訓練,然後選擇在驗證集上能夠使誤差最小化的參數。但是,現在我們增加了一個外循環,它將數據集分割成多個不同的訓練集和測試集,為了計算模型誤差的魯棒估計,對每一次分割的誤差求平均值。這樣做是有優勢的:

嵌套交叉驗證過程可以提供一個幾近無偏的真實誤差估計。(Varma and Simon 2006)

圖 2:嵌套交叉驗證示例

用於時間序列的嵌套交叉驗證

我們推薦兩種嵌套交叉驗證的方法,來處理僅具有一個時間序列的數據。我們也會處理來自一個病人/參與者的多天醫療數據:

1. 預測後一半(Predict Second Half)

2. 日前向鏈(Day Forward-Chaining)

預測後一半


第一種方法「預測後一半」,這是嵌套交叉驗證的「基本情況」,只有一次訓練/測試分割。它的優勢是這種方法易於實現;然而,它仍然面臨著任意選擇測試集的局限性。前一半數據(按照時間分割的)作為訓練集,後一半數據成為測試集。驗證集的大小可以根據給定問題的不同而變化(例如圖 3 中的例子用一天的數據作為驗證集),但是保證驗證集的時間順序在訓練子集後面是非常重要的。

圖 3:預測後一半嵌套交叉驗證方法

日前向鏈(Day Forward-Chaining)

預測後一半嵌套交叉驗證方法的一個缺陷是 hold-out 測試集的任意選擇會導致在獨立測試集上預測誤差的有偏估計。為了生成對模型預測誤差的更好估計,一個常用的方法就是進行多次訓練/測試分割,然後計算這些分割上的誤差平均值。我們使用日前向鏈技術是一種基於前向鏈(Forward-Chaining)的方法(在文獻中也被稱為 rolling-origin evaluation(Tashman,2000)和 rolling-origin-recalibration evaluation(Bergmeir & Benitez,2012))。利用這種方法,我們將每天的數據作為測試集,並將以前的所有數據分配到訓練集中。例如,如果數據集有五天,那麼我們將生成三個不同的訓練和測試分割,如圖 4 所示。請注意,在本示例中,我們有三次拆分,而不是五次拆分,因為我們需要確保至少有一天的訓練和驗證數據可用。該方法產生許多不同的訓練/測試分割,並且對每個分割上的誤差求平均,以計算模型誤差的魯棒估計。

圖 4:日前向鏈嵌套交叉驗證

注意,在這個例子中我們使用「日」前向鏈,但是也可以在每個數據點上進行迭代,而不是按天迭代(但這明顯意味著更多的拆分)。

多時序嵌套交叉驗證

現在有兩種分割單個時間序列的方法,接下來我們將討論如何處理具有多個不同時間序列的數據集。同樣,我們使用兩種方法:

常規(regular)

「常規」嵌套交叉驗證(regular nested cross-validation)的訓練集/驗證集/測試集分割基本思路和之前的描述是一樣的。唯一的變化是現在的分割包含了來自數據集中不同參與者的數據。如果有兩個參與者 A 和 B,那麼訓練集將包含來自參與者 A 的前半天的數據和來自參與者 B 的前半天的數據。同樣,測試集將包含每個參與者的後半天數據。

群體知情(Population-Informed)

對於「群體知情嵌套交叉驗證」方法而言,我們利用了不同參與者數據之間的獨立性。這使得我們打破嚴格的時間順序,至少在個人數據之間(在個人數據內打破嚴格時序仍然是必要的)。由於這種獨立性,我們可以稍微修改常規嵌套交叉驗證算法。現在,測試集和驗證集僅包含來自一個參與者(例如參與者 A)的數據,並且數據集中所有其他參與者的所有數據都被允許存在於訓練集中。圖 5 描述了這種方法是如何適用於群體知情的日前向鏈嵌套交叉驗證的。該圖顯示,參與者 A 第 18 天的數據是測試集(紅色),之前三天是驗證集(黃色),訓練集(綠色)包含參與者 A 的所有先前數據以及其他參與者(本例中為 B、C、D 和 E)的所有數據。需要強調的一點是,由於其他參與者的時間序列的獨立性,使用這些參與者的「未來」觀測不會造成數據洩漏。

圖 5:群體知情日前向鏈(Population-Informed Day Forward-Chaining)交叉驗證示例。其中除了對參與者 A 的日前向鏈方法(左圖),我們也允許其他參與者的數據存在於訓練集中(右圖)。請注意,灰色線條表示參與者睡眠的時間。

最後,我們總結了不同嵌套交叉驗證方法的優缺點,特別是獨立測試集誤差估計的計算時間和偏差。分割的次數假定數據集包含 p 個參與者,以及每個參與者共有 d 天的數據。

總結

我們首先回顧了交叉驗證,並列舉了使用嵌套交叉驗證的基本原理。然後討論了如何在不造成數據洩漏的情況下分割單個時間序列數據,具體提出了兩種方法:預測後一半嵌套交叉驗證和日前向鏈嵌套交叉驗證。接著我們討論了如何處理多個獨立的時間序列,兩種方法:常規嵌套交叉驗證和群體知情嵌套交叉驗證。

原文連結:https://towardsdatascience.com/time-series-nested-cross-validation-76adba623eb9

相關焦點

  • 十分鐘看懂時序資料庫(V)- 分布式計算
    前文提到數據查詢特別是大數據量的聚合分析查詢是時序資料庫需要解決的一個主要問題,之前的文章介紹了通過預處理數據的方法,用空間換時間的思路,降低了大數據量聚合分析的延時。本文將從分布式計算方向思考,從並發的角度介紹時序資料庫如何降低數據查詢的延時。1.
  • 8種交叉驗證類型的深入解釋和可視化介紹
    ,讓我們知道為什麼在數據科學項目中應使用交叉驗證。測試數據應與訓練數據無關,以免發生數據洩漏。在使用訓練數據開發ML模型的過程中,需要評估模型的性能。這就是交叉驗證數據的重要性。已推薦使用p = 2的LpOCV變體(稱為休假配對交叉驗證)作為估計二進位分類器ROC曲線下面積的幾乎無偏的方法。2. Leave-one-out cross-validation留一法交叉驗證(LOOCV)是一種詳盡的窮盡驗證技術。
  • 使用python+sklearn實現交叉驗證
    測試集仍應保留以進行最終評估,但在進行CV時不再需要驗證集。在 k-fold CV的基本方法中,訓練集被分成 k 個較小的數據集(下面描述其他方法,但通常遵循相同的原則)。對於每個 k 「folds」,遵循以下步驟:使用 k-1 個 folds 作為訓練數據訓練模型;用數據剩餘的 1 個 folds 來驗證模型(即,將其用作測試集,以計算精度等性能指標)。
  • 數據集的劃分——交叉驗證法
    其實在機器學習中還有其他劃分數據集的方法,可以在本身數據總量就比較小時使模型達到很好的效果,我們今天介紹的交叉驗證法就是比較常用的方法,它在我們將要介紹的集成學習的Stacking算法中經常使用到。該方法依賴於k值的選取,通常取10,因此也稱為k折交叉驗證(k-fold-cross-validation),當k=1時稱為留一法(Leave-One-Out)。由於留一法在樣本量大時計算量較大,所以主要用於樣本量比較少的情況。
  • Pandas處理時序數據(初學者必會)!
    時間序列數據是同一統一指標按時間順序記錄的數據列。在同一數據列中的各個數據必須是同口徑的,要求具有可比性。時序數據可以是時期數,也可以時點數。時間序列分析的目的是通過找出樣本內時間序列的統計特性和發展規律性,構建時間序列模型,進行樣本外預測。本文目錄    1. 時序的創建        1.1.
  • 機器學習開放課程:九、基於Python分析真實手遊時序數據
    這次的開放機器學習課程的內容是時序數據。我們將查看如何使用Python處理時序數據,哪些方法和模型可以用來預測;什麼是雙指數平滑和三指數平滑;如果平穩(stationarity)不是你的菜,該怎麼辦;如何創建SARIMA並且活下來;如何使用XGBoost做出預測。所有這些都將應用於(嚴酷的)真實世界例子。
  • 機器學習乾貨|交叉驗證(Cross Validation)詳解
    交叉驗證也稱為循環估計,是統計上將數據樣本切割成較小集合的使用方法,由Seymour Geisser提出。常見的交叉驗證形式簡單交叉驗證將原始數據隨機分為兩組,一組作為訓練集,一組作為驗證集,利用訓練集訓練分類器,然後利用驗證集驗證模型,記錄最後的分類準確率的性能指標。
  • 使用python+sklearn實現Lasso 模型選擇:交叉驗證/ AIC / BIC
    使用Akaike信息標準(AIC),貝葉斯信息標準(BIC)和交叉驗證來選擇Lasso
  • 極端時序預測LSTM+AutoEncoder
    讓我們一起跟著作者的思路看下改進之後的預測效果,來吧展示~問題概述時序預測中的極端時序預測是一個經常會遇到的噩夢,今天我終於發現了處理這個問題非常有趣的一篇文章。最後,他們能夠針對不同的位置(城市)預測需求,優於傳統的預測方法。對於這個問題,Uber使用了他們的內部數據,即不同城市的出行數據,其包含了一些額外特徵:天氣信息、城市等級信息。他們的目標是以固定窗口數據(即過去一天)預測第二天的需求。為了解決這一預測任務,本文這裡複製了Uber的模型模型,它是一個模型卻為我們提供了複雜的預測功能。
  • 機器學習 | 「交叉驗證」到底如何選擇K值?
    更多的情況下,我們也用交叉驗證來進行模型選擇(model selection)。往遠了說,交叉驗證可以用於評估任何過程,但本文僅討論機器學習評估這個特定領域。交叉驗證有很長的歷史,但交叉驗證的研究有不少待解決的問題。拿最簡單的K折交叉驗證來說,如何選擇K就是一個很有意思的話題。而更有意思的是,交叉驗證往往被用於決定其他算法中的參數,如決定K近鄰算法中K的取值。
  • 時序資料庫入門系列: 時序數據的查詢
    儘管時序數據的查詢類型或者場景多種多樣,但時序資料庫的查詢類型,整體上來說主要分成原始數據查詢、聚合數據查詢等兩種類型。原始數據查詢,顧名思義,就是查詢原始數據,將寫入的數據原封不動的查詢出來。由於查詢結果粒度太細,當時間範圍較大時,結果集通常較大,業務處理起來比較困難,且較難發現蘊含在結果集中的規律性和趨勢性。
  • 交叉驗證和超參數調整:如何優化你的機器學習模型
    在第2部分中,我們看到使用隨機森林和xgboost默認超參數,並在驗證集上評估模型性能會導致多元線性回歸表現最佳,而隨機森林和xgboost回歸的表現稍差一些。在本文的這一部分中,我將討論只使用一個驗證集的缺點。除此之外,我們還會談到如何解決這些缺點以及如何調優模型超參數以提高性能。就讓我們一探究竟吧。
  • 三分鐘重新學習交叉驗證
    原標題:三分鐘重新學習交叉驗證 雷鋒網 AI 科技評論按:文章的作者 Georgios Drakos 是一名數據科學家,通過本文作者向我們介紹了交叉驗證的基本概念、作用以及如何使用。雷鋒網 AI 科技評論根據原文進行了編譯。
  • 巧用數據驗證功能、Choose嵌套函數製作二級下拉菜單
    在實際的工作中,應用到下拉菜單的地方非常多,一把情況下都是為了規範數據的輸入,放置數據冗餘,且都是一級的。如果要製作二級下拉菜單,且必須是聯動的,該如何去實現呢?
  • UVM驗證方法
    隨著實時處理要求的提高,FPGA產品在航天領域得到了廣泛使用,FPGA的設計也趨於複雜,從第三方評測機構的角度,如何對FPGA設計進行充分的驗證面臨著越來越大的挑戰。FPGA驗證的最為重要的環節就是仿真,採用傳統的Verilog或者VHDL構建測試場景的方法在大數據處理的驗證中暴露出越來越多的問題。
  • Cleanits:製造業時序數據清洗系統
    (4) 通過在真實的工業時序數據集上的開展實驗,本文驗證了系統的有效性和高效性.且通過頁面截圖展示介紹了本文所提出的系統具有有效性、用戶友好交互性等優點。 1.基於相關性的時序數據異常檢測與修復算法 4.1 方法概述
  • 使用python+sklearn實現估計器的調參方法
    GridSearchCV 實例實現估計器API:當將其「擬合」到一個數據集上時,所有可能的參數值組合都將被計算並保留最佳組合。關於數字數據集上的網格搜索計算示例,請參見使用交叉驗證網格搜索的參數估計。有關使用pipeline.Pipeline實例的帶分類器(這裡是一個使用彈性網(elastic net)和L2懲罰項的SGD訓練的線性支持向量機)的文本文檔特徵提取器(n-gram計數矢量器(count vectorizer)和TF-IDF轉換器)的網格搜索耦合參數示例,請參見文本特徵提取和評估的示例管道。有關在iris數據集上交叉驗證循環內網格搜索的示例,請參嵌套交叉驗證與非嵌套交叉驗證。
  • 如何看懂時序圖(經典)
    操作時序永遠使用是任何一片IC晶片的最主要的內容。一個晶片的所有使用細節都會在它的官方器件手冊上包含。所以使用一個器件事情,要充分做好的第一件事就是要把它的器件手冊上有用的內容提取,掌握。  4腳:RS,數據/命令選擇端,當此腳為高電平時,可以對1602進行數據字節的傳輸操作,而為電平時,則是進行命令字節的傳輸操作。命令字節,即是用來對LCD1602的一些工作方式作設置的字節;數據字節,即使用以在1602上顯示的字節。值得一提的是,LCD1602的數據是8位的。  5腳:R/W,讀寫選擇端。
  • 手把手教你做交叉驗證(Cross Validation)
    是不是常在文獻中看到「交叉驗證(Cross Validation, CV)」這個詞?卻常常感嘆為啥自己不會做?看看本文能否幫到你!
  • 兩款時序邏輯電路設計實驗方案報告解析
    驗證其功能是否正確。 四、實驗設計說明(簡述所用器件的邏輯功能,詳細說明電路的設計思路和過程) 1.所用器件及其邏輯功能 74283是一個超前進位的4位全加器,可以搭配邏輯門組4位二進位加減法器。 時序邏輯電路設計實驗報告 一、實驗目的 1.加深理解時序邏輯電路的工作原理。 2.掌握時序邏輯電路的設計方法。 3.掌握時序邏輯電路的功能測試方法。