前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言:逻辑回归ROC曲线对角线分析过程及结果

R语言:逻辑回归ROC曲线对角线分析过程及结果

作者头像
拓端
发布2021-01-13 14:52:44
1.1K0
发布2021-01-13 14:52:44
举报
文章被收录于专栏:拓端tecdat拓端tecdat

原文链接:http://tecdat.cn/?p=19018

之前我们讨论了使用ROC曲线来描述分类器的优势,有人说它描述了“随机猜测类别的策略”,让我们回到ROC曲线来说明。考虑一个非常简单的数据集,其中包含10个观测值(不可线性分离)

在这里我们可以检查一下,确实是不可分离的

代码语言:javascript
复制
plot(x1,x2,col=c("red","blue")[1+y],pch=19)

考虑逻辑回归

代码语言:javascript
复制
代码语言:javascript
复制
reg = glm(y~x1+x2,data=df,family=binomial(link = "logit"))
代码语言:javascript
复制
我们可以使用我们自己的roc函数
代码语言:javascript
复制


roc=function(s,print=FALSE){
Ps=(S<=s)*1


FP=sum((Ps==1)*(Y==0)/sum(Y==0)


TP=sum((Ps==1)*(Y==1)/sum(Y==1)


if(print==TRUE){


print(table(Observed=Y,Predicted=Ps))




vect=c(FP,TP)


names(vect)=c("FPR","TPR")

或R包

代码语言:javascript
复制
代码语言:javascript
复制
performance(prediction(S,Y),"tpr","fpr")
代码语言:javascript
复制
我们可以在这里同时绘制两个

因此,我们的代码在这里可以正常工作。让我们考虑一下对角线。第一个是:每个人都有相同的概率(例如50%)

代码语言:javascript
复制


points(V[1,],V[2,])

但是,我们这里只有两点:(0,0)和(1,1)。实际上,无论我们选择何种概率,都是这种情况

代码语言:javascript
复制


plot(performance(prediction(S,Y),"tpr","fpr"))
points(V[1,],V[2,])

我们可以尝试另一种策略,例如“通过扔无偏硬币进行预测”。我们得到

代码语言:javascript
复制


segments(0,0,1,1,col="light blue")

我们还可以尝试“随机分类器”,在其中我们随机选择分数

代码语言:javascript
复制




S=runif(10)

更进一步。我们考虑另一个函数来绘制ROC曲线

代码语言:javascript
复制

y=roc(x)lines(x,y,type="s",col="red")

但是现在考虑随机选择的策略

代码语言:javascript
复制


for(i in 1:500){
S=runif(10)
V=Vectorize(roc.curve)(seq(0,1,length=251)
MY[i,]=roc_curve(x)

红线是所有随机分类器的平均值。它不是一条直线,我们观察到它在对角线周围的波动。

代码语言:javascript
复制




reg = glm(PRO~.,data=my,family=binomial(link = "logit"))




plot(performance(prediction(S,Y),"tpr","fpr"))




segments(0,0,1,1,col="light blue")

这是一个“随机分类器”,我们在单位区间上随机绘制分数

代码语言:javascript
复制




segments(0,0,1,1,col="light blue")

如果我们重复500次,我们可以获得

代码语言:javascript
复制
代码语言:javascript
复制

for(i in 1:500){S=runif(length(Y))MY[i,]=roc(x)}lines(c(0,x),c(0,apply(MY,2,mean)),col="red",type="s",lwd=3)segments(0,0,1,1,col="light blue")
代码语言:javascript
复制

因此,当我在单位区间上随机绘制分数时,就会得到对角线的结果。给定Y,我们可以绘制分数的两个经验累积分布函数

代码语言:javascript
复制




plot(f0,(0:(length(f0)-1))/(length(f0)-1))


lines(f1,(0:(length(f1)-1))/(length(f1)-1))

我们还可以使用直方图(或密度估计值)查看分数的分布

代码语言:javascript
复制
hist(S[Y==0],col=rgb(1,0,0,.2),
probability=TRUE,breaks=(0:10)/10,border="white")

我们确实有一个“完美的分类器”(曲线靠近左上角)

有错误。那应该是下面的情况

在10%的情况下,我们可能会分类错误

更多的错误分类

最终我们有对角线

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拓端数据部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原文链接:http://tecdat.cn/?p=19018
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档