2016-11-04 47 views
3

在一些分類的任務,使用mlr包,我需要處理一個data.frame類似這樣:如何從mlr包中將阻止因子包含在makeClassifTask()中?

set.seed(pi) 
# Dummy data frame 
df <- data.frame(
    # Repeated values ID 
    ID = sort(sample(c(0:20), 100, replace = TRUE)), 
    # Some variables 
    X1 = runif(10, 1, 10), 
    # Some Label 
    Label = sample(c(0,1), 100, replace = TRUE) 
    ) 
df 

我需要交叉驗證模型的值保持連同相同ID,我知道從該教程:

https://mlr-org.github.io/mlr-tutorial/release/html/task/index.html#further-settings

我們可能包括任務阻塞因素。這表明某些觀測值「屬於一個」,並且在將數據分解爲訓練和測試集以重新採樣時不應該分開。

問題是我該如何在makeClassifTask中包含這個阻斷因子?

不幸的是,我找不到任何例子。

回答

3

你有什麼版本的mlr?自一段時間以來,封鎖應該是其中的一部分。您可以直接找到它作爲一個參數在makeClassifTask

這裏是爲您的數據爲例:

df$ID = as.factor(df$ID) 
df2 = df 
df2$ID = NULL 
df2$Label = as.factor(df$Label) 
tsk = makeClassifTask(data = df2, target = "Label", blocking = df$ID) 
res = resample("classif.rpart", tsk, resampling = cv10) 

# to prove-check that blocking worked 
lapply(1:10, function(i) { 
    blocks.training = df$ID[res$pred$instance$train.inds[[i]]] 
    blocks.testing = df$ID[res$pred$instance$test.inds[[i]]] 
    intersect(blocks.testing, blocks.training) 
}) 
#all entries are empty, blocking indeed works! 
+0

謝謝@jakob R,我不知道它是那麼容易! –