我正在使用svm在R中使用e1071软件包进行多类分类。
我希望对每个类和训练集中的每个数据点进行交叉验证的概率预测。即我想要N x K交叉验证概率矩阵。
有人可以告诉我该怎么做吗?
答案 0 :(得分:0)
几点:
(1)通过交叉验证,您可以在保留的数据集上而不是整个数据集上测量模型(在训练数据集上训练)的准确性。
(2)您需要在计算矩阵之前选择超参数(C,gamma)的值。
(3)你可以使用插入符号包计算所需的概率矩阵,但由于它是多类分类问题,你需要在计算矩阵之前选择要计算概率的类。
在虹膜上使用以下代码,虹膜有150个数据点,其中15个点将被随机选为每个折叠的验证数据。让我们找到预测类是setosa的概率并计算150x11矩阵,其中最后一列是二进制列,表示数据点的实际类是否为setosa。
K <- 10 # number of folds
set.seed(123)
library(caret)
library(reshape2)
trctl <- trainControl(method = "cv", number = K, savePredictions = TRUE, classProbs = TRUE)
res <- train(Species ~ ., data = iris, method="svmRadial", trControl = trctl)
res.C1 <- subset(res$pred, C==1)
head(res.C1)
pred obs setosa versicolor virginica rowIndex sigma C Resample
31 setosa setosa 0.980011940 0.009115859 0.010872201 17 1.421405 1 Fold01
32 setosa setosa 0.872285443 0.051664831 0.076049726 23 1.421405 1 Fold01
33 setosa setosa 0.983836684 0.007452339 0.008710978 35 1.421405 1 Fold01
34 setosa setosa 0.956874365 0.018767699 0.024357936 38 1.421405 1 Fold01
35 setosa setosa 0.979355342 0.009425609 0.011219049 39 1.421405 1 Fold01
36 versicolor versicolor 0.009445829 0.935110658 0.055443514 55 1.421405 1 Fold01
cbind.data.frame(round(dcast(res.C1, rowIndex~Resample, value.var = 'setosa'),2), setosa=res.C1$obs=='setosa')
rowIndex Fold01 Fold02 Fold03 Fold04 Fold05 Fold06 Fold07 Fold08 Fold09 Fold10 setosa
1 1 NA NA NA NA NA NA NA NA NA 0.99 TRUE
2 2 NA NA NA NA NA NA NA NA 0.98 NA TRUE
3 3 NA NA NA NA NA 0.98 NA NA NA NA TRUE
4 4 NA NA NA NA NA NA 0.98 NA NA NA TRUE
5 5 NA NA NA 0.99 NA NA NA NA NA NA TRUE
6 6 NA 0.98 NA NA NA NA NA NA NA NA FALSE
7 7 NA NA NA NA 0.97 NA NA NA NA NA FALSE
8 8 NA NA 0.99 NA NA NA NA NA NA NA FALSE
9 9 NA 0.96 NA NA NA NA NA NA NA NA FALSE
10 10 NA 0.98 NA NA NA NA NA NA NA NA FALSE
# ... ...
145 145 NA NA NA NA NA NA NA NA 0.01 NA FALSE
146 146 NA NA NA 0.01 NA NA NA NA NA NA FALSE
147 147 NA NA NA 0.01 NA NA NA NA NA NA FALSE
148 148 NA NA NA NA NA NA NA NA NA 0.01 FALSE
149 149 NA NA NA NA NA NA NA NA 0.02 NA FALSE
150 150 NA NA NA NA NA NA NA 0.01 NA NA FALSE