【问题标题】:creating data frame for confusionMatrix(0 input, however getting unusual dataframe为confusionMatrix创建数据框(0输入,但是得到不寻常的数据框
【发布时间】:2015-10-10 07:02:44
【问题描述】:

我试图通过插入符号的confusionMatrix() 函数来理解预测对象的结果,该函数需要根据http://artax.karlin.mff.cuni.cz/r-help/library/caret/html/confusionMatrix.html 进行表格输入,我的table() 创建了我理解的结果,但它对confusionMatrix() 不友好功能。

这里是相关代码sn-p:

#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 col 对应于遵循此规则的预测值:

如果 A 列是 1 ,则预测值为 1

如果 B 列是 1 ,则预测值为 2

如果 C 列是 1 ,则预测值为 3

如果 D 列是 1 ,则预测值为 4

如果 E 列是 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)

我得到一个不寻常的输出,这是底部的 sn-p:

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() 函数的输入?

谢谢。

【问题讨论】:

  • 我没有问“这个算法是否最优?”这甚至不是正确的论坛,请仔细阅读我的问题,谢谢。

标签: r confusion-matrix


【解决方案1】:
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))

【讨论】:

  • 你读过这个问题吗?算法已经写好了,我只是在徘徊为什么数据被错误地强制,不需要乘任何东西。顺便说一句,您的输入不正确,请参考我的输入,这是 predict() 函数的结果。
  • 1.是的,我已经阅读了这个问题,您没有提供可重现的示例,因此我假设您能够将 eval_table 中的 A-E 列转换为矩阵或数据框(请参阅我的答案的编辑)。老实说,我不知道为什么您的功能不起作用,我也不会弄清楚。我的解决方案有效,有两行,你的大约 30 行,涉及嵌套循环,这不是好的 R 风格。 2. 如果您要求人们免费帮助您,您可能会考虑您的回复语气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2013-02-23
  • 1970-01-01
  • 2018-07-14
  • 2019-05-16
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多