2017-08-11 7 views
2

Je viens de commencer à essayer le paquet R mlr, je me demande si je peux personnaliser l'ensemble d'apprentissage et l'ensemble de test. Par exemple, toutes les données d'une séquence temporelle sont l'ensemble d'apprentissage sauf le dernier, et le dernier est l'ensemble de test. Voici mon exemple,comment rééchantillonner et comparer les résultats quand je veux juste prédire la dernière rangée de données en utilisant surv. fonctions dans le paquet mlr, R?

library(mlr) 
library(survival) 
data(lung) 
myData2 <- lung %>% 
    select(time,status,age) 
myData2$status = (myData2$status == 2) 
myTrain <- c(1:(nrow(myData2)-1)) 
myTest <- nrow(myData2) 

les données pulmonaires proviennent de l'emballage de survie. J'utilise juste trois dimensions: le temps, le statut et l'âge. Maintenant, supposons qu'ils ne signifient pas l'âge des patients et combien de temps ils peuvent survivre. Disons que c'est un historique d'achat d'encre d'un client. âge = 74 signifie que ce client a acheté 74 bouteilles d'encre ce jour-là et l'heure = 306 signifie que le client n'a plus d'encre après 306 jours. Donc, je veux construire un modèle de survie en utilisant toutes les données, sauf pour la dernière rangée. Puis, quand j'ai les données de la dernière rangée, qui est l'âge = 58 impliquant que le client a acheté 58 bouteilles d'encre ce jour-là, je peux faire une prédiction à temps. Un nombre proche de 177 sera une bonne estimation. Donc, mon ensemble d'entraînement et mon test sont fixes, ce qui ne nécessite pas d'être rééchantillonné.

En outre, je dois changer les hyperparamètres pour un comparsion. Voici mon code:

surv.task <- makeSurvTask(data=myData2,target=c('time','status')) 
surv.lrn <- makeLearner("surv.cforest") 
ps <- makeParamSet(
    makeDiscreteParam('mincriterion',values=c(1.281552,2,3)), 
    makeDiscreteParam('ntree',values=c(100,200,300)) 
) 
ctrl <- makeTuneControlGrid() 
rdesc <- makeResampleDesc('Holdout',split=1,predict='train') 
lrn = makeTuneWrapper(surv.lrn,control=ctrl,resampling=rdesc,par.set=ps, 
         measures = list(setAggregation(cindex,train.mean))) 
mod <- train(learner=lrn,task=surv.task,subset=myTrain) 
surv.pred <- predict(mod,task=surv.task,subset=myTest) 
surv.pred 

Vous pouvez voir que j'utilise split=1 en makeResampleDesc parce que je fixe ensemble de formation qui n'a pas besoin d'être redimensionnés. Les mesures au makeTuneWrapper ne sont pas significatives pour moi car je dois personnaliser mes propres mesures. En raison de la division de données fixe, je ne peux pas utiliser les fonctions comme resample ou tuneParams pour obtenir une évaluation sur les données de test lors de l'utilisation de différents hyperparamètres. Donc, ma question est la suivante: lorsque l'ensemble de formation et l'ensemble de tests sont fixés, peut-il fournir une comparaison complète pour chaque hyperparamètre? Dans l'affirmative, comment le faire?

BTW, il ressemble est fonction makeFixedHoldoutInstance qui pourrait peut le faire, ne savent pas comment l'utiliser. Par exemple, j'utilise makeFixedHoldoutInstance de cette façon et j'ai ces informations d'erreur:

> f <- makeFixedHoldoutInstance(train.inds=myTrain,test.inds=myTest,size=length(myTrain)+1) 
> lrn = makeTuneWrapper(surv.lrn,control=ctrl,resampling=f,par.set=ps) 
> resample(learner=lrn,task=surv.task,resampling=f) 
[Resample] holdout iter 1: [Tune] Started tuning learner surv.cforest for parameter set: 
       Type len Def  Constr Req Tunable Trafo 
mincriterion discrete - - 1.281552,2,3 - TRUE  - 
ntree  discrete - - 100,200,300 - TRUE  - 
With control class: TuneControlGrid 
Imputation value: -0 
[Tune-x] 1: mincriterion=1.281552; ntree=100 
Error in resample.fun(learner2, task, resampling, measures = measures, : 
    Size of data set: 227 and resampling instance: 228 differ! 

Quelqu'un pourrait-il s'il vous plaît aider?

+0

pourriez-vous s'il vous plaît ajouter les paquets que vous avez utilisés? aussi, il semble être 'target = c ('DaysDiff', 'Status')' – loki

+0

Je viens d'utiliser le paquet mlr. La version est 2.11 –

+0

Oui. Merci. C'est une faute de frappe.Mais tout l'autre code est ce que j'utilise et est devenu confus. –

Répondre

1

Avec makeFixedHoldoutInstance vous obtenez le rééchantillonnage que vous avez demandé. Mais vous ne pouvez pas utiliser les mêmes indices de rééchantillonnage fixes pour l'accordage à l'intérieur de l'enveloppe d'accordage et le rééchantillonnage. Ceci est dû au fait que le premier resample divisera les données en fonction de l'instance de blocage fixe f. Ensuite, le réglage à l'intérieur de l'enveloppe d'accord aura également besoin d'une méthode de rééchantillonnage pour calculer la performance pour une configuration donnée. Comme le réglage ne voit les données qu'après la division effectuée par resample, il ne peut pas appliquer le même rééchantillonnage fixe.

À la lecture de votre question, je suppose que vous ne voulez pas utiliser le tuneWrapper mais que vous souhaitez régler directement votre apprenant. Vous devez donc utiliser simplement tuneParams:

tr = tuneParams(learner = surv.lrn, task = surv.task, resampling = cv2, par.set = ps, control = ctrl) 

Note: Cela ne fonctionne pas sur l'exemple donné parce que le Cindex a besoin d'au moins une observation non censurée et même alors, il n'a pas de sens parce que le Cindex est significatif que pour un plus grand ensemble de test.

+0

Merci beaucoup. Pourriez-vous s'il vous plaît expliquer ce que cv2 est? –

+0

cv2 est juste un raccourci pour 'makeResampleDesc (" CV ", iters = 2)' donc une validation croisée 2 fois. –