分类模型效果评价

整理一下目前在工作和学习中用到的分类模型效果,也就是俗称的“准确率”的各种表达形式。避免以后忘记,查一下又要给某论坛交记忆税。

(一)准确率accuracy

准确率=分类正确的样本数目/总样本量

大众通常意义上的准确率,一般客户会默认我们所说的准确率是这个定义。

在实际工作中该指标基本没有实际意义(除非模型效果极差)。比如:极少目标识别(全部miss)。通过摄像头下的动作识别小偷。100个人中有10个是小偷,模型把所有人认为“不是小偷”。这种情况下准确率=90/100,也就是90%。但实际上它一个小偷也不会识别出来。

(二)混淆矩阵及查全率R、查准率P

混淆矩阵就是模型预测结果和数据真实属性组成的方阵,形如:

  预测其类别为0 预测其类别为1
实际上类别为0 FF FT
实际上类别为1 TF TT

明显(FF+TT) / (FF+TT+TF+FT)就是上面说的准确率。

查全率是指 在全部目标样本(TF+TT)中,被模型识别出来的样本个数(TT)。recall=(TT) / (TF+TT)

查准率是指 在识别为目标的样本中(FT+TT),实际上确实为目标值的样本个数(TT)。precision=(TT) / (FT+TT)

通过以上的定义可以发现,查全率查准率的定义非常依赖于“目标值(1)”的定义。比如在上个例子中识别小偷,目标就是“识别为小偷”,一般在模型中取该目标值Y=1,其他的非目标样本为Y=0。多分类同理可以进行计算每个类别的查全率查准率,以及综合查全率查准率。

查全率和查准率通常二者不可兼得,类似于跷跷板的两头。实际运用中通常会根据研究目的确认是查全率优先(宁可错杀不可放过)、还是查准率优先(绝对不能认错)。

将两者综合起来实际意义不大,但仍然有一个综合的值,相对平衡地用一个值去度量模型效果,该值为F1-score,常简称为“F值”,F1=(2*recall*precision) / (recall+precision),同样也是越大越好。

但作为数据分析人员需要记住:任何脱离目标定义的R、P、F值都是没有意义的

同时,即使以上三个值都表现还可以,仍然存在一种误差不容易被客户接受:在实际为目标值而没有被识别出来的样本中,存在某类特征明显、意义重大的数据组。该种情况容易给运用模型的人员造成损失,因此即使准确率够高,我依然会在4类数据中进行随机抽取,然后用人脑判别有无这种bug,然后具有针对性地调整输入变量和参数。

计算就很简单,此处略,以后忘了用excel解决也ojbk。

混淆矩阵就table一下(输入glm1.t为模型,data为数据,第一列是实际类别):

pred_glm_all=data.frame(predict(glm1.t,data[,-1]))
p=exp(pred_glm_all)/(1+exp(pred_glm_all))
prob.pred.all=cbind.data.frame(data[,1],p)
p=1*(p>0.5)
t3=data.frame(cbind(data[,1],p))
table(t3)#混淆矩阵

(三)ROC曲线

ROC曲线和AUC值,是图形化的模型效果展示方法之一。

判定方法是ROC曲线与X轴围成的面积越大、AUC值越大,模型效果越好。

这种方法比较直观,用于多模型之间的比较很容易看出来,通常用于多算法进行选择

在R中可以简单快捷的用pROC包完成。输入的两列数据为[Y,prob],分别为实际类别及预测的类别(可以是预测为1类的概率值)

library("pROC")
N <- dim(dat.log)[1] #数据长度
date_roc <- roc(dat.log$Y, dat.log$prob) #计算ROC
plot(date_roc, print.auc = TRUE, auc.polygon = TRUE, legacy.axes = TRUE, grid = c(0.1, 0.2), grid.col = c("green", "red"), max.auc.polygon = TRUE, auc.polygon.col = "skyblue", print.thres = TRUE, xlab = "特异度", ylab = "灵敏度",main = "逻辑回归结果") #绘制ROC曲线

(四)响应率和捕获率

(二)和(三)的准确率定义基本能解决建模过程中的准确率需要,但是像客户展示的时候,上面两种定义很难被客户理解,造成不和谐。因此再添加响应率和捕获率的定义。

比如逻辑回归和svm,可以输出该样本为目标样本的概率值嘛,然后就整理一下结果,形成一列实际值,一列预测值 这样的数据集。

以识别“客户对服务不满意”为目标,将数据集按照预测为“不满意”的概率值 降序 排序。

(1)分别统计前10%、20%、……100%的样本中,它们的实际不满意率(到100%就会接近自然情况的不满意率),这就是响应率,按照这个列表可以看到模型对于目标识别的效果提升。

(2)分别统计前10%、20%、……100%的样本中,它们的不满意样本数量在全部不满意样本数量中的占比,这就是捕获率,可以知道处理几成的数据就可以解决大部分问题(结合二八法则)。

最终会形成个图形

a=响应率,指该占比的样本中的不满意率。模型效果好的话,前面的就会更高。

b=自然不满意率,就是全部样本的平均不满意率。

c=捕获率,指该占比的不满意样本中占全部不满意样本的比率,弧度越大越好。

计算的话目前我没有查有没有包(估计有),我简单用加减乘除算了:

dat.log2 <- arrange(dat.log,desc(dat.log$prob))
dat.log2 <- na.omit(dat.log2)
n0=nrow(dat.log2)/10

n1=ceiling(1*n0)
n2=ceiling(2*n0)
n3=ceiling(3*n0)
n4=ceiling(4*n0)
n5=ceiling(5*n0)
n6=ceiling(6*n0)
n7=ceiling(7*n0)
n8=ceiling(8*n0)
n9=ceiling(9*n0)
n10=ceiling(10*n0)

d1=dat.log2[1:n1,]
d2=dat.log2[1:n2,]
d3=dat.log2[1:n3,]
d4=dat.log2[1:n4,]
d5=dat.log2[1:n5,]
d6=dat.log2[1:n6,]
d7=dat.log2[1:n7,]
d8=dat.log2[1:n8,]
d9=dat.log2[1:n9,]
d10=dat.log2[1:n10,]

#[0,10%] de bu man yi du
a1=sum(d1$BMY)/nrow(d1)
a2=sum(d2$BMY)/nrow(d2)
a3=sum(d3$BMY)/nrow(d3)
a4=sum(d4$BMY)/nrow(d4)
a5=sum(d5$BMY)/nrow(d5)
a6=sum(d6$BMY)/nrow(d6)
a7=sum(d7$BMY)/nrow(d7)
a8=sum(d8$BMY)/nrow(d8)
a9=sum(d9$BMY)/nrow(d9)
a10=sum(d10$BMY)/nrow(d10)

log.xy=rbind.data.frame(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
names(log.xy)=c("XYL")

b1=sum(d1$BMY)/sum(d10$BMY)
b2=sum(d2$BMY)/sum(d10$BMY)
b3=sum(d3$BMY)/sum(d10$BMY)
b4=sum(d4$BMY)/sum(d10$BMY)
b5=sum(d5$BMY)/sum(d10$BMY)
b6=sum(d6$BMY)/sum(d10$BMY)
b7=sum(d7$BMY)/sum(d10$BMY)
b8=sum(d8$BMY)/sum(d10$BMY)
b9=sum(d9$BMY)/sum(d10$BMY)
b10=sum(d10$BMY)/sum(d10$BMY)
log.bh=rbind.data.frame(b1,b2,b3,b4,b5,b6,b7,b8,b9,b10)
names(log.bh)=c("BHL")


不知道还有没有别的,先记在这里。

 

猜你喜欢

转载自www.cnblogs.com/shilo930/p/10511828.html