线性回归模型的解释变量筛选一般有逐步回归和全子集两种方法,在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,模型得到了一定程度优化。
网友评论