带有插入符号错误的 SVM 分类(基本)
Posted
技术标签:
【中文标题】带有插入符号错误的 SVM 分类(基本)【英文标题】:SVM Classification with Caret Error (Basic) 【发布时间】:2012-12-04 16:15:57 【问题描述】:我可能在这里犯了一个非常简单(和愚蠢)的错误,但我无法弄清楚。我正在使用来自 Kaggle (Digit Recognizer) 的一些数据,并尝试将 SVM 与 Caret 包一起使用来进行一些分类。如果我只是将标签值作为数字类型插入函数,那么 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、1、...9 以外的其他值。 @joran 警告信息,不是吗? @agstudy 是的,谢谢。这当然是一个令人尴尬的警告(哎呀!,我的意思是错误!)就我而言! :) @mchangun 最好更新您的答案,而不是在评论中进行。 这可能只是一个玩具示例,但是当您有 10 个类时,从仅 10 个案例中重新采样似乎很麻烦。而且,事实上,如果我把它减少到两个类,它运行得很好。在定义 ytrain 的地方添加标签对我来说也很好。保留 10 个案例和类别并更改为另一种分类器方法(rpart、cforest)也有效。所以我的猜测是,如果不同的输出具有不同数量的类,那么 train 就无法组合 kernlab 中正在运行的任何 svm 函数的输出。不过这只是猜测。 【参考方案1】:您有 10 个不同的类,但您在 train()
中只包含 10 个案例。这意味着当您重新采样时,您通常不会在分类器的各个实例中拥有所有 10 个类。 train()
难以组合这些不同类别 SVM 的结果。
您可以通过增加案例数量、减少类别数量,甚至使用不同的分类器来解决此问题。
【讨论】:
【参考方案2】:我发现在数字识别用例中使用插入符号很有挑战性。我认为部分问题是标签数据是数字。当插入符号尝试从中创建变量时,它们最终以数字开头,这确实不被接受为 R 变量。
就我而言,我通过使用 dplyr 离散化标签数据来解决这个问题。这假设您的训练数据已放入“训练”数据框中。
将标签离散化为 label2
train$label2=dplyr::recode(train$label, 0
="zero", 1
="one", 2
="two",3
="three",@987654325 @="四",5
="五",6
="六",7
="七",8
="八",9
="九")
重新排列列,以便您可以在原始标签旁边看到新的 label2
火车
将标签更改为离散化标签2的分解版本
train$label
杀死 label2,因为它是一个临时变量
train$label2
查看结果
头(火车)
【讨论】:
以上是关于带有插入符号错误的 SVM 分类(基本)的主要内容,如果未能解决你的问题,请参考以下文章
summaryFunction 插入符号分类的自定义指标 (hmeasure)
带有 removeChild 的 Chrome 跳转插入符号错误