2017-08-06 97 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