處理高度相關變量算法:
1.計算自變量的相關係數矩陣
2.找出相關係數絕對值最大的那對自變量(a和b)
3.計算a和其他自變量相關係數的均值,對b也做同樣操作
4.若a的平均相關係數更大,則將a移除,否則移除b
5,重複2-4,直到所有相關係數的絕對值都低於設定的閾值爲止。
#結果返回需要刪除的列號,變量相關性在0.75左右,findCorrelation()爲carat包中的函數
> highCorr=findCorrelation(cor(sdat),cutoff=.75)
> sdat=sdat[-highCorr]
> cor(sdat)
income store_exp online_exp store_trans online_trans
income 1.0000000 0.6005675 0.5202335 0.7077065 -0.3585446
store_exp 0.6005675 1.0000000 0.5349525 0.5399141 -0.1367433
online_exp 0.5202335 0.5349525 1.0000000 0.4420638 0.2256370
store_trans 0.7077065 0.5399141 0.4420638 1.0000000 -0.4367544
online_trans -0.3585446 -0.1367433 0.2256370 -0.4367544 1.0000000
**建議在0.6~0.8範圍內尋找最優的閾值
稀疏變量
觀測非常稀疏的變量對線性迴歸和邏輯迴歸這樣的模型擬合的表現和穩定性會有很大影響,但對決策樹模型沒有影響。
識別稀疏變量的方法:
1.不同取值數目和樣本量的比值
2.最常見的取值頻數和第二常見的取值頻數之間的比值
#備份數據
> zero_demo=sim.dat#
#加上兩個稀疏變量,zero1取值全是1,zero2除第一個元素是1外,其餘都是0
> zero_demo$zero1=rep(1,nrow(zero_demo))
> zero_demo$zero2=c(1,rep(0,nrow(zero_demo)-1))
#函數返回的是稀疏變量對應的列號
#uniqueCut:是不同取值數目和樣本量的比值,freqCut:是最常見的取值頻數和第二常見的取值頻數之間的比值,nearZeroVar爲caret包中函數
> nearZeroVar(zero_demo,freqCut=95/5,uniqueCut=10)
[1] 20 21
編碼名義變量
名義變量是一個通常取值爲0和1的指標性質的變量,又稱虛設變量。
假設我們把性別(gender),房產(house)這兩個變量轉化爲名義變量
#nnet包中的class.ind()函數
> dumVar=class.ind(sim.dat$gender)
> head(dumVar)
Female Male
[1,] 1 0
[2,] 1 0
[3,] 0 1
[4,] 0 1
[5,] 0 1
[6,] 0 1
class.ind()函數有個侷限,一次只能處理一個變量
caret包中的dummyVars()函數可以提供方便操作。
> dumMod=dummyVars(~gender+house+income,data=sim.dat,levelsOnly=F)
> head(predict(dumMod,sim.dat))
gender.Female gender.Male house.No house.Yes income
1 1 0 0 1 120963.4
2 1 0 0 1 122008.1
3 0 1 0 1 114202.3
4 0 1 0 1 113616.3
5 0 1 0 1 124252.6
6 0 1 0 1 107661.5
>
如上,對於income,其爲數值變量,dummyVars()函數對於數值變量會保持原變量,不會改變。
dumMod利用類似模型公式對income變量進行轉化,如income:gender