本文將就caret包中的數據分割部分進行介紹學習。主要包括以下函數:createDataPartition(),maxDissim(),createTimeSlices(),createFolds(),createResample(),groupKFold()等
基於輸出結果的簡單分割
createDataPartition函數用於創建平衡數據的分割。如果函數中的參數y是一個因子向量,則對每一類隨機抽樣,並且保持數據整體類別的分類。
createDataPartition(y, times = 1, p = 0.5, list = TRUE, groups = min(5, length(y)))
- y 結果向量
- times 創建分區的數目
- p 將要用於訓練的數據的百分比
- list 邏輯值。true時,返回結果為列表形式,否則,為floor(p * length(y))行 times列的矩陣
- groups 對於數值y,樣本根據百分位數分成組,並在這些子組內進行采樣。百分比的數量通過groups參數設置。
基於特征變量的分割
函數maxDissim應用最大相異方法(maximum dissimiarity approach)創建子樣本。假設有一個m個樣本的數據集A和具有n個樣本的一個大數據集B。我們希望從B中抽取和A不同的子樣本。為了這樣做,對於B中的每一個樣本,函數計算與A中每一樣本點的相異性。把B中最大相異性的點加到A並繼續。注意,計算相異性時,要加載proxy包
maxDissim(a, b, n = 2, obj = minDiss, useNames = FALSE, randomFrac = 1, verbose = FALSE, ...)
- a 小樣本數據集,矩陣或數據框
- b 大樣本數據集,矩陣或數據框
- n 子樣本的大小,其實就是最后想要找出的相異性樣本的個數
- obj 衡量總體差異的函數,常用的有minDiss,sumDiss
- useNames 邏輯值,true返回行名,false返回行索引
- randomFrac 在(0,1]中的數值,用於從剩余候選值中進行子采樣
- verbose 邏輯值,是否顯示每步過程
時間序列的數據分割
時間序列簡單隨機抽樣並不是對時間序列抽樣的最好的方法。Hyndman和Athanasopoulos(2013)討論了rolling forecasting origin技術。caret包 包含了createTimeSlices函數,它能創建這種類型的切片。
createTimeSlices(y, initialWindow, horizon = 1, fixedWindow = TRUE, skip = 0)
- y 結果向量,按年代或其他時間順序
- initialWindow 每個訓練集樣本中連續值的初始數量
- horizon 測試樣本中的連續值的數量
- fixedWindow 邏輯值,false時,所有訓練樣本從1開始
- skip 整數,how many (if any) resamples to skip to thin the total amount
horizon參數值不同時的情形:horizon分別為1,3時,測試樣本的數量分別為1,3
fixedWindow分別為TRUE和FALSE時的情形,可見為false時,訓練樣本總是從頭開始。
skip參數,注意skip為3時,不同訓練樣本的第一個索引依次加4
其他類似函數
此外,在制造訓練集時,還有以下可能用到的函數
1、 createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)
其中,k是folds的數目,list,是否以列表形式返回,returnTrain,false時返回的是測試集的索引,true時返回的是訓練集的索引(僅當list=TRUE時,returnTrain=TRUE才有效)
2、 createResample(data,k)
其中,k是創建訓練樣本的個數
3、 groupKFold(group, k = length(unique(group)))
其中,k是folds的數目
參考:http://topepo.github.io/caret/data-splitting.html (其中文翻譯見)