直接修改randomForest(type="reggression")的抽样方法:学习基本的C编程,从cran源代码下载randomForest.4.6-10.tar.gz(如果是Windows安装Rtools,如果是OSX安装Xcode),安装并打开Rstudio,在新项目中选择包,将...tar.gz解压到文件夹中,查看src文件夹,打开regrf.c,检查第151行和163行。编写新的抽样策略,按Ctrl+Shift+B时不时重新构建/编译并覆盖randomForest库,纠正所述的编译错误,偶尔测试包是否仍然正常工作,花费几个小时弄清楚旧的无信息代码,也许更改说明文件,名称空间文件和一些其他引用,以便包名称更改为randomForestMod,重新构建,完成。
另外一个更简单的方法不需要更改randomForest。任何具有相同特征输入的树都可以使用randomForest::combine函数拼接在一起,因此您可以在纯R代码中设计抽样策略。我原本认为这是个坏主意,但对于这个非常朴素的模拟,它实际上可以产生类似/稍微更好性能的结果!请记住不要预测绝对目标值,而应该是相对变化、绝对变化等稳定的导数。如果预测绝对值,RF将会退回到预测明天与今天非常接近的状态,这是一个无用的结果。编辑的代码[22:42 CEST]
library(randomForest)
library(doParallel)
nCPU = detectCores()
cl = makeCluster(nCPU)
registerDoParallel(cl)
timepoints=1000;var=6;noise.factor=.2
y = sin((1:timepoints)*pi/30) * 1000 +
sin((1:timepoints)*pi/40) * 1000 + 1:timepoints
y = y+rnorm(timepoints,sd=sd(y))*noise.factor
plot(y,type="l")
dy = c(0,y[-1]-y[-length(y)])
dy = dy + rnorm(timepoints)*sd(dy)*noise.factor
dy = c(0,y[-1]-y[-length(y)])
dX = sapply(1:40,function(i){
getTheseLags = (1:timepoints) - i
getTheseLags[getTheseLags<1] = NA
dx.lag.i = dy[getTheseLags]
})
dX[is.na(dX)]=-100
pairs(data.frame(dy,dX[,1:5]),cex=.2)
train=1:600
dy.train = dy[ train]
dy.test = dy[-train]
dX.train = dX[ train,]
dX.test = dX[-train,]
rf = randomForest(dX.train,dy.train,ntree=500)
print(rf)
split2 = function(aVector,splits=31) {
lVector = length(aVector)
mod = lVector %% splits
lBlocks = rep(floor(lVector/splits),splits)
if(mod!=0) lBlocks[1:mod] = lBlocks[1:mod] + 1
lapply(1:splits,function(i) {
Stop = sum(lBlocks[1:i])
Start = Stop - lBlocks[i] + 1
aVector[Start:Stop]
})
}
nBlocks=10
rfBlocks = foreach(aBlock = split2(train,splits=nBlocks),
.combine=randomForest::combine,
.packages=("randomForest")) %dopar% {
dXblock = dX.train[aBlock,] ; dyblock = dy.train[aBlock]
rf = randomForest(x=dXblock,y=dyblock,sampsize=length(dyblock),
replace=T,ntree=50)
}
print(rfBlocks)
results = data.frame(predBlock = predict(rfBlocks,newdata=dX.test),
true=dy.test,
predBootstrap = predict(rf,newdata=dX.test))
plot(results[,1:2],xlab="OOB-CV predicted change",
ylab="trueChange",
main="black bootstrap and blue block train")
points(results[,3:2],xlab="OOB-CV predicted change",
ylab="trueChange",
col="blue")
print(cor(results)^2)
stopCluster(cl)
randomForest <- randomForest:::randomForest.formula
。数据有多大?也许你可以通过将滞后值作为独立变量包含在内,然后使用标准方法来删除时间序列元素的部分? - RichAtMangostrata
参数是否能实现你想要的,很可能不行。否则,所有重抽样都发生在编译后的C代码(回归)或Fortran代码(分类)中,因此如果要修改它,您需要下载源代码,对其进行修改并重新编译。 - joranreplace==FALSE
和sampsize
等于您的训练数据,会怎样呢?这将完全消除自助法,并且您基本上会得到一组装袋树。 - Tchotchke