8

我可能在这里犯了一个非常简单(和愚蠢)的错误,但我无法弄清楚。我正在使用来自 Kaggle ( Digit Recognizer ) 的一些数据,并尝试将 SVM 与 Caret 包一起使用来进行一些分类。如果我只是将标签值作为数字类型train插入函数,那么 Caret 中的函数似乎默认为回归并且性能很差。所以我接下来尝试使用函数将其转换为因子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.

有人可以告诉我我做错了什么吗?谢谢!

4

2 回答 2

2

你有 10 个不同的类,但你只包括 10 个案例train()。这意味着当您重新采样时,您通常不会在分类器的各个实例中拥有所有 10 个类。train()很难组合这些不同类别的 SVM 的结果。

您可以通过增加案例数量、减少类别数量甚至使用不同的分类器的某种组合来解决此问题。

于 2012-12-26T20:54:59.193 回答
0

我发现在数字识别用例中使用插入符号很有挑战性。我认为部分问题是标签数据是数字。当插入符号尝试从中创建变量时,它们最终以数字开头,这确实不被接受为 R 变量。

就我而言,我通过使用 dplyr 离散化标签数据来解决它。这假设您的训练数据被放入“训练”数据框中。

将标签离散化为 label2

train$label2=dplyr::recode(train$label, 0="zero", 1="one", 2="two", 3="three", 4="four", 5="five", 6="six", 7="七”,8=“八”,9=“九”)

重新排列列,以便您可以在原始标签旁边看到新的 label2

火车 <- 火车 [, c((1),(786),(2:785))] 头(火车)

将标签更改为离散化标签2的分解版本

火车$标签<-因子(火车$标签2)

杀死 label2 因为它是一个临时变量

训练$label2 <- NULL

查看结果

头(火车)

于 2020-05-16T18:12:46.970 回答