插入符和支持向量机的交叉验证预测
cross-validate predictions for caret and svm
调整模型时产生的 ROC/Sens/Spec 与模型在同一数据集上做出的实际预测之间似乎存在差异。我正在使用使用 kernlab 的 ksvm 的插入符号。我在使用 glm 时没有遇到这个问题。
data(iris)
library(caret)
iris <- subset(iris,Species == "versicolor" | Species == "setosa") # we need only two output classess
iris$noise <- runif(nrow(iris)) # add noise - otherwise the model is too "perfect"
iris$Species <- factor(iris$Species)
fitControl <- trainControl(method = "repeatedcv",number = 10, repeats = 5, savePredictions = TRUE, classProbs = TRUE, summaryFunction = twoClassSummary)
ir <- train(Species ~ Sepal.Length + noise, data=iris,method = "svmRadial", preProc = c("center", "scale"), trControl=fitControl,metric="ROC")
confusionMatrix(predict(ir), iris$Species, positive = "setosa")
getTrainperf(ir) # same as in the model summary
这种差异的来源是什么?哪些是 "real"、post 交叉验证预测?
似乎函数 getTrainPerf
给出了最佳调优参数的平均性能结果,这些参数在重复的交叉验证折叠中取平均值。
getTrainPerf
的工作原理如下:
getTrainPerf(ir)
# TrainROC TrainSens TrainSpec method
#1 0.9096 0.844 0.884 svmRadial
这是通过以下方式实现的:
ir$results
# sigma C ROC Sens Spec ROCSD SensSD SpecSD
#1 0.7856182 0.25 0.9064 0.860 0.888 0.09306044 0.1355262 0.1222911
#2 0.7856182 0.50 0.9096 0.844 0.884 0.08882360 0.1473023 0.1218229
#3 0.7856182 1.00 0.8968 0.836 0.884 0.09146071 0.1495026 0.1218229
ir$bestTune
# sigma C
#2 0.7856182 0.5
merge(ir$results, ir$bestTune)
# sigma C ROC Sens Spec ROCSD SensSD SpecSD
#1 0.7856182 0.5 0.9096 0.844 0.884 0.0888236 0.1473023 0.1218229
这也可以从交叉验证折叠的性能结果中获得(10 次折叠,5 次重复,每个性能测量的总值 10*5=50)。
colMeans(ir$resample[1:3])
# ROC Sens Spec
# 0.9096 0.8440 0.8840
因此,getTrainPerf
仅给出了在不同时间(不是在整个训练数据集上)使用最佳调整参数(sigma, C).
但是如果您想对整个训练数据集进行预测,则需要将 predict
函数与调整后的模型一起使用。
调整模型时产生的 ROC/Sens/Spec 与模型在同一数据集上做出的实际预测之间似乎存在差异。我正在使用使用 kernlab 的 ksvm 的插入符号。我在使用 glm 时没有遇到这个问题。
data(iris)
library(caret)
iris <- subset(iris,Species == "versicolor" | Species == "setosa") # we need only two output classess
iris$noise <- runif(nrow(iris)) # add noise - otherwise the model is too "perfect"
iris$Species <- factor(iris$Species)
fitControl <- trainControl(method = "repeatedcv",number = 10, repeats = 5, savePredictions = TRUE, classProbs = TRUE, summaryFunction = twoClassSummary)
ir <- train(Species ~ Sepal.Length + noise, data=iris,method = "svmRadial", preProc = c("center", "scale"), trControl=fitControl,metric="ROC")
confusionMatrix(predict(ir), iris$Species, positive = "setosa")
getTrainperf(ir) # same as in the model summary
这种差异的来源是什么?哪些是 "real"、post 交叉验证预测?
似乎函数 getTrainPerf
给出了最佳调优参数的平均性能结果,这些参数在重复的交叉验证折叠中取平均值。
getTrainPerf
的工作原理如下:
getTrainPerf(ir)
# TrainROC TrainSens TrainSpec method
#1 0.9096 0.844 0.884 svmRadial
这是通过以下方式实现的:
ir$results
# sigma C ROC Sens Spec ROCSD SensSD SpecSD
#1 0.7856182 0.25 0.9064 0.860 0.888 0.09306044 0.1355262 0.1222911
#2 0.7856182 0.50 0.9096 0.844 0.884 0.08882360 0.1473023 0.1218229
#3 0.7856182 1.00 0.8968 0.836 0.884 0.09146071 0.1495026 0.1218229
ir$bestTune
# sigma C
#2 0.7856182 0.5
merge(ir$results, ir$bestTune)
# sigma C ROC Sens Spec ROCSD SensSD SpecSD
#1 0.7856182 0.5 0.9096 0.844 0.884 0.0888236 0.1473023 0.1218229
这也可以从交叉验证折叠的性能结果中获得(10 次折叠,5 次重复,每个性能测量的总值 10*5=50)。
colMeans(ir$resample[1:3])
# ROC Sens Spec
# 0.9096 0.8440 0.8840
因此,getTrainPerf
仅给出了在不同时间(不是在整个训练数据集上)使用最佳调整参数(sigma, C).
但是如果您想对整个训练数据集进行预测,则需要将 predict
函数与调整后的模型一起使用。