frequency - R函数查找随机森林树元素的加权频率
问题描述
我所做的:寻找潜在交互的一个很好的经验法则是在树的高处(即根节点附近)寻找关闭的变量分裂。鉴于此,我使用 getTree 来提取节点上的拆分变量并删除终端节点。我使用 MaxNuMREV 将值旋转到最大值,即(13 更改为 31)。使用双 lapply,我遍历所有树并获得特征交互。我对树的较低“更随机”部分应用从 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),]
推荐阅读
- bluetooth - 了解循环功率测量的 BLE 特性值 0x2A63
- rust - 如何获取对 Rc 中任意元素的可变引用
> 树? - node.js - npm install:在 node-sass@3.13.1 安装后脚本失败
- java - 当我们调用回滚时,有多少提交被回滚?
- c# - 在 webforms 的 app_code 中创建 ADO NET 实体模型时不起作用
- python - 如何在 Keras 中预处理 VGG16 微调的训练集?
- apache-spark - 2 个列表和/或 1 个二维数组的 udf 声明
- python - 抑制 RainCloudplot 中未使用的区域 - Python
- angularjs - 如何从 AngularJS 1.2 中的控制器中正确删除指令范围
- python - 如果满足'if'条件,有没有办法增加迭代器