使用caret和svm进行交叉验证预测

在调整模型时生成的ROC/Sens/Spec与模型在相同数据集上的实际预测之间似乎存在差异。我使用的是caret,它使用了kernlab的ksvm。对于glm,我没有遇到这个问题。

data(iris)library(caret)iris <- subset(iris,Species == "versicolor" | Species == "setosa") # 我们只需要两个输出类别iris$noise <- runif(nrow(iris)) # 添加噪声 - 否则模型会过于“完美”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) # 与模型摘要中的相同

这种差异的来源是什么?哪些是“真实的”,经过交叉验证后的预测?


回答:

函数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.1218229ir$bestTune#      sigma   C#2 0.7856182 0.5merge(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函数。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注