SVM分类与卡雷特误差(基本型

问题描述 投票:8回答:2

我可能在这里犯了一个很简单(也很愚蠢)的错误,但我想不通。 我在玩Kaggle的一些数据(数字识别器),并试图使用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.

谁能告诉我我做错了什么? 谢谢你!我可能做了一个非常简单的(SVM)分类。

r svm kernlab
2个回答
2
投票

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

你可以通过一些组合来解决这个问题,增加案例数量,减少类的数量,甚至使用不同的分类器。


0
投票

我发现在数字识别用例中使用caret很有挑战性。我认为部分问题是标签数据是数字的。当caret试图从中创建变量时,他们最终以一个数字开始,这确实不被接受为R变量。

在我的例子中,我通过使用dplyr对标签数据进行差异化处理来解决这个问题。这假设你的训练数据被放置在 "训练 "数据框中。

将标签离散化为标签2

train$label2=dplyr::recode(train$label, 0="零"。1="一"。2="二"。3="三"。4="四"。5="五"。6="六"。7="七"。8="八"。9="九")

重新排列栏位,这样您就可以看到新的标签2和原来的标签在一起。

train <- train[,c((1),(786),(2:785))]head(train)

将标签改为离散化标签的因子化版本2。

train$label <- factor(train$label2)

杀掉label2,因为它是一个临时变量。

train$label2 <- NULL

查看结果

车头

© www.soinside.com 2019 - 2024. All rights reserved.