玩转大数据R语言与统计分析

用遗传算法筛选线性回归模型自变量

2020-03-12  本文已影响0人  六胜一平

线性回归模型的解释变量筛选一般有逐步回归和全子集两种方法,在R中分别以car包的stepAIC和leaps包的regsubset为代表。stepAIC采用贪婪算法,求得的常是局部最优解,regsubset的结果很难解读。本文我们尝试用遗传算法来选择解释变量,看看效果如何。
我们选取UCI的Forest fire dataset,先用log(y+1)对因变量进行变换,再用genalg包提供的二进制遗传算法寻找AIC最小的自变量组合。

library(genalg)

ff=logArea~X+Y+Month+Day+Month:Day+FFMC+DMC+DC+Temp+RH+Wind+Rain
terms=c(attributes(terms(ff))$term.labels)

evalFun=function(gen){
     if(sum(gen)==0)
       return(1e+10)
     stm=paste(terms[gen==1],collapse = '+')
     sf=paste(c('logArea',stm),collapse =' ~ ')
     f=as.formula(sf)
     m=lm(formula = f,data = data)

    # return(-summary(m)$adj.r.squared)
     return(AIC(m))
}

monitor <- function(obj) {
   minEval = min(obj$evaluations);
   plot(obj, type="hist");
}

bestm <- rbga.bin(size=12, mutationChance=0.06, popSize = 1000,iters = 50,zeroToOneRatio=10,
                  evalFunc=evalFun, verbose=TRUE)

gen=bestm$population[1,]
stm=paste(terms[gen==1],collapse = '+')
sf=paste(c('logArea',stm),collapse =' ~ ')
f=as.formula(sf)
m=lm(f,data)

全模型的AIC为1879,遗传算法找到的最优模型AIC为1772,模型得到了一定程度优化。

上一篇下一篇

猜你喜欢

热点阅读