楼主: Imasasor
7585 5

[问答] 逻辑回归中的特征筛选 [推广有奖]

  • 1关注
  • 64粉丝

VIP

已卖:215份资源

学科带头人

33%

还不是VIP/贵宾

-

TA的文库  其他...

超哥喜欢的文章

威望
1
论坛币
47033 个
通用积分
3.1376
学术水平
238 点
热心指数
246 点
信用等级
231 点
经验
37132 点
帖子
849
精华
3
在线时间
2235 小时
注册时间
2012-7-4
最后登录
2024-10-10

初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章

楼主
Imasasor 发表于 2016-5-4 15:24:10 |AI写论文
888论坛币
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,其它为特征,依次筛选

  1. #第一步,将xxg按7:3随机分成trainset和testset
  2. set.seed(2)
  3. ind<-sample(2,nrow(xxg),replace=T,prob=c(0.7,0.3))
  4. trainset<-xxg[ind==1,]
  5. testset<-xxg[ind==2,]

  6. #xxg_lr<-glm(xxg~age,family = binomial,data=trainset)

  7. #特征列表存于varlist向量
  8. varlist<-c("sex","diabetes","age","bmi","hypertension")

  9. #第一轮循环
  10. for (i in 1:5){
  11. xxg_lr<-glm(xxg~eval(parse(text=varlist[i])),family = binomial,data=trainset) #Logistic regression
  12. #模型测试,模型用于testset后,使用模型输出P值Top 30%作为切点,得出此切点以上的人群中目标变量xxg=1占
  13. #全部人群xxg=1的百分比,Coverage,此输出变量作为验证模型好环的关键变量
  14. real<-testset$xxg #测试目标变量真实值
  15. predict_lr<-predict(xxg_lr,type="response",newdata=testset) #预测目标变量P值
  16. rr<-cbind(real,predict_lr)
  17. result<-as.data.frame(rr)
  18. result<-result[order(result$predict_lr,decreasing=T),]
  19. n<-length(result$real)
  20. cover<-sum(result$real[1:ceiling(0.3*n)])/sum(result$real) #选择模型Top 30%,求coverage
  21. eval(parse(text=paste(varlist[i],"<-cover",sep=""))) #将coverage赋值给另一变量
  22. }

  23. model_1<-rbind(sex,diabetes,age,bmi,hypertension) #第一输循环得出hypertension预测效果最好,用于下一循环

  24. #第二轮循环
  25. varlist2<-c("sex","diabetes","age","bmi")
  26. for (i in 1:4){
  27.   xxg_lr<-glm(xxg~hypertension+eval(parse(text=varlist2[i])),family = binomial,data=trainset)
  28.   real<-testset$xxg
  29.   predict_lr<-predict(xxg_lr,type="response",newdata=testset)
  30.   rr<-cbind(real,predict_lr)
  31.   result<-as.data.frame(rr)
  32.   result<-result[order(result$predict_lr,decreasing=T),]
  33.   n<-length(result$real)
  34.   cover<-sum(result$real[1:ceiling(0.3*n)])/sum(result$real)
  35.   eval(parse(text=paste("hypertension_",varlist[i],"<-cover",sep="")))
  36. }
  37. model_2<-rbind(hypertension_age,hypertension_bmi,hypertension_sex,hypertension_diabetes)
  38. #第二循环得出diabetes预测效果最好,用于下一循环

  39. #第三轮循环,添加diabetes
  40. #########
复制代码




xxg.rar (48.42 KB) 本附件包括:
  • xxg.Rdata


关键词:逻辑回归 Dataframe coverage model Rains 程序 模型 最好
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

沙发
Imasasor 发表于 2016-5-4 15:25:56
嵌入的代码不知道会不会被改变,我这里再发一遍
r logistic.txt (1.97 KB)

藤椅
jinkelazzz 发表于 2016-5-4 15:37:24
有点意思。按照相似的逻辑,可以把按预测效果下降最慢的方向将100个变量逐步删掉,保留下来的变量和你的做法选取的变量会一样吗?

板凳
Imasasor 发表于 2016-5-4 15:38:40
jinkelazzz 发表于 2016-5-4 15:37
有点意思。按照相似的逻辑,可以把按预测效果下降最慢的方向将100个变量逐步删掉,保留下来的变量和你的做法 ...
这分别是向前筛选和向后筛选的方法, forward, backward,结果应该是不一样的。

报纸
jinkelazzz 发表于 2016-5-4 15:42:54
Imasasor 发表于 2016-5-4 15:38
这分别是向前筛选和向后筛选的方法, forward, backward,结果应该是不一样的。
如果假设存在最优解min(AIC)那么哪种选法更接近呢? 有没有严格的好坏?或在某种条件下有严格的好坏?

地板
万人往LVR 在职认证  发表于 2016-5-4 16:31:03
看看 ?step
已有 1 人评分经验 收起 理由
李会超 + 20 精彩帖子

总评分: 经验 + 20   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-28 14:50