对于> 2个类别的结果,插入符号训练方法不起作用(所有准确性结果都有问题)

Posted

技术标签:

【中文标题】对于> 2个类别的结果,插入符号训练方法不起作用(所有准确性结果都有问题)【英文标题】:caret train method not working (something is wrong for all accuracy results) for outcomes with >2 categories 【发布时间】:2016-01-23 08:41:53 【问题描述】:

您好,我知道之前有人问过类似的问题,但还没有明确的答案(或者我尝试了他们的解决方案但没有成功:Caret error using GBM, but not without caret Caret train method complains Something is wrong; all the RMSE metric values are missing )

我尝试使用插入符号训练方法来预测分类结果(下面的在线数据示例)

library(mlbench)
data(Sonar)
str(Sonar[, 1:10])

library(caret)
set.seed(998)

Sonar$rand<-rnorm(nrow(Sonar))  ##to randomly create the new 3-category outcome
table(Sonar$rand)
Sonar$Class_new<-ifelse(Sonar$Class=="R","R",ifelse(Sonar$rand>0,"M","H"))
table(Sonar$Class_new)

fitControl <- trainControl(## 10-fold CV
                           method = "repeatedcv",
                           number = 10,
                           ## repeated ten times
                           repeats = 10)

inTraining <- createDataPartition(Sonar$Class_new, p = .75, list = FALSE)
training <- Sonar[ inTraining,]
testing  <- Sonar[-inTraining,]

gbmFit1 <- train(Class_new ~ ., data = training,
                 method = "gbm",
                 trControl = fitControl,
                 verbose = FALSE)

每当我使用具有 3 个类别的新类变量 (Class_new),而不是原始 Class 变量中的 2 个类别时,我都会收到以下警告。它运行良好,有 2 个类别的结果变量。无论使用哪种训练方法,情况都是一样的(我试过rfgbm,svm,都一样)

出了点问题;缺少所有准确度指标值:

    Accuracy       Kappa    
 Min.   : NA   Min.   : NA  
 1st Qu.: NA   1st Qu.: NA  
 Median : NA   Median : NA  
 Mean   :NaN   Mean   :NaN  
 3rd Qu.: NA   3rd Qu.: NA  
 Max.   : NA   Max.   : NA  
 NA's   :9     NA's   :9    

train.default(x, y, weights = w, ...) 中的错误:停止 另外:警告消息: 1:在 train.default(x, y, weights = w, ...) 中: 指标“RMSE”不在结果集中。将改为使用准确性。 2:在nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, : 重新采样的性能指标中存在缺失值。

非常感谢您对此的任何帮助!

【问题讨论】:

当您提到您正在构建之前的问题时,即“之前有人尝试过”,您应该在帖子中提供指向这些问题的链接。 Caret and KNN in R: predict function gives error的可能重复 也可能是getting this error in Caret的副本 我编辑并放置了那些对我不起作用的先前线程链接.. 之前的帖子仍然没有帮助,包括来自 Alex 和 phiver 的上述 2 篇帖子..但是谢谢 【参考方案1】:

需要将新创建的Class_new转换成因子,如下:

Sonar$Class_new<-ifelse(Sonar$Class=="R","R",ifelse(Sonar$rand>0,"M","H"))
Sonar$Class_new <- factor(Sonar$Class_new)

此外,您可能希望从训练和测试数据集中删除变量 Classrand。你可以这样做:

training <- Sonar[ inTraining, !(names(Sonar) %in% c("Class", "rand"))]
testing <- Sonar[-inTraining, !(names(Sonar) %in% c("Class", "rand"))]

【讨论】:

【参考方案2】:

我在 train 函数中设置了 allowParallel = TRUE,而我正在使用的机器没有多个内核。在我评论该声明后,我没有收到错误消息。

【讨论】:

【参考方案3】:

不要在 train 函数中传递公式,而是传递参数 x、y、方法等的值

老办法:

modFit = train(data.df$Label ~ ., 
                 data = data.df, 
                method = "rpart", 
                trControl= cntr, 
                tuneLength = 7)

新方法:

modFit = train(x = data.df.cols, 
                 y = data.df$Label,
                 method = "rpart",
                   trControl = cntrl, 
                   tuneLength = 7)

注意:x = data.df.cols 包含除标签之外的所有列,data.df.cols = data.df[,2:ncol(data.df)]

【讨论】:

【参考方案4】:

感谢 howaj 的帖子。这确实适用于我发布的数据,但不知何故不适用于另一个数据集,那里的一切似乎都是一样的。但我终于想通了:

这里可能是语法问题。我没有使用 train(y~., data=training, ...),而是更改为 train(train$y,train$x, ...) 而没有明确指定 data=..:

train(training[,!names(training)%in%response], training$response ...)

这行得通。

【讨论】:

不客气。据我所知,有些包只接受一种形式(公式接口或 x 和 y 接口,但不能同时接受)。 我还发现语法很重要,具体取决于 train() 中使用的 method

以上是关于对于> 2个类别的结果,插入符号训练方法不起作用(所有准确性结果都有问题)的主要内容,如果未能解决你的问题,请参考以下文章

提高插入符号 (R) 中的模型训练速度

比较插入符号模型对象的最佳功能

插入符号 rpart 决策树绘图结果

用KNN算法判断知识掌握程度高低

使用并行训练带有插入符号的随机森林

插入符号中训练数据的 ROC 曲线