R caret paquet (rpart): construction d'un arbre de classification
J'ai du mal pendant plusieurs jours pour effectuer un arbre de classification à l'aide de l'accent circonflexe paquet.
Le problème, ce sont mes facteur de variables. - Je générer l'arbre, mais quand j'essaie d'utiliser le meilleur modèle pour faire des prédictions sur l'échantillon de test, il ne parvient pas, parce que le train de la fonction crée des mannequins pour mon facteur variables et ensuite la fonction predict ne peut pas trouver ces nouveaux mannequins dans le jeu de test. Comment dois-je régler ce problème?
Mon code est comme suit:
install.packages("caret", dependencies = c("Depends", "Suggests"))
library(caret)
db=data.frame(read.csv ("db.csv", head=TRUE, sep=";", na.strings ="?"))
fix(db)
db$defaillance=factor(db$defaillance)
db$def=ifelse(db$defaillance==0,"No","Yes")
db$def=factor(db$def)
db$defaillance=NULL
db$canal=factor(db$canal)
db$sect_isodev=factor(db$sect_isodev)
db$sect_risq=factor(db$sect_risq)
#delete zero variance predictors
nzv <- nearZeroVar(db[,-78])
db_new <- db[,-nzv]
inTrain <- createDataPartition(y = db_new$def, p = .75, list = FALSE)
training <- db_new[inTrain,]
testing <- db_new[-inTrain,]
str(training)
str(testing)
dim(training)
dim(testing)
Un exemple o le str() pour la formation/test se trouve ci-dessous:
$ FDR : num 1305 211 162 131 143 ...
$ FCYC : num 0.269 0.18 0.154 0.119 0.139 ...
$ BFDR : num 803 164 108 72 76 63 100 152 188 80 ...
$ TRES : num 502 47 54 59 67 49 53 -7 -103 -109 ...
$ sect_isodev: Factor w/ 9 levels "1","2","3","4",..: 4 3 3 3 3 3 3 3 3 3 ...
$ sect_risq : Factor w/ 6 levels "0","1","2","3",..: 6 6 6 6 6 6 6 6 6 6 ...
$ def : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
> dim(training)
[1] 14553 42
> dim(testing)
[1] 4850 42
Mon code comme ceci:
fitControl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 10,
classProbs = TRUE,
summaryFunction = twoClassSummary)
#CART1
set.seed(1234)
tree1 = train (def~.,
training,
method = "rpart",
tuneLength=20,
metric="ROC",
trControl = fitControl)
Un échantillon de
summary(tree1$finalModel)
est ici
RNTB 38.397731
sect_isodev1 6.742289
sect_isodev3 4.005016
sect_isodev8 2.520850
sect_risq3 9.909127
sect_risq4 6.737908
sect_risq5 3.085714
SOLV 73.067539
TRES 47.906884
sect_isodev2 0.000000
sect_isodev4 0.000000
sect_isodev5 0.000000
sect_isodev6 0.000000
sect_isodev7 0.000000
sect_isodev9 0.000000
sect_risq0 0.000000
sect_risq1 0.000000
sect_risq2 0.000000
Et voici l'erreur:
modèle.tree1 <- prévoir(tree1$finalModel,tests)
Erreur dans la fonction eval(expr, envir, enclos) : l'objet "sect_isodev1' ne trouve pas
Je suis curieux encore une autre chose. J'ai trouvé dans Max Kuhn "Modélisation Prédictive " avec R" de la syntaxe suivante:
predict(rpartTune$finalModel, newdata, type = "class")
où rpartTune$finalModel
est un arbre de classification identique à la mienne (ou la mienne identique au sien).
Maintenant, R n'accepte pas type="class". Seul type="prob". Je suis troublé à cause de cela.
Merci d'avance pour vos réponses
OriginalL'auteur lorelai | 2014-12-18
Vous devez vous connecter pour publier un commentaire.
Aussi loin que je peux dire, il y a deux problèmes:
predict
fonction pourtree1$finalModel
, qui devrait êtrepredict.rpart
depuistree1$finalModel
est de la classerpart
. Je reçois cette erreur et malheureusement ne sais pas la raison sous-jacente. C'est aussi pourquoi la R n'accepte pastype = "class"
.predict.rpart
de l'accepter.train
fonction avec une formule à la place de x et y des objets conduit au problème des variables commesect_isodev1
ne peut pas être trouvé plus tard surAprès la reproduction de vos erreurs avec des données aléatoires (ressemblant à votre
str
) à l'aide de x et y des objets et en appelantpredict.rpart
explicitement à partir derpart
fonctionné pour moi:Par la voie,
predict(tree1, testing)
, ce qui signifie en utilisantpredict.train
avec letrain
objet, fonctionne aussi et retourne prédit classes. Edit: Comme Max l'a souligné, il est généralement préférable d'utiliser cette approche au lieu de faire un autrepredict
fonction de travail.OriginalL'auteur thie1e
Ne pas utiliser
predict.rpart
avec letrain$finalModel
sauf si vous avez une très bonne raison. Lerpart
objet ne t sais à propos de ce quitrain
n', y compris les pré-traiter. Il ne peut pas vous donner la réponse correcte. Après tout, vous pourriez être en utilisanttrain
afin d'éviter la minutie afin de laisserpredict.train
faire le travail.Max
EDIT -
Sur le
type = "class"
ettype = "prob"
peu..predict.rpart
les valeurs par défaut pour la production de la classe de probabilités. Bien querpart
est l'un des premiers paquets, c'est atypique comme la plupart de produire des classes par défaut.predict.train
produit les classes par défaut et vous devez les utilisertype = "prob"
pour obtenir des probabilités.OriginalL'auteur topepo