Извлечение максимального значения каждой строки в матрице и вывод их имен столбцов - PullRequest
0 голосов
/ 27 июня 2018

Я экспериментирую с функцией SVM на данных iris. Цель состоит в том, чтобы извлечь "класс" с наибольшей предсказанной вероятностью для (1) каждой строки (2) из ​​выходной матрицы attr(pred_prob, "probabilities").

data(iris)
attach(iris)
x <- subset(iris, select = -Species) 
y <- Species
model <- svm(x, y, probability = TRUE)
pred_prob <- predict(model, x, decision.values = TRUE, probability = TRUE)
attr(pred_prob, "probabilities")

(Оригинальный код взят из этой предыдущей темы .)
Последняя строка кода даст нам вывод следующего формата:

       setosa  versicolor   virginica
1 0.979989881 0.011347796 0.008662323
2 0.972567961 0.018145783 0.009286256
3 0.978668604 0.011973933 0.009357463

Для простоты сравнения этих предсказанных вероятностей с их реальными "метками" класса (т.е. setosa, versicolor, virginica) я планирую извлечь класс наибольшей предсказанной вероятности для каждой строки из вышеприведенной выходной матрицы. Например, класс наибольшей вероятности для первого наблюдения составляет setosa с прогнозируемой вероятностью 0,9799, которая возвращается из

which(attr(pred_prob, "probabilities")[1,] == max(attr(pred_prob, "probabilities")[1,]), arr.ind = TRUE)

Сейчас я работаю над расширением вышеприведенного кода в цикле, чтобы вывести столбец данных, содержащий прогнозируемую метку класса для каждого наблюдения в данных. Ниже то, что я имею до сих пор, но мне трудно

predicted_class <- attr(pred_prob, "probabilities")
for(row in 1:nrow(predicted_class)) {
output <- print(which(predicted_class[row,] == max(predicted_class[row,]), arr.ind = TRUE))
output
}

Но это не дает мне того, что я предполагал, кажется, что он возвращает только предсказанный класс из случайной строки (пока я хочу столбец предсказанных классов для всех наблюдений). Может ли кто-нибудь просветить меня об этом?

1 Ответ

0 голосов
/ 27 июня 2018

Использование max.col

colnames(pred_prob)[max.col(pred_prob)]
#[1] "setosa" "setosa" "setosa"

Или используя цикл

output <- vector("double", nrow(pred_prob))

for(row in 1:nrow(pred_prob)) {
  output[row] <- which.max(pred_prob[row,])
}

output
#[1] 1 1 1

или apply

apply(pred_prob, MARGIN = 1, FUN = which.max)
#1 2 3 
#1 1 1 

данные

pred_prob <- structure(c(0.979989881, 0.972567961, 0.978668604, 0.011347796, 
0.018145783, 0.011973933, 0.008662323, 0.009286256, 0.009357463
), .Dim = c(3L, 3L), .Dimnames = list(c("1", "2", "3"), c("setosa", 
"versicolor", "virginica")))
...