|
R语言小白,问一个迭代循环的问题,请高手帮忙写个程序。
想做一个逻辑回归,特征有很多,100多个,想进行一些特征筛选和降维,尝试了PCA,但是结果没能提高预测效果,因此放弃这种方法。
现在自己想了一个粗暴直接的方法进行特征筛选:
1)将100个特征分别进行单因素建模并测试,也就是单变量分析,提取其中预测效果最好的一个特征,保留下来,比如是var10
2)将第一步中的var10保留,依次加入剩余99个特征形成2个特征的模型,共99个模型,提取其中预测效果最好的一个特征,保留下来,比如var18
3) 将前两步保留的两个变量(var10, var18)保留,依次加入剩余98个特征形成3个特征的模型,找到最好的一个特征
....
依次进行100+99+98+....+3+2+1次循环,从而找到最好的特征组合。
我已经写了部分代码如下,测试数据见附件,请高手帮忙将这个迭代循环写下去。
需求:
1)最终结果生成一个dataframe,有三列,第一列为model 1, mode1 2,表示单变量,二变量,三变量;第二列是特征列表,第三列为评价模型好坏的coverage
2)控制循环,当第n次循环,添加变量不能继续提升模型预测效果时,跳出循环,保留预测效果最好的特征组合。
测试数据,目标变量是xxg,其它为特征,依次筛选
- #第一步,将xxg按7:3随机分成trainset和testset
- set.seed(2)
- ind<-sample(2,nrow(xxg),replace=T,prob=c(0.7,0.3))
- trainset<-xxg[ind==1,]
- testset<-xxg[ind==2,]
- #xxg_lr<-glm(xxg~age,family = binomial,data=trainset)
- #特征列表存于varlist向量
- varlist<-c("sex","diabetes","age","bmi","hypertension")
- #第一轮循环
- for (i in 1:5){
- xxg_lr<-glm(xxg~eval(parse(text=varlist[i])),family = binomial,data=trainset) #Logistic regression
- #模型测试,模型用于testset后,使用模型输出P值Top 30%作为切点,得出此切点以上的人群中目标变量xxg=1占
- #全部人群xxg=1的百分比,Coverage,此输出变量作为验证模型好环的关键变量
- real<-testset$xxg #测试目标变量真实值
- predict_lr<-predict(xxg_lr,type="response",newdata=testset) #预测目标变量P值
- rr<-cbind(real,predict_lr)
- result<-as.data.frame(rr)
- result<-result[order(result$predict_lr,decreasing=T),]
- n<-length(result$real)
- cover<-sum(result$real[1:ceiling(0.3*n)])/sum(result$real) #选择模型Top 30%,求coverage
- eval(parse(text=paste(varlist[i],"<-cover",sep=""))) #将coverage赋值给另一变量
- }
- model_1<-rbind(sex,diabetes,age,bmi,hypertension) #第一输循环得出hypertension预测效果最好,用于下一循环
- #第二轮循环
- varlist2<-c("sex","diabetes","age","bmi")
- for (i in 1:4){
- xxg_lr<-glm(xxg~hypertension+eval(parse(text=varlist2[i])),family = binomial,data=trainset)
- real<-testset$xxg
- predict_lr<-predict(xxg_lr,type="response",newdata=testset)
- rr<-cbind(real,predict_lr)
- result<-as.data.frame(rr)
- result<-result[order(result$predict_lr,decreasing=T),]
- n<-length(result$real)
- cover<-sum(result$real[1:ceiling(0.3*n)])/sum(result$real)
- eval(parse(text=paste("hypertension_",varlist[i],"<-cover",sep="")))
- }
- model_2<-rbind(hypertension_age,hypertension_bmi,hypertension_sex,hypertension_diabetes)
- #第二循环得出diabetes预测效果最好,用于下一循环
- #第三轮循环,添加diabetes
- #########
复制代码
xxg.rar
(48.42 KB)
本附件包括:
|