2012-12-17 6 views
8

Probabilmente sto facendo un errore molto semplice (e stupido) ma non riesco a capirlo. Sto giocando con alcuni dati di Kaggle (Digit Recognizer) e cercando di usare SVM con il pacchetto Caret per fare qualche classificazione. Se si inseriscono semplicemente i valori dell'etichetta nella funzione come tipo numerico, la funzione train in Caret sembra essere predefinita per la regressione e le prestazioni sono piuttosto scadenti. Quindi, quello che ho provato in seguito è convertirlo in un fattore con la funzione factor() e provare ad eseguire la classificazione SVM. Ecco un po 'di codice dove ho generare alcuni dati fittizi e quindi collegarlo al Caret:Classificazione SVM con errore Caret (di base)

library(caret) 
library(doMC) 
registerDoMC(cores = 4) 

ytrain <- factor(sample(0:9, 1000, replace=TRUE)) 
xtrain <- matrix(runif(252 * 1000,0 , 255), 1000, 252) 

preProcValues <- preProcess(xtrain, method = c("center", "scale")) 
transformerdxtrain <- predict(preProcValues, xtrain) 

fitControl <- trainControl(method = "repeatedcv", number = 10, repeats = 10) 
svmFit <- train(transformerdxtrain[1:10,], ytrain[1:10], method = "svmradial") 

ottengo questo errore:

Error in kernelMult(kernelf(object), newdata, xmatrix(object)[[p]], coef(object)[[p]]) : 
    dims [product 20] do not match the length of object [0] 
In addition: Warning messages: 
1: In train.default(transformerdxtrain[1:10, ], ytrain[1:10], method = "svmradial") : 
    At least one of the class levels are not valid R variables names; This may cause errors if class probabilities are generated because the variables names will be converted to: X0, X1, X2, X3, X4, X5, X6, X7, X8, X9 
2: In nominalTrainWorkflow(dat = trainData, info = trainInfo, method = method, : 
    There were missing values in resampled performance measures. 

Qualcuno può dirmi che cosa sto facendo male? Grazie!

+0

Il messaggio di errore è abbastanza auto esplicativo, non è vero? Chiama i tuoi livelli di fattore diversi da 0, 1, ... 9. – joran

+0

@joran il messaggio di avviso, no? – agstudy

+0

@agstudy Sì, grazie. Questo è certamente un avvertimento imbarazzante (oops !, intendo errore!) Da parte mia! :) – joran

risposta

2

Hai 10 classi diverse e tuttavia includi solo 10 casi in train(). Ciò significa che quando si ricampiona spesso non si hanno tutte e 10 le classi nelle singole istanze del classificatore. train() ha difficoltà a combinare i risultati di questi SVM di varie categorie.

È possibile risolvere questo problema con una combinazione di aumento del numero di casi, riduzione del numero di classi o persino utilizzo di un classificatore differente.