R函数为随机森林树查找元素的加权频率

问题描述

我所做的:找到潜在相互作用的一个好的经验法则是在树中,即在根节点附近,寻找接近的变量分裂程度高。鉴于此,我使用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),]