Что я сделал: хорошее эмпирическое правило для поиска потенциальных взаимодействий состоит в том, чтобы искать близкое расщепление переменных высоко в дереве, то есть рядом с корневым узлом. Учитывая это, я использовал 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))}))
})