我在R语言的caret包中有一个集成算法,运行良好,但我希望能够考虑到新的传入数据。我希望避免重新学习算法,因为这需要处理所有新旧数据。
library(caret)data <- irismodel <- train(Species ~.,data=data[1:145,],method="rf",trControl=trainControl(method="boot",number=10))## 现在假设我们在完成模型后获得了data[146,1:4],## 经过一段时间后我们得知了正确的输出结果。我希望将这些## 知识纳入现有算法中。# 我希望避免以下调用,因为它耗时过长;train(Species ~.,data=data[1:146,],method="rf",trControl=trainControl(method="boot",number=10))
我正在寻找类似于Python中SGDClassifier的partial_fit功能,或者其他任何建议。
谢谢。
编辑:我尝试应用答案中的帮助,得到了以下结果:
library(caret)data <- irismodel <- train(Species ~.,data=data[1:120,],method="rf",trControl=trainControl(method="boot",number=10))a <- (predict(model,newdata=data[121:150,1:4])==data[121:150,5])print(a)previousModel <- model # 加载之前保存的模型对象previousModel$trainingData <- data # 更改训练数据为新数据newModel <- update(object = previousModel,forceRefit=T)b <- (predict(newModel,newdata=data[121:150,1:4])==data[121:150,5])all(a==b) [1] TRUE FALSE TRUE FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE[13] TRUE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE[25] TRUE TRUE TRUE TRUE TRUE TRUE### 预测结果不完美[1] TRUE # 在包含新数据后,没有变化...为什么?
回答:
我认为只有一种更新训练参数的函数:
previousModel <- readRDS("....xxx.rds") # 加载之前保存的模型对象previousModel$trainingData <- trainData # 更改训练数据为新数据newModel <- update(object = previousModel)
关于基于新训练数据的更新,我找到了一个问题和修复,通过train.update
中的forceRefit
选项,即使训练参数没有变化,模型也会被更新(代码可以在这里看到这里)。
希望这对你有所帮助,你可以从这里继续进行。