处理高度相关变量算法:
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
版权声明:本文为lulujiang1996原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。