在 r randomforste 网格搜索中建模后优化模型

optimize the model after modeling in r randomforste grid search

我有两个回归模型,rf1 和 rf2,我想找到允许 rf1 的输出在 20 到 26 之间并且 rf2 的输出应该低于 10 的变量值:

我尝试了网格搜索,但我一无所获,请问我您知道如何使用启发式算法(模拟退火或遗传算法)进行搜索,请帮助我

您可以在此存储库中找到此示例的代码 here

library(randomForest)

model_rf_fines<- readRDS(file = paste0("rf1.rds"))
model_rf_gros<- readRDS(file = paste0("rf2.rds"))
#grid------
grid_input_test = expand.grid(
  "Poste" ="P1",
  "Qualité" ="BTNBA",
  "CPT_2500" =13.83,
  "CPT400" = 46.04,
  "CPT160" =15.12,
  "CPT125" =5.9,
  "CPT40"=15.09,
  "CPT_40"=4.02,
  "retart"=0,
  "dure"=0,
  'Débit_CV004'=seq(1300,1400,10),
  "Dilution_SB002"=seq(334.68,400,10),
  "Arrosage_Crible_SC003"=seq(250,300,10),
  "Dilution_HP14"=1200,
  "Dilution_HP15"=631.1,
  "Dilution_HP18"=500,
  "Dilution_HP19"=seq(760.47,800,10),
  "Pression_PK12"=c(0.59,0.4),
  "Pression_PK13"=c(0.8,0.7),
  "Pression_PK14"=c(0.8,0.9,0.99,1),
  "Pression_PK16"=c(0.5),
  "Pression_PK18"=c(0.4,0.5)
  
)

#levels correction ----
levels(grid_input_test$Qualité) = model_rf_fines$forest$xlevels$Qualité
levels(grid_input_test$Poste) = model_rf_fines$forest$xlevels$Poste

for(i in 1:nrow(grid_input_test)){
  #fines
  print("----------------------------")
  print(i)
  print(paste0('Fines       :', predict(object = model_rf_fines,newdata = grid_input_test[i,]) ))
  #gros
  print(paste0('Gros        :',predict(object = model_rf_gros,newdata = grid_input_test[i,]) ))
  if(predict(object = model_rf_gros,newdata = grid_input_test[i,])<=10){break}
}


任何建议将不胜感激

谢谢。

可能variables/input不存在。如果 rf1rf2 代表两个随机森林模型,比如说 >50 棵树,树的数量将平均为模型的 spikes/edges。

类似大数定律,每个森林中的树越多,rf1rf2的输出就会越接近。这就是全部,如果 rf_ 表示随机森林都在相同的数据上训练,确实比树越多,您的输入越不可能满足条件。

确实先尝试简单的网格搜索,并跟踪 rf2 的最小值,同时 rf1 满足您的条件。调用这个最小值 M_grid

如果你想实现模拟退火,我会从一个简单的邻居方案开始,比如取一个随机输入变量并稍微改变一下。使用 python 包作为退火方案。如果这个简单的方案比你的 M_grid 好很多并且你觉得你已经接近解决方案,你可以尝试更慢的冷却方案,或者更复杂的邻居提议。

此外,SA 和 GA 的 objective 不应选择太快。可能你想要一个 objective 引导 rf1 接近其最低边缘 20,并且 rf2 尽可能小,也许 exp()**3奖励下降很多。

我在这里做了一些假设,也许是错误的。但无论如何希望这会有所帮助。