2016-11-10 25 views
2

在mlr中,可以使用嵌套交叉驗證來進行過濾器特徵選擇以及超參數調整,例如,用下面的代碼。R mlr - 無需嵌套嵌套交叉驗證的包裝特徵選擇+超參數調整?

lrn = makeFilterWrapper(learner = "regr.kknn", fw.method = "chi.squared") 
ps = makeParamSet(makeDiscreteParam("fw.abs", values = 10:13), 
        makeDiscreteParam("k", values = c(2, 3, 4))) 
ctrl = makeTuneControlGrid() 
inner = makeResampleDesc("CV", iter = 2) 
outer = makeResampleDesc("Subsample", iter = 3) 
lrn = makeTuneWrapper(lrn, resampling = inner, par.set = ps, control = ctrl, show.info = FALSE) 
res = resample(lrn, bh.task, outer, mse, extract = getTuneResult) 

但據我所知,這是不可能做這樣的事情使用的包裝功能的選擇,例如:

lrn = makeFeatSelWrapper(learner = "regr.kknn", ww.method = "random") # imaginary code 
ps = makeParamSet(makeDiscreteParam("maxit", 15), 
        makeDiscreteParam("k", values = c(2, 3, 4))) # imaginary code, no method parameter & no resampling provided 
ctrl = makeTuneControlGrid() 
inner = makeResampleDesc("CV", iter = 2) 
outer = makeResampleDesc("Subsample", iter = 3) 
lrn = makeTuneWrapper(lrn, resampling = inner, par.set = ps, control = ctrl, show.info = FALSE) 
res = resample(lrn, bh.task, outer, mse, extract = getTuneResult) 

有沒有辦法實現這樣的事情?特別是,爲了避免嵌套嵌套交叉驗證?有沒有方法論的原因,爲什麼這不合適?因爲實際上,使用具有調整參數(特徵數量)的過濾器特徵選擇看起來與包裝器方法非常相似,也就是說,您的附加超參數實際上是一組特徵,可以從過濾器(例如「卡方」)+閾值(最高90%,80%,70%)或包裝算法(隨機,遺傳算法,窮舉,順序)的輸出,最好的特徵集合是基於兩種情況下的內部cv性能。我相信這兩種方法(與過濾和嵌套嵌套的附加參數嵌套)在計算複雜性方面類似,但您可能不想使用嵌套嵌套CV進一步減少訓練數據集,這是可以實現的採用第一種方法。

這是我正在做的一個方法錯誤還是這是一個缺乏(可能不是真正流行)的功能?

+1

'bh.task'是一個迴歸任務'lm'也是一種迴歸方法。您可能希望使用'mse'作爲重採樣的一項措施。 –

+0

@jakobr啊,對不起,我只是無意識地複製了一段代碼,只是爲了展示我所問的概念。編輯 – Matek

回答

1

此功能在MLR可用,因爲July。一個需要安裝Git版本

devtools::install_github("mlr-org/mlr") 

TuneWrapper需要在內部採樣循環而FeatSelWrapper需要在外部採樣循環。下面是使用iris.task和rpart包與後向選擇的一個示例:

library(mlr) 

調諧參數:

ps <- makeParamSet(
    makeNumericParam("cp", lower = 0.01, upper = 0.1), 
    makeIntegerParam("minsplit", lower = 10, upper = 20) 
) 

網格搜索:

ctrl <- makeTuneControlGrid(resolution = 5L) 

指定學習者:

lrn <- makeLearner("classif.rpart", predict.type = "prob") 

生成調包裝:

lrn <- makeTuneWrapper(lrn, resampling = cv3, par.set = ps, control = makeTuneControlGrid(), show.info = FALSE) 

生成特徵選擇包裝:

lrn = makeFeatSelWrapper(lrn, 
         resampling = cv3, 
         control = makeFeatSelControlSequential(method = "sbs"), show.info = FALSE) 

進行重新取樣:

res <- resample(lrn, task = iris.task, resampling = cv3, show.info = TRUE, models = TRUE) 

注意,即使這個小例子將需要一些時間

res 
#output 
Resample Result 
Task: iris_example 
Learner: classif.rpart.tuned.featsel 
Aggr perf: mmce.test.mean=0.1000000 
Runtime: 92.1436 

可以做t他同樣的事情沒有最外面的resample:

lrn <- makeLearner("classif.rpart", predict.type = "prob") 
lrn <- makeTuneWrapper(lrn, resampling = cv3, par.set = ps, control = makeTuneControlGrid(), show.info = TRUE) 
res2 <- selectFeatures(learner = lrn , task = iris.task, resampling = cv3, 
         control = makeFeatSelControlSequential(method = "sbs"), show.info = TRUE) 
+0

哇!真高興你讓我知道這麼古老的線程,謝謝!接受答案。 – Matek

+0

我在尋找一種方式來執行完全相同的事情時找到了線程。很高興我能幫上忙。 – missuse

1

如果我找到了你,你基本上是問如何調整FeatSelWrapper?這有點複雜,因爲特徵選擇(在mlr)取決於重採樣,因爲它基本上是調諧。我們不調整學習者參數,但我們調整了功能的選擇以優化性能指標。要計算度量我們需要重新採樣。

所以你換句話說建議是什麼來調整「功能調整」通過選擇對功能調整算法的最佳參數。這自然會帶來另一層嵌套重採樣。

但是,如果這是必要的話,這是值得商榷的,因爲特徵選擇的選擇通常取決於您的可用資源和其他情況。

你可以做的是測試不同特徵選擇方法:

inner = makeResampleDesc("CV", iter = 2) 
outer = makeResampleDesc("Subsample", iter = 3) 
settings = list(random1 = makeFeatSelControlRandom(maxit = 15), random2 = makeFeatSelControlRandom(maxit = 20)) 
lrns = Map(function(x, xn) { 
    lrn = makeFeatSelWrapper(learner = "regr.lm", control = x, resampling = inner) 
    lrn$id = paste0(lrn$id, ".", xn) 
    lrn 
}, x = settings, xn = names(settings)) 
benchmark(lrns, bh.task, outer, list(mse, timeboth)) 
+0

你好,謝謝你的回答。也許我沒有把自己弄清楚(我現在可以看到事實確實如此)。我想問的是,是否可以調整'FeatSelWrapper' **以及學習者超參數,就像你可以用'FilterWrapper'一樣做到這一點(這樣你就可以避免嵌套CV並保持標準嵌套CV) 。 AFAIK,目前這是不可能的,但也許我錯了,或者有一個特殊的原因,爲什麼我不知道這是不可能的。我編輯了問題的代碼,使其更清楚,請查看。 – Matek

+0

嗯,我剛剛意識到你不能真的做嵌套嵌套交叉驗證,因爲你不能用'TuneWrapper'封裝一個'FeatSelWrapper'(或者反過來)。 – Matek