2015-07-21 1 views
0

Я пытаюсь понять результаты объекта предсказания с помощью функции confusionMatrix() функции Caret, которая требует ввода таблицы в соответствии с http://artax.karlin.mff.cuni.cz/r-help/library/caret/html/confusionMatrix.html, моя таблица() создает результаты, которые я понять, но не дружит с функцией confusionMatrix()создание фрейма данных для confusionMatrix (ввод 0, однако получение необычного dataframe

Вот соответствующий фрагмент кода:.

#MODEL CREATION 
#convert categorical A to E values , into numeric 1 to 5 in order to be regression friendly 
training_data_subset_numeric <- training_data_subset; 
testing_data_subset_numeric <- testing_data_subset; 
training_data_subset_numeric$classe <- as.numeric(training_data_subset$classe) 
testing_data_subset_numeric$classe <- as.numeric(testing_data_subset$classe) 
#model 
exercise.model <- glm(formula = classe ~ ., data = training_data_subset_numeric) 
#MODEL EVALUATION 
exercise.prediction <- predict(exercise.model,newdata = testing_data_subset_numeric) 
eval_table <- table(exercise.prediction,testing_data_subset$classe) 
tail(eval_table) 

exercise.prediction A B C D E 
    4.35504232913594 1 0 0 0 0 
    4.47219097065568 1 0 0 0 0 
    4.50838854075835 1 0 0 0 0 
    4.6173551930011 0 1 0 0 0 
    4.69261223447305 0 1 0 0 0 
    4.73297946213265 0 1 0 0 0 

в принципе мне нужно преобразовать выше вывод, к кадру данных с 1 цв соответствует pr Значение ediction, что следует за этим правилом:

Если в колонке А 1, чем предсказанное значение равно 1

Если в колонке Б равно 1, чем предсказанное значение равно 2

Если в колонке С 1, чем прогнозировалось значение равно 3

Если в колонке D равен 1, чем предсказанное значение равно 4

Если в колонке Е 1, чем предсказанное значение равно 5

Поэтому я написал эту функцию, чтобы получить работу:

getPredictResults<- function(x) 
{ 
# create 1 column & n row data frame 
num <- data.frame(matrix(0, ncol = 1, nrow = nrow(x))); 

for (r in 1:nrow(x)) { 

for (c in 1:ncol(x)) { 
    #if column A has value 1 than num[1,r] <- 1 
    if (x[r,'A']== 1) 
    { 
     num[1,r] <- 1; 
    } 
    #if column B has value 1 than num[1,r] <- 2 
    else if (x[r,'B']== 1) 
    { 
     num[1,r] <- 2; 
    } 
    #if column C has value 1 than num[1,r] <- 3 
    else if (x[r,'C']== 1) 
    { 
     num[1,r] <- 3; 
    } 
    #if column D has value 1 than num[1,r] <- 4 
    else if (x[r,'D']== 1) 
    { 
     num[1,r] <- 4; 
    } 
    #if column E has value 1 than num[1,r] <- 5 
    else if (x[r,'E']== 1) 
    { 
     num[1,r] <- 5; 
    } 
    else 
    { 
    } 

}#end inner for 

}#end outer for 

return (num); 
}#end function 

exercise.prediction_df <- getPredictResults(eval_table) 

Однако при вводе:

head(exercise.prediction_df) 

Im получая необычный выход, вот нижний фрагмент:

2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
    V4840 V4841 V4842 V4843 V4844 V4845 V4846 V4847 V4848 V4849 V4850 V4851 V4852 V4853 V4854 V4855 V4856 V4857 
1  5  1  4  5  2  2  5  5  1  2  5  4  5  5  1  5  5  4 
2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
    V4858 V4859 V4860 V4861 V4862 V4863 V4864 V4865 V4866 V4867 V4868 V4869 V4870 V4871 V4872 V4873 V4874 V4875 
1  4  2  1  2  5  1  4  5  2  1  4  5  2  4  2  4  4  2 
2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
    V4876 V4877 V4878 V4879 V4880 V4881 V4882 V4883 V4884 V4885 V4886 V4887 V4888 V4889 V4890 V4891 V4892 V4893 
1  5  1  1  4  1  2  2  1  1  5  1  4  1  1  1  1  1  1 
2 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
    V4894 V4895 V4896 V4897 V4898 V4899 V4900 V4901 V4902 V4903 V4904 
1  1  1  1  1  1  1  1  1  2  2  2 
2 NA NA NA NA NA NA NA NA NA NA NA 
[ reached getOption("max.print") -- omitted 4 rows ] 

Дальнейшие исследования показывают:

> ncol(exercise.prediction_df) 
[1] 4904 
> nrow(exercise.prediction_df) 
[1] 4904 

Какой Ncol() должен возвращать только 1 & nrow(), очевидно, может быть любое целое число.

Как исправить эту функцию, чтобы создать правильный фрейм данных как входной сигнал для функции confusionMatrix()?

Спасибо.

+0

Я не спросил, был ли этот алгоритм оптимальным? Это даже не было подходящим форумом, пожалуйста, внимательно прочитайте мой вопрос, спасибо. – cyber101

ответ

0
classe <- cut(runif(100), seq(0, 1, length.out = 5)) 
levels(a) <- c("A", "B", "C", "D", "E") 
exercise.prediction <- rnorm(100) 
eval_table <- table(exercise.prediction, classe) 

eval_matrix <- as.matrix(tab) 

transform <- apply(eval_matrix, 1, function(x) sum(x * c(1:5))) 
head(as.data.frame(transform)) 
+0

Вы прочитали вопрос? Алгоритм уже написан, я просто блуждаю, почему данные забираются некорректно, не нужно ничего умножать. Кстати, ваш ввод неверен, пожалуйста, обратитесь к моему вводу, который является результатом функции pred(). – cyber101

+1

1. Да, я прочитал вопрос, вы не представили воспроизводимый пример, поэтому я предположил, что вы смогли преобразовать столбцы A-E в свой 'eval_table' в матрицу или фрейм данных (см. Редактирование моего ответа). Я, честно говоря, не знаю, почему ваша функция не работает, и я не собираюсь это выяснять. Мое решение работает и состоит из двух строк, ваше - около 30 и включает вложенный цикл, который не является хорошим стилем R. 2. Если вы попросите людей помочь вам бесплатно, вы можете рассмотреть тон своих ответов. –

Смежные вопросы