我正在训练一个随机森林模型,目的是将其保存下来用于预测(它将被下载并在外部环境中使用)。我希望这个模型尽可能小。
尽管如此,我不明白为什么训练集的大小会与模型的大小相关?毕竟,一旦森林的系数确定了,为什么还需要保留原始数据集呢?
df <- irismodel <- randomForest::randomForest(Species ~ ., data = df, localImp = FALSE, importance = FALSE, keep.forest = TRUE, keep.inbag = FALSE, proximity=FALSE, ntree = 25)object.size(model)/1000#> 73.2 bytesdf <- df[sample(nrow(df), 50), ]model <- randomForest::randomForest(Species ~ ., data = df, localImp = FALSE, importance = FALSE, keep.forest = TRUE, keep.inbag = FALSE, proximity=FALSE, ntree = 25)object.size(model)/1000#> 43 bytes
由reprex包(v0.2.1)于2019-05-21创建
我尝试了上述提到的技巧来减少大小,但与训练集大小的作用相比,它们的效果微乎其微。有没有办法移除这些信息?
回答:
我认为你可以在拟合模型后移除一些部分:
object.size(model)/1000# 70.4 bytesmodel$predicted <- NULL # 移除预测值model$y <- NULL # 移除y# .. 可能其他部分也不需要object.size(model)/1000# 48.3 bytes
我使用predict(model, df)
检查它是否仍然能工作,结果是可以的。
使用names(model)
来检查model
内的元素。
看起来$votes
很大,而且你不需要它,这里是我安全移除的更多项目:
model$predicted <- NULLmodel$y <- NULLmodel$err.rate <- NULLmodel$test <- NULLmodel$proximity <- NULLmodel$confusion <- NULLmodel$localImportance <- NULLmodel$importanceSD <- NULLmodel$inbag <- NULLmodel$votes <- NULLmodel$oob.times <- NULLobject.size(model)/1000# 32.3 bytes
示例:
df <- irismodel <- randomForest::randomForest(Species ~ ., data = df, localImp = FALSE, importance = FALSE, keep.forest = TRUE, keep.inbag = FALSE, proximity=FALSE, ntree = 25)