对于> 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 个类别的结果变量。无论使用哪种训练方法,情况都是一样的(我试过rf
,gbm
,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)
此外,您可能希望从训练和测试数据集中删除变量 Class
和 rand
。你可以这样做:
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个类别的结果,插入符号训练方法不起作用(所有准确性结果都有问题)的主要内容,如果未能解决你的问题,请参考以下文章