我正在尝试使用hmeasure指标Hand,2009作为我在插入符号中训练SVM的自定义指标。由于我使用R相对较新,我尝试调整了twoClassSummary函数。我需要的是将真实的类标签和预测的类概率从模型(svm)传递到 hmeasure 包中的HMeasure函数,而不是使用ROC或插入符号中的其他分类性能度量。
例如,在R-HMeasure(true.class,predictProbs [,2])中调用HMeasure函数会导致计算Hmeasure。使用下面的两个ClassSummary代码的调整会导致返回错误:' x'必须是数字。
也许火车功能不能看到""评估HMeasure函数的预测概率。我怎样才能解决这个问题?
我已阅读文档,并在SO dealing with regression上提出了相关问题。多数民众赞成让我走了一路。我将不胜感激任何帮助或指向解决方案。
library(caret)
library(doMC)
library(hmeasure)
library(mlbench)
set.seed(825)
data(Sonar)
table(Sonar$Class)
inTraining <- createDataPartition(Sonar$Class, p = 0.75, list = FALSE)
training <- Sonar[inTraining, ]
testing <- Sonar[-inTraining, ]
# using caret
fitControl <- trainControl(method = "repeatedcv",number = 2,repeats=2,summaryFunction=twoClassSummary,classProbs=TRUE)
svmFit1 <- train(Class ~ ., data = training,method = "svmRadial",trControl = fitControl,preProc = c("center", "scale"),tuneLength = 8,metric = "ROC")
predictedProbs <- predict(svmFit1, newdata = testing , type = "prob")
true.class<-testing$Class
hmeas<- HMeasure(true.class,predictedProbs[,2]) # suppose its Rocks we're interested in predicting
hmeasure.probs<-hmeas$metrics[c('H')] # returns the H measure metric
hmeasureCaret<-function (data, lev = NULL, model = NULL,...)
{
# adaptation of twoClassSummary
require(hmeasure)
if (!all(levels(data[, "pred"]) == levels(data[, "obs"])))
stop("levels of observed and predicted data do not match")
#lev is a character string that has the outcome factor levels taken from the training data
hObject <- try(hmeasure::HMeasure(data$obs, data[, lev[1]]),silent=TRUE)
hmeasH <- if (class(hObject)[1] == "try-error") {
NA
} else {hObject$metrics[[1]] #hObject$metrics[c('H')] returns a dataframe, need to return a vector
}
out<-hmeasH
names(out) <- c("Hmeas")
#class(out)
}
environment(hmeasureCaret) <- asNamespace('caret')
下面的非工作代码。
ctrl <- trainControl(method = "cv", summaryFunction = hmeasureCaret,classProbs=TRUE,allowParallel = TRUE,
verboseIter=TRUE,returnData=FALSE,savePredictions=FALSE)
set.seed(1)
svmTune <- train(Class.f ~ ., data = training,method = "svmRadial",trControl = ctrl,preProc = c("center", "scale"),tuneLength = 8,metric="Hmeas",
verbose = FALSE)
答案 0 :(得分:5)
此代码有效。我发布了一个解决方案,以防其他人想要使用/改进。 这些问题是由Hmeasure对象的错误引用和函数返回值的错字/注释引起的。
library(caret)
library(doMC)
library(hmeasure)
library(mlbench)
set.seed(825)
registerDoMC(cores = 4)
data(Sonar)
table(Sonar$Class)
inTraining <- createDataPartition(Sonar$Class, p = 0.5, list = FALSE)
training <- Sonar[inTraining, ]
testing <- Sonar[-inTraining, ]
hmeasureCaret<-function (data, lev = NULL, model = NULL,...)
{
# adaptation of twoClassSummary
require(hmeasure)
if (!all(levels(data[, "pred"]) == levels(data[, "obs"])))
stop("levels of observed and predicted data do not match")
hObject <- try(hmeasure::HMeasure(data$obs, data[, lev[1]]),silent=TRUE)
hmeasH <- if (class(hObject)[1] == "try-error") {
NA
} else {hObject$metrics[[1]] #hObject$metrics[c('H')] returns a dataframe, need to return a vector
}
out<-hmeasH
names(out) <- c("Hmeas")
out
}
#environment(hmeasureCaret) <- asNamespace('caret')
ctrl <- trainControl(method = "repeatedcv",number = 10, repeats = 5, summaryFunction = hmeasureCaret,classProbs=TRUE,allowParallel = TRUE,
verboseIter=FALSE,returnData=FALSE,savePredictions=FALSE)
set.seed(123)
svmTune <- train(Class ~ ., data = training,method = "svmRadial",trControl = ctrl,preProc = c("center", "scale"),tuneLength = 15,metric="Hmeas",
verbose = FALSE)
svmTune
predictedProbs <- predict(svmTune, newdata = testing , type = "prob")
true.class<-testing$Class
hmeas.check<- HMeasure(true.class,predictedProbs[,2])
summary(hmeas.check)