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



嗨,我知道以前有人问过类似的问题,但没有明确的答案(或者我尝试过他们的解决方案,但没有成功:使用GBM的插入错误,但不是没有插入插入训练方法抱怨有问题;所有的RMSE度量值都丢失了)

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

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个类别时,我得到了以下警告。它在两类结果变量中运行良好。无论训练方法如何(我尝试了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,…):stop错误
警告信息:
1: In train.default(x, y, weights = w,…):
度量"RMSE"不在结果集中。将使用Accuracy。
2:在nomaltrainworkflow (x = x, y = y, wts = weights, info = trainInfo,:
在重新采样的性能测量中存在缺失值。

任何帮助,这是非常感谢!

您需要将新创建的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"))]

我在train函数中设置了allowParallel = TRUE,并且我正在使用的机器没有多个内核。在我注释了那个语句之后,我没有得到错误。

在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)]

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

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

train(training[,!names(training)%in%response], training$response ...)
这个工作

最新更新