刚开始看这玩意儿时心里还在想,应该不是很难吧,一会会儿就能搞定了吧~~~结果,一会儿就混~淆~了~
介绍这个东东的教材通常重点都集中在二元矩阵里头一堆的术语和相关计算,但以本人一向喜欢胡搞瞎搞的性情,怎么也得整个多点的啊~~然后,我就成功地把自己套路进去了
上数据,从之前某期的计算结果里抠出来了两列,一列是用算法搞出来的预测值Simulation,另一列是实际情况Actual,这里可以稍稍注意下两列的顺序,当然,不注意的话后面用table函数时加个转置t也成
生成混淆矩阵本身不是件太难的事情,一个table函数即可,重点是行列位置,要保证Actual在上Sim在下(嗯,是A在上 : x)
麻烦在后面要计算的那些概念,我按自己能捋清楚的方式来写
正确率Accuracy = 左上到右下的这条主对角线上全部/整表总和
Misclassification = 1-Accuracy
响应率Precision = 主对角线上某值/它所在的行总和
查全率Recall = 敏感度Sensitivity =主对角线上某值/它所在的列总和
F指标 F-Measure = (2*Precision*Recall)/(Precision+ Recall)
Specificity = (主对角线上某值所在行总和-它本身)/排除这个值所在列的整表总和
False Positive Rate = 1- Specificity
呼~~按照上面这个逻辑(如果我没整错的话),开始动手写算法:
1) 正确率
Accuracy <- sum(ConM * diag(ncol(ConM)))/sum(ConM)
我感觉自己的做法有点小小的非主流,因为想直接取出主对角线的缘故,所以在原矩阵上乘了一个相同大小的单位矩阵(函数diag),步骤分解出来大概是下边这样
2) 响应率、查全率、F指标+Specificity
这个需要指定矩阵中的某个特定的level,干脆放一起写个function
#响应率、查全率、F指标
Measures <- function (x) {
Levels <- dimnames(ConM)[[1]];
p1<- which(x == Levels);
Precision <- ConM[p1,p1]/sum(ConM[p1,]);
Recall <- ConM[p1,p1]/sum(ConM[,p1]);
F.Measure <- (2*Precision*Recall)/(Precision+ Recall);
Specificity <- sum(ConM[p1,-p1])/sum(ConM[,-p1]);
M3 <- data.frame(Precision, Recall, F.Measure, Specificity);
return(M3) }
欧啦,看看算出来的效果
还可以还可以,这样至少今天可以先收工了