R語言caret包的學習(一)--數據預處理


caret包(Classification and Regression Training)是一系列函數的集合,它試圖對創建預測模型的過程進行流程化。本系列將就數據預處理、特征選擇、抽樣、模型調參等進行介紹學習。

本文將就caret包中的數據預處理部分進行介紹學習。主要包括以下函數:model.matrix(),dummyVars(),nearZeroVar(),findCorrelation(),findLinearCombos(),preProcess(),classDist(),featurePlot()

創建虛擬變量

創建虛擬變量的兩個主要函數:model.matrix , dummyVars

model.matrix()

 model.matrix(object, data = environment(object), contrasts.arg = NULL, xlev = NULL, ...) 

其實,主要參數為object,一個公式;data就是引用的數據咯

這里,式子中 ~后可以理解為要展開的數據(其實也可以有只有一個因子水平的數據,從而便於在展開數據的同時,cbind其他列的數據,從而得到接下來分析用到的數據),結果返回的是matrix類型

如上所示,有3個因子水平的a被展開成2列,其他一列被省掉,減少了多重共線性的困擾。但是,沒搞明白,intercept是怎么得出來的?????

dummyVars()

 dummyVars(formula, data, sep = ".", levelsOnly = FALSE, fullRank = FALSE, ...) 

其用法跟model.matrix差不多,主要參數依舊是formula和data

不同的是

可以看出兩點不同了:1. 需要調用predict函數才能顯示矩陣   2. 是對所有level進行展開

此外,dummyVars還可以生成交互的展開

當然,還可以通過 sep = ";" 將a;1的形式,   levelsOnly = TRUE 將a.1改成1, 但a.1:b.1改成1:1  不行 報錯 情理之中,因為這樣1:1的話就沒有辨識度了,只有level是唯一不重復的,才可以如願。

注意:因為dummyVars展開的沒有截距(intercept),並且每個因子水平都有對應的虛擬變量,所以這些參數對於某些模型可能是不可用的,例如lm等

 

零方差和近似零方差特征變量

識別清除近似零方差的特征變量的原因: 

  • 在某些情況下,數據產生機制只創建具有單一值的特征變量(例如零方差特征變量)。這對於大多數模型(不包括樹模型)來說,這可能造成模型的破壞,或者數據擬合的不穩定。
  • 同樣的,特征變量中可能有一些出現頻率非常低的唯一值,當這樣的數據使用交叉驗證(cross-validation)或自助法(bootstrap)抽樣或一些樣本可能對模型有過度影響的時候,這些特征變量可能變成零方差的特征變量

識別此種特征變量的方法:

  • 最大頻率數值的頻數比上第二頻率數值的頻數(稱作頻數比率(frequency ratio)),對於平衡的特征變量其值接近1,對於高度不平衡的數據其值會非常大
  • 唯一值比例就是唯一值的個數除以樣本的總數再乘以100, 它隨着數據粒度的增大而幾近於0。 

如果頻數比率大於預先設定的閾值,並且唯一值的比例小於一個閾值,我們可以認為這個特征變量為近似零方差。 

caret包中提供了函數:nearZeroVar()

 nearZeroVar(x, freqCut = 95/5, uniqueCut = 10, saveMetrics = FALSE, names = FALSE, foreach = FALSE, allowParallel = TRUE) 

參數解釋:

  • x 是一個數值型向量、矩陣或data frame,freqCut是頻數比率閾值,uniqueCut是唯一值比例閾值
  • saveMetrics是一個邏輯值,false時返回的是近零特征的位置,true時,返回特征信息的data frame
  • name 邏輯值,false時,返回列的索引,true時返回列的名字
  • foreach 是否調用foreach包,若為ture,將使用更少的內存
  • allowPatallel 是否通過foreach包進行並行計算,若為true,將占用更多內存,但執行時間更短

返回的參數解釋:

freqRatio 頻數比率  percentUnique 唯一值比率   zeroVar 是否僅有一個值   nzv 是否是近零方差特征

清除近零方差特征變量:

 

識別相關的特征變量

有些模型依賴與相關的特征變量(像偏最小二乘法(pls,partial least-squares regression)),而有些模型能夠得益於變量之間的相關性減少。

 findCorrelation(x, cutoff = 0.9, verbose = FALSE, names = FALSE, exact = ncol(x) < 100) 

參數解釋:

  • x 是一個相關性矩陣
  • cutoff 是相關性絕對值的閾值
  • verbose 是否顯示details
  • names 是否返回列名。false時,返回列的索引
  • exact 邏輯值,平均相關性是否在每一步重新計算。當維數比較大時,exact calculations將清除更少的特征,且比較慢

 

線性相關性

函數findLinearCombos使用QR分解來枚舉線性組合的集合(如果存在的話)

 findLinearCombos(x)   只有一個參數x,x是一個數值矩陣

返回一個列表,含有兩項:

  • linearCombos  若有線性相關的,顯示列索引向量
  • remove 為去除線性相關性,應去除的列索引

preProcess函數

preProcess函數可以對特征變量施行很多操作,包括中心化和標准化。preProcess函數每次操作都估計所需要的參數,並且由predict.preProcess 應用於指定的數據集。

preProcess(x, method = c("center", "scale"), thresh = 0.95,     
                pcaComp = NULL, na.remove = TRUE, k = 5, 
                knnSummary = mean, outcome = NULL, fudge = 0.2, 
                numUnique = 3, verbose = FALSE, freqCut = 95/5, 
                uniqueCut = 10, cutoff = 0.9, ...)        

x 是一個矩陣或數據框。非數值型的變量是被允許的,但是將被忽略

method 處理類型的字符串向量。常見的幾種如下:

  • center 中心化,即減去自變量的平均值
  • scale  標准化,即除以自變量的標准差,變換后值域為[0,1]。如果新樣本值大於或小於訓練集中值,則值將超出此范圍。
  • BoxCox 變換,用於自變量,簡單,與冪變換一樣有效
  • YeoJohnson 與BoxCox 變換相似,但是它的自變量可以是0或負數,而BoxCox只能是正數
  • expoTrans 指數變換(exponential transformations)也可以被用於正數或負數
  • zv  識別並清除掉只含有一個值的數值型自變量
  • nzv 相當於應用nearZeroVar,清除近零方差的自變量
  • corr 尋找並過濾掉具有高相關性的自變量,參見findCorrelation

這些方法的運行順序是:zero-variance filter, near-zero variance filter, correlation filter, Box-Cox/Yeo-Johnson/exponential transformation, centering, scaling, range, imputation, PCA, ICA then spatial sign. 

thresh  PCA的累積方差比

其實,preProcess的功能很強大,據說還可以對數據進行插補缺失值(K近鄰,袋裝樹bagged tree)

筆者還未深入研究,在此不一一敘述

類別距離計算

classDist 函數計算訓練集的類別質心和協方差矩陣,從而確定樣本與每個類別質心的馬氏距離。

 classDist(x, y, groups = 5, pca = FALSE, keep = NULL, ...) 

 predict(object, newdata, trans = log, ...)  默認的距離取對數,但是這可以通過predict.classDist的參數trans來改變

可見,上圖關於對角線對稱,且將test分為兩類,藍色一類,紅色一類。

數據描述性可視化

caret包中的可視化是對lattice包作圖的集成。主要函數是featurePlot

 featurePlot(x, y, plot = “strip”, labels = c("Feature", ""), ...) 

x 為一個連續數值的矩陣或data frame

y 是一個表明類別的因子變量

plot 是作圖的種類。對於分類有: box, strip, density, pairs,ellipse,對於回歸有pairs,scatter。默認情況下,當y為因子,則為strip,否則為scatter  (注意:若用ellipse作圖,需加載ellipse包)

還可以設定其他的可傳遞給lattice的選項。常見的有

  • layout=c(3,1) 將圖設置為3行1列;
  • auto.key = list(columns = 3)) 將圖例置於圖頂,並以3列擺開

 

參考:

 http://topepo.github.io/caret/pre-processing.html其中文翻譯見此


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM