2016-06-05 2 views
1

Je suis en train de compléter les exercices de Applied Predictive Modeling, le manuel R pour le package caret, par les auteurs. Je ne peux pas obtenir la fonction train pour fonctionner avec les méthodes M5P ou M5Rules.RWeka ne fonctionnera pas avec caret ou éventuellement% dopar%

Le code fonctionnera bien manuellement:

data("permeability") 
trainIndex <- createDataPartition(permeability[, 1], p = 0.75, 
           list = FALSE) 
fingerNZV <- nearZeroVar(fingerprints, saveMetrics = TRUE) 
trainY <- permeability[trainIndex, 1] 
testY <- permeability[-trainIndex, 1] 
trainX <- fingerprints[trainIndex, !fingerNZV$nzv] 
testX <- fingerprints[-trainIndex, !fingerNZV$nzv] 
indx <- createFolds(trainY, k = 10, returnTrain = TRUE) 
ctrl <- trainControl('cv', index = indx) 

m5Tuner <- t(as.matrix(expand.grid(
    N = c(1, 0), 
    U = c(1, 0), 
    M = floor(seq(4, 15, length.out = 3)) 
))) 
startTime <- Sys.time() 
m5Tune <- foreach(tuner = m5Tuner) %do% { 
    m5ctrl <- Weka_control(M = tuner[3], 
         N = tuner[1] == 1, 
         U = tuner[2] == 1) 
    mods <- lapply(ctrl$index,function(fold) { 
    d <- cbind(data.frame(permeability = trainY[fold]), 
       trainX[fold, ]) 
    mod <- M5P(permeability ~ ., d, control = m5ctrl) 
    rmse <- RMSE(predict(mod, as.data.frame(trainX[-fold, ])), 
       trainY[-fold]) 
    list(model = mod, rmse = rmse) 
    }) 
    mean_rmse <- mean(sapply(mods, '[[', 'rmse')) 
    list(models = mods, mean_rmse = mean_rmse) 
} 
endTime <- Sys.time() 
endTime - startTime 
# Time difference of 59.17742 secs 

Les mêmes données et les contrôles (permutation des « règles » pour « M » - pourquoi je ne peux pas spécifier M comme paramètre de réglage?) Ne finition:

m5Tuner <- expand.grid(
    pruned = c("Yes", "No"), 
    smoothed = c("Yes", "No"), 
    rules = c("Yes", "No") 
) 
m5Tune <- train(trainX, trainY, 
       method = 'M5', 
       trControl = ctrl, 
       tuneGrid = m5Tuner, 
       control = Weka_control(M = 10)) 

l'exemple du livre ne se terminera pas, que ce soit:

library(caret) 
data(solubility) 
set.seed(100) 
indx <- createFolds(solTrainY, returnTrain = TRUE) 
ctrl <- trainControl(method = "cv", index = indx) 

set.seed(100) 
m5Tune <- train(x = solTrainXtrans, y = solTrainY, 
       method = "M5", 
       trControl = ctrl, 
       control = Weka_control(M = 10)) 

Cela peut être un problème avec l'utilisation d'un backend parallèle avec RWeka, pour moi, au moins. Mon exemple ci-dessus ne finira pas avec %dopar%.

J'ai couru sudo R CMD javareconf avant chaque exemple et redémarré rstudio.

sessionInfo() 
R version 3.3.0 (2016-05-03) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Arch Linux 

locale: 
[1] LC_CTYPE=en_US.UTF-8   LC_NUMERIC=C     
[3] LC_TIME=en_US.UTF-8   LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8  LC_MESSAGES=en_US.UTF-8  
[7] LC_PAPER=en_US.UTF-8   LC_NAME=en_US.UTF-8   
[9] LC_ADDRESS=en_US.UTF-8  LC_TELEPHONE=en_US.UTF-8  
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods 
[7] base  

other attached packages: 
[1] APMBook_0.0.0.9000    RWeka_0.4-27     
[3] caret_6.0-68     ggplot2_2.1.0     
[5] lattice_0.20-30     AppliedPredictiveModeling_1.1-6 
# dozens others loaded via namespace. 

Répondre

1

Lorsque vous utilisez le traitement en parallèle avec train et RWeka modèles, vous devriez avoir obtenu l'erreur:

In train.default(trainX, trainY, method = "M5", trControl = ctrl, : 
Models using Weka will not work with parallel processing with multicore/doMC 

L'interface Java pour Weka ne fonctionne pas avec les travailleurs multiples.

Il prend un certain temps, mais l'appel train complétera si vous n'avez pas les travailleurs inscrits à foreach

Max

+0

Eh oui. Je pensais avoir essayé de dissocier le doMC, mais peut-être que foreach ou parallel était toujours attaché. En tout cas, le code a fini. Aussi, je suppose que je n'étais pas clair sur ce que "règles" fait. Je dois avoir convaincu moi-même que je l'ai compris à ce moment-là (beaucoup de paramètres d'accord ce chapitre). Tous les trois pour M5 n'acceptent que «Oui» ou «Non». J'ai changé la question. Y a-t-il une raison pour laquelle 'M' n'est pas un paramètre de réglage? Merci - super livre et logiciel. –