2017-08-06 64 views
0

在R中使用mlr包並進行交叉驗證時,是否可以從kknn模型中檢索距離矩陣?從kknn模型中檢索距離矩陣

library("mlr") 

data(iris) 

task = makeClassifTask(data = iris, target = "Species") 

lnr = makeLearner(
    cl = "classif.kknn", 
    predict.type = "prob", 
    k = 5, 
    kernel = "gaussian", 
    scale = TRUE 
) 

cv = crossval(
    learner = lnr, 
    task = task, 
    iters = 4, 
    stratify = TRUE, 
    measures = acc, 
    show.info = FALSE, 
    model = TRUE 
) 

str(cv$models[1]) 

我不能看到cv$modelscv$pred相關的任何東西。

+0

而且,您的代碼使用'任務= task'但你不告訴我們你是如何生成的'task'。數據是隱藏在「任務」中的嗎? – G5W

+0

感謝您的反饋。我只是想勾畫'crossval'函數,因爲'mlr'是高度標準化的。因此,數據導入步驟始終是相同的,因此,這就是爲什麼在這裏省略。 – JimBoy

回答

1

crossval的返回值是ResampleResult,它包含在$models成員(注意這是一個列表)中的單個迭代中擬合的模型。模型是底層學習者返回的對象,因此在每個模型中應該有一個包含距離矩陣的成員$D$

查看the tutorial瞭解更多信息。

編輯:在這種特殊情況下,你不會在老地方學習者模型,因爲kknn是(型號少)人聚類和kknn功能實際上並沒有得到由mlr叫,直到你predict。由train返回的「模型」僅僅是訓練數據(帶有一些附加比特)。

predict函數只返回預測值而不返回模型,所以很遺憾,在這種特殊情況下,您無法直接進入距離矩陣。但是,你可以從mlr得到學習者模型,並呼籲該kknn獲得距離矩陣:

kknn(getTaskFormula(cv$models[[1]]$task.desc), 
    train = cv$models[[1]]$learner.model$data, 
    test = iris)$D 
+0

謝謝你,拉爾斯。我已經檢查過'str(cv $ models [1])',但是在列表中沒有看到成員'$ D'。難道我做錯了什麼? – JimBoy

+0

您可以發佈完整的代碼+允許重現問題的數據嗎? –

+0

我已更新原始問題。 – JimBoy