2012-12-17 15 views
8

Prawdopodobnie popełniam tutaj bardzo prosty (i głupi) błąd, ale nie mogę tego rozgryźć. Gram z niektórymi danymi z Kaggle (Digit Recognizer) i próbuję użyć SVM z pakietem Careta, aby dokonać klasyfikacji. Jeśli po prostu podłączyłem wartości etykiet do funkcji jako typ numeryczny, funkcja train w Caret wydaje się domyślnie regresyjna, a wydajność jest dość słaba. Więc próbowałem następnie przekonwertować go na współczynnik z funkcją factor() i spróbować i uruchomić klasyfikację SVM. Oto niektóre kodu gdzie wygenerować pewne dane fikcyjne, a następnie podłączyć go do Caret:Klasyfikacja SVM z błędem Caret (podstawowym)

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") 

otrzymuję ten błąd:

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. 

Czy ktoś mógłby mi powiedzieć co robię źle? Dziękuję Ci!

+0

Komunikat o błędzie jest dość wymowny, czyż nie? Zadzwoń do swoich poziomów czynników coś innego niż 0, 1, ... 9. – joran

+0

@joran komunikat ostrzegawczy, isn'it? – agstudy

+0

@agstudy Tak, dziękuję. To z pewnością kłopotliwe ostrzeżenie (oops !, mam na myśli błąd!) Z mojej strony! :) – joran

Odpowiedz

2

Masz 10 różnych klas, a mimo to masz tylko 10 przypadków w train(). Oznacza to, że po ponownym dopasowaniu często nie będziesz mieć wszystkich 10 klas w poszczególnych instancjach klasyfikatora. train() ma trudności z łączeniem wyników tych maszyn SVM o różnych kategoriach.

Można to naprawić, stosując kombinację zwiększania liczby przypadków, zmniejszania liczby klas lub nawet korzystania z innego klasyfikatora.