2017-08-06 3 views
0

Est-il possible de récupérer la matrice de distance à partir du modèle kknn lors de l'utilisation du package mlr dans R et de la validation croisée?Récupération de la matrice de distances à partir du modèle 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]) 

Je ne vois rien lié à cv$models ou cv$pred.

+0

En outre, votre code utilise 'task = task' mais vous ne nous montrent pas comment vous avez généré' task'. Les données sont-elles cachées dans 'task'? – G5W

+0

Merci pour vos commentaires. Je voulais juste esquisser la fonction 'crossval', parce que' mlr' est hautement standardisé. Par conséquent, l'étape d'importation des données est toujours la même, par conséquent, c'est pourquoi il est omis ici. – JimBoy

Répondre

1

La valeur de retour de crossval est un ResampleResult, qui contient les modèles insérés dans les différentes itérations du membre $models (notez qu'il s'agit d'une liste). Les modèles sont les objets renvoyés par l'apprenant sous-jacent, donc dans chaque modèle, il doit y avoir un membre $D$ qui contient la matrice de distance. Pour plus d'informations, voir the tutorial pour plus d'informations.

Edit: Dans ce cas particulier, vous ne recevez pas les modèles d'apprentissage à l'endroit habituel, car kknn est un (modèle moins) Clusterer et la fonction kknn ne sont pas réellement appelés par mlr jusqu'à ce que vous predict. Le "modèle" retourné par train est juste les données d'entraînement (avec quelques bits supplémentaires).

La fonction predict renvoie uniquement les prédictions et non le modèle, donc malheureusement dans ce cas particulier vous ne pouvez pas accéder directement aux matrices de distance. Cependant, vous pouvez obtenir le modèle de l'apprenant de mlr et appelez kknn sur cela pour obtenir les matrices de distance:

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

Merci, Lars. J'ai déjà vérifié 'str (cv $ models [1])', mais je ne vois pas de membre '$ D' dans la liste. Est-ce que je fais quelque chose de mal? – JimBoy

+0

Pouvez-vous poster votre code complet + données qui permet de reproduire le problème s'il vous plaît? –

+0

J'ai mis à jour la question originale. – JimBoy