在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進一步減少訓練數據集,這是可以實現的採用第一種方法。
這是我正在做的一個方法錯誤還是這是一個缺乏(可能不是真正流行)的功能?
'bh.task'是一個迴歸任務'lm'也是一種迴歸方法。您可能希望使用'mse'作爲重採樣的一項措施。 –
@jakobr啊,對不起,我只是無意識地複製了一段代碼,只是爲了展示我所問的概念。編輯 – Matek