caret包(Classification and Regression Training)是一系列函數的集合,它試圖對建立預測模型的過程進行流程化。本系列將就數據預處理、特徵選擇、抽樣、模型調參等進行介紹學習。html
本文將就caret包中的數據預處理部分進行介紹學習。主要包括如下函數:model.matrix(),dummyVars(),nearZeroVar(),findCorrelation(),findLinearCombos(),preProcess(),classDist(),featurePlot()git
建立虛擬變量的兩個主要函數:model.matrix , dummyVarsgithub
model.matrix(object, data = environment(object), contrasts.arg = NULL, xlev = NULL, ...) bootstrap
其實,主要參數爲object,一個公式;data就是引用的數據咯函數
這裏,式子中 ~後能夠理解爲要展開的數據(其實也能夠有隻有一個因子水平的數據,從而便於在展開數據的同時,cbind其餘列的數據,從而獲得接下來分析用到的數據),結果返回的是matrix類型學習
如上所示,有3個因子水平的a被展開成2列,其餘一列被省掉,減小了多重共線性的困擾。可是,沒搞明白,intercept是怎麼得出來的?????spa
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等
識別清除近似零方差的特徵變量的緣由:
識別此種特徵變量的方法:
若是頻數比率大於預先設定的閾值,而且惟一值的比例小於一個閾值,咱們能夠認爲這個特徵變量爲近似零方差。
caret包中提供了函數:nearZeroVar()
nearZeroVar(x, freqCut = 95/5, uniqueCut = 10, saveMetrics = FALSE, names = FALSE, foreach = FALSE, allowParallel = TRUE)
參數解釋:
返回的參數解釋:
freqRatio 頻數比率 percentUnique 惟一值比率 zeroVar 是否僅有一個值 nzv 是不是近零方差特徵
清除近零方差特徵變量:
有些模型依賴與相關的特徵變量(像偏最小二乘法(pls,partial least-squares regression)),而有些模型可以得益於變量之間的相關性減小。
findCorrelation(x, cutoff = 0.9, verbose = FALSE, names = FALSE, exact = ncol(x) < 100)
參數解釋:
函數findLinearCombos使用QR分解來枚舉線性組合的集合(若是存在的話)
findLinearCombos(x) 只有一個參數x,x是一個數值矩陣
返回一個列表,含有兩項:
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 處理類型的字符串向量。常見的幾種以下:
這些方法的運行順序是: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的選項。常見的有
參考: