我可能在这里犯了一个非常简单(和愚蠢)的错误,但我无法弄明白。我正在玩Kaggle(Digit Recognizer)的一些数据,并尝试使用带有Caret包的SVM进行分类。如果我只是将标签值作为数字类型插入函数中,Caret中的train
函数似乎默认为回归并且性能非常差。所以我接下来尝试将其转换为函数factor()
的因子,并尝试运行SVM分类。下面是一些代码,我生成一些虚拟数据,然后将其插入Caret:
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")
我收到此错误:
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.
有人可以告诉我我做错了什么吗?谢谢!
答案 0 :(得分:2)
您有10个不同的类,但您只在train()
中包含10个案例。这意味着当您重新采样时,您通常不会在分类器的各个实例中拥有所有10个类。 train()
难以合并这些不同类别SVM的结果。
你可以通过增加案例数量,减少类数量,甚至使用不同的分类器来解决这个问题。
答案 1 :(得分:0)
我发现在数字识别用例中使用插入符号具有挑战性。我认为部分问题是标签数据是数字的。当插入符号尝试从中创建变量时,它们最终以数字开头,而这实际上不被接受为R变量。
就我而言,我通过使用dplyr离散化标签数据来解决此问题。假设您的训练数据已放入“训练”数据框中。
train $ label2 = dplyr :: recode(train $ label,0
=“零”,1
=“一个”,2
=“两个”,{{1} } =“三”,3
=“四”,4
=“五”,5
=“六”,6
=“七”,{{1} } =“八”,7
=“九”)
train <-train [,c((1),(786),(2:785))] 头(火车)
train $ label <-factor(train $ label2)
train $ label2 <-空
头(火车)