在 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不存在。如果 rf1
和 rf2
代表两个随机森林模型,比如说 >50 棵树,树的数量将平均为模型的 spikes/edges。
类似大数定律,每个森林中的树越多,rf1
和rf2
的输出就会越接近。这就是全部,如果 rf_
表示随机森林都在相同的数据上训练,确实比树越多,您的输入越不可能满足条件。
确实先尝试简单的网格搜索,并跟踪 rf2
的最小值,同时 rf1
满足您的条件。调用这个最小值 M_grid
如果你想实现模拟退火,我会从一个简单的邻居方案开始,比如取一个随机输入变量并稍微改变一下。使用 python 包作为退火方案。如果这个简单的方案比你的 M_grid
好很多并且你觉得你已经接近解决方案,你可以尝试更慢的冷却方案,或者更复杂的邻居提议。
此外,SA 和 GA 的 objective 不应选择太快。可能你想要一个 objective 引导 rf1
接近其最低边缘 20,并且 rf2
尽可能小,也许 exp()
或 **3
奖励下降很多。
我在这里做了一些假设,也许是错误的。但无论如何希望这会有所帮助。
我有两个回归模型,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不存在。如果 rf1
和 rf2
代表两个随机森林模型,比如说 >50 棵树,树的数量将平均为模型的 spikes/edges。
类似大数定律,每个森林中的树越多,rf1
和rf2
的输出就会越接近。这就是全部,如果 rf_
表示随机森林都在相同的数据上训练,确实比树越多,您的输入越不可能满足条件。
确实先尝试简单的网格搜索,并跟踪 rf2
的最小值,同时 rf1
满足您的条件。调用这个最小值 M_grid
如果你想实现模拟退火,我会从一个简单的邻居方案开始,比如取一个随机输入变量并稍微改变一下。使用 python 包作为退火方案。如果这个简单的方案比你的 M_grid
好很多并且你觉得你已经接近解决方案,你可以尝试更慢的冷却方案,或者更复杂的邻居提议。
此外,SA 和 GA 的 objective 不应选择太快。可能你想要一个 objective 引导 rf1
接近其最低边缘 20,并且 rf2
尽可能小,也许 exp()
或 **3
奖励下降很多。
我在这里做了一些假设,也许是错误的。但无论如何希望这会有所帮助。