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

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

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

建立虛擬變量

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

model.matrix()

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

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

這裏,式子中 ~後能夠理解爲要展開的數據(其實也能夠有隻有一個因子水平的數據,從而便於在展開數據的同時,cbind其餘列的數據,從而獲得接下來分析用到的數據),結果返回的是matrix類型學習

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

dummyVars()

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

其用法跟model.matrix差很少,主要參數依舊是formula和data翻譯

不一樣的是3d

能夠看出兩點不一樣了: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其中文翻譯見此

相關文章
相關標籤/搜索