【发布时间】:2017-03-17 23:09:58
【问题描述】:
我一直在探索奇妙的mlr 包和泰坦尼克号data set。我的问题是实现一个随机森林。更具体地说,我想调整cutoff(即,将不纯的叶子分配给给定类的阈值)。问题是cutoff 参数有两个值,但是,我只能弄清楚超参数在mlr 中的单个值。
代码:
library(mlr)
library(dplyr)
dTrain <- read.csv('path/to/data/')
#Defining the Task
trainTask <- makeClassifTask(data = dTrain %>%
select(-Name, -Ticket, -Cabin) %>%
filter(complete.cases(.)),
target = "Survived",
id = "PassengerId")
#Defining Learning
rfLRN <- makeLearner("classif.randomForest")
#Defining the Parameter Space
ps <- makeParamSet(
makeDiscreteParam("cutoff", values = list(c(.5,.5), c(.75,.25)))
)
这是问题所在,cutoff 需要两个值,但是,我不确定如何传递这两个值。上述尝试是错误的。我尝试了其他几个参数生成器,即makeDiscreteVectorParam 等......但无济于事。有什么建议吗?
如果我尝试调整 mtry 之类的参数(即在给定拆分时选择的特征数量),一切正常。
#Defining the Hyperparameter Space
ps = makeParamSet(
makeDiscreteParam("mtry", values = c(2,3,4,5))
)
#Defining Resampling
cvTask <- makeResampleDesc("CV", iters=5L)
#Defining Search
search <- makeTuneControlGrid()
#Tune!
tune <- tuneParams(learner = rfLRN
,task = trainTask
,resampling = cvTask
,measures = list(acc)
,par.set = ps
,control = search
,show.info = TRUE)
【问题讨论】:
-
对于那些有类似问题的人,更好的方法是使用
makeNumericParam("cutoff", lower = .2, upper = .8, trafo = function(x) c(x, 1-x))而不是makeDiscreteParam("cutoff", values = list(a=c(.50,.50), b=c(.75,.25))。获得详尽搜索的编码要少得多。