嗨,我知道以前有人问过类似的问题,但没有明确的答案(或者我尝试过他们的解决方案,但没有成功:使用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)
另外,您可能希望从您的训练和测试数据集中删除变量Class
和rand
。你可以这样做:
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 ...)
这个工作。