2017-07-22 2 views
1

J'essaie de créer un modèle prédictif dans le paquet caret dans R et d'invoquer la prédiction de nouvelles données à partir du terminal/cmd. Voici par exemple reproductible:Rscript - longue durée d'exécution

# Sonar_training.R 
    ## learning and saving model 
library(caret) 
library(mlbench) 
data(Sonar) 
set.seed(107) 
inTrain <- createDataPartition(y = Sonar$Class, p = .75,list = FALSE) 
training <- Sonar[ inTrain,] 
testing <- Sonar[-inTrain,] 
saveRDS(testing,"test.rds") 
ctrl <- trainControl(method = "repeatedcv", 
       repeats = 3) 
plsFit <- train(Class ~ .,data = training,method = "pls", 
      tuneLength = 15, 
      trControl = ctrl, 
      preProc = c("center", "scale")) 

plsClasses <- predict(plsFit, newdata = testing) 

saveRDS(plsFit,"fit.rds") 

Et voici script pour invoquer par Rscript.exe:

# script.R 
    ##reading model and predict test data 
t <- Sys.time() 
pls <- readRDS("fit.rds") 
testing <- readRDS("test.rds") 
head(predict(pls, newdata = testing)) 
print(Sys.time() - t) 

Je lance ce dans le terminal avec la déclaration suivante:

[email protected]:~$ Rscript script.R 
Loading required package: pls 

Attaching package: ‘pls’ 

The following object is masked from ‘package:stats’: 

loadings 

[1] M M R M R R 
Levels: M R 
Time difference of 2.209697 secs 

Est-il possible le faire plus vite/plus efficace? Par exemple, est-il possible de ne pas charger les paquets à chaque exécution? Est-ce que readRDS est correct pour lire les modèles dans ce cas?

+1

Profilez votre code. – Roland

Répondre

1

Vous pouvez essayer de profiler votre code avec le « profvis » package:

#library(profvis) 
profvis({  

    for (i in 1:100){ 
    #your code here 
    } 

}) 

J'ai essayé et il se trouve que 99% du temps d'exécution est le temps de formation, 1% est de sauvegarde/chargement RDS données, et le reste coûte environ 0 (paquets de chargement, chargement de données, ...):

enter image description here

donc, si vous ne voulez pas d'optimiser la fonction de formation elle-même, il semble que vous avez très peu de moyens pour réduire temps d'exécution.

+0

Le temps de la fonction d'entraînement n'a pas une grande importance ici. Une fois que j'ai appris le modèle, je l'utilise uniquement dans la fonction * readRDS *. Je me soucie seulement du temps d'exécution script.R dans la console. Mais je vous remercie pour le paquet profvis maintenant je vois que 1,5 de 2,2 secondes est la lecture du modèle. – Glaud

0

J'ai vu cela se produire pour les modèles de classification PLS et je ne suis pas sûr du problème. Cependant, essayez d'utiliser method = "simpls" à la place. Vous obtiendrez approximativement les mêmes réponses et cela devrait se terminer rapidement.