2016-11-29 2 views
1

Я использую SVM сделать классификацию мульти-класс с использованием пакета e1071 в R.Получение Cross валидированной Вероятность предсказания в мелодии SVM (e1071)

Я хочу кросс проверена вероятностные предсказаний для каждого класса и каждая точка данных в обучении задавать. i.e Я хочу, чтобы N x K пересекала вероятностную матрицу.

Может ли кто-нибудь сказать мне, как это сделать?

ответ

0

Несколько моментов:

(1) С помощью перекрестной проверки вы измеряете точность модели (обученной на тренировочном наборе данных) на удерживаемых из набора данных, а не на весь набор данных.

(2) Перед вычислением матрицы вам нужно выбрать значения гиперпараметров (C, гамма).

(3) вы можете использовать пакет caret для вычисления желаемой матрицы вероятности, но поскольку это проблема классификации многоклассов, вам нужно выбрать, какой класс вы хотите вычислить для вероятности, перед вычислением матрицы.

Используйте следующий код на диафрагме, который имеет 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