问题描述
我所做的:找到潜在相互作用的一个好的经验法则是在树中,即在根节点附近,寻找接近的变量分裂程度高。鉴于此,我使用getTree提取节点上的拆分变量并删除了终端节点。我使用MaxnuMREV将值旋转到最大值,即(13更改为31)。使用双重重叠,我遍历所有树木并获得要素交互。我为树的较低“更随机”部分应用了从1到〜0.06的行权重。
问题:我使用了多种加权频率方法,但没有任何效果。我需要获取加权频率值来判断交互的重要性。例如,要素交互31的权重可以由每个实例的行位置确定。
library(dplyr); library(RandomForest)
Ntrees=500
RRFModel<- randomForest(Ozone ~ .,data=airquality,mtry=3,importance=TRUE,na.action=na.omit,ntrees=Ntrees)
MaxnuMREV=function(x){ reverse_int <- function(n) {
t1 <- floor(log10(n)); t2 <- 0
for (i in t1:1) {t2 <- t2 + floor(n/10^i) * 10^(t1-i)}
return(n*10^t1 - 99*t2)}
return(max(x,reverse_int(x)))
}
Splitvar=lapply(1:Ntrees,function(i){getTree(RRFModel,k=i,labelVar=FALSE)[,"split var"]})
MinLen=min(unlist(lapply(1:Ntrees,function(i){length(Splitvar[[i]][(Splitvar[[i]])!=0])})))
RowWeight=exp(-0.1*c(1:(MinLen-1)))
DoubleLL=lapply(1:Ntrees,function(j){
VV=matrix(lapply(1:(MinLen-1),function(i){ UU=Splitvar[[j]][(Splitvar[[j]])!=0][(i):(i+1)]
if(sd(unlist(UU))==0){UU=0
} else {UU=MaxnuMREV(as.numeric(paste0(UU,collapse="")))}
return((UU))}))
})
解决方法
没关系,我想出了使它工作的方法。这可能不是最有效的方法,但它可行。我一直在这里,以防别人需要。
SplitVar=lapply(1:Ntrees,function(i){getTree(RRFModel,k=i,labelVar=FALSE)[,"split var"]})
MaxNuMREV=function(x){ reverse_int <- function(n) {
t1 <- floor(log10(n)); t2 <- 0
for (i in t1:1) {t2 <- t2 + floor(n/10^i) * 10^(t1-i)}
return(n*10^t1 - 99*t2)}
return(max(x,reverse_int(x)))
}
MinLen=min(unlist(lapply(1:Ntrees,function(i){length(SplitVar[[i]][(SplitVar[[i]])!=0])})))
RowWeight=exp(-0.1*c(1:(MinLen-1)))
DoubleLL=lapply(1:Ntrees,function(j){
VV=matrix(lapply(1:(MinLen-1),function(i){ UU=SplitVar[[j]][(SplitVar[[j]])!=0][(i):(i+1)]
if(sd(unlist(UU))==0){UU=0
} else {UU=MaxNuMREV(as.numeric(paste0(UU,collapse="")))}
return(UU)}))
WW=data.frame(unlist(VV),RowWeight);colnames(WW)=c("var","wt")
return(WW[WW[,1]!=0,]) })
FULLRbind=do.call("rbind",DoubleLL)
AGGR=aggregate(FULLRbind[,"wt"],by=list(Category=FULLRbind[,"var"]),FUN=sum)
AGGR=AGGR[order(AGGR[,"x"],decreasing=TRUE),]