专栏首页大数据建模的一点一滴模型评估 | R语言实现ROC

模型评估 | R语言实现ROC

上一篇是关于ROC的含义及Python的实现,现在通过R来实现ROC,实现逻辑完全一样。

其中Pred_Var是预测结果,可以为预测概率或评分;labels_Var是目标变量,取值0或1;N表示在计算AUC值时切分的数量;descending表示数据是否降序排列,当Pred_Var为评分时升序,当Pred_Var为概率时降序;输出结果为存放AUC值和ROC曲线对象的列表。

library(dplyr)
library(ggplot2)
PlotROC_N <-function(Pred_Var, labels_Var, descending, N){
  # Pred_Var is prob: descending=1
  # Pred_Var is score: descending=0
  
  df<- data.frame(Pred=Pred_Var, labels=labels_Var)
  
  if (descending==1){
    df1<-arrange(df, desc(Pred))
  }else if (descending==0){
    df1<-arrange(df, Pred)
  }
  
  len<- ceiling(dim(df1)[1]/N)
  N_0<- table(df1$labels)[1]
  N_1<- table(df1$labels)[2]
  
  I<- c(0)
  TPR<- c(0)
  FPR<- c(0)
  area<- c(0)
  
  L<- nrow(df1)
  if (N>L) N<- L
  df1$rowno<- 1:L
  qus<- quantile(1:L, probs = seq(0,1, 1/N))
  
  out<- mapply(
    function(i){
      sub<- df1[df1$rowno<ifelse(i==N, qus[i+1]+0.001, qus[i+1]), ]
      I<<- c(I, i)
      
      TPR_temp<-sum(sub$labels==1)/N_1
      FPR_temp<-sum(sub$labels==0)/N_0
      area_temp<-0.5*(TPR_temp+TPR[length(TPR)])*(FPR_temp-FPR[length(FPR)])
      
      TPR<<- c(TPR, TPR_temp)
      FPR<<- c(FPR, FPR_temp)
      area<<- c(area, area_temp)
      
    }, 1:N)
  
  df_roc<- data.frame(I=I, TPR=TPR, FPR=FPR, area=area)
  
  #calculate the AUC: area under the curve
  AUC<-round(sum(df_roc$area), 4)
  
  # Plot ROC-curve
  PlotROC<- ggplot(
    data = df_roc, aes(x= FPR, y = TPR)) +
    geom_line(colour='steelblue4', size=1.2) +
    geom_abline(intercept=0, slope =1, linetype=2, size=1, colour="gray40") + 
    
    scale_x_continuous(breaks=seq(0,1,.2))+
    scale_y_continuous(breaks=seq(0,1,.2))+
    
    annotate("text", x = 0.5, y = 1.05, label=paste("AUC=",AUC), size=4, alpha=0.8) + 
    labs(x="False positive rate", y ="True positive rate", title ="ROC-Curve") +
    
    theme_bw()+
    theme(
      plot.title=element_text(colour="gray24",size=12,face="bold"),
      plot.background = element_rect(fill = "gray90"),
      axis.title=element_text(size=10),
      axis.text=element_text(colour="gray35")
    )
  
  result<-list(AUC=AUC, PlotROC=PlotROC)
  return(result)
}

运行代码,设置N=10,N越大AUC值越精确:

result <- PlotROC_N(predict, y, 1, 10)

AUC值:

> result$AUC
[1] 0.806

ROC曲线:

result$PlotROC

本文分享自微信公众号 - 大数据建模的一点一滴(bigdatamodeling)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 模型评估 | Python实现ROC

    首先从混合矩阵说起,混合矩阵是真实类别与预测类别的交叉表,其中矩阵的行表示真实值,矩阵的列表示预测值,二分类问题的混合矩阵如下:

    小石头
  • 徒手撸算法 | 线性回归

    其中,x1, x2, ..., xp是预测变量,x0恒为1;θ1, θ2, ..., θp是预测变量系数(权重或参数),θ0是偏置项(截距),令θ=(θ0, θ...

    小石头
  • Matplotlib | 创建图形(figure)对象

    Matplotlib中有多种创建图形对象的方法,常用到的有三种,下面直接举例子说明。

    小石头
  • IV值和WOE值记录

    1)用途:评价特征或变量的预测能力。类似的指标还有信息增益 、增益率和基尼系数等

    DuncanZhou
  • 第172天:面向对象基本知识点

                         2 .构造函数内部会创建一个新的对象,即f的实例

    半指温柔乐
  • 彻底填平Static坑(细节决定成败)

    学习的过程就是填坑的过程,可不要偷懒想着跳过去,你现在跳过去,就相当于给自己挖了一个坑,你迟早会掉进去的,为了避免不掉坑,所以,努力填坑吧!

    泰斗贤若如
  • 【答疑释惑】C语言里面栈和堆的区别

    很多初学者朋友对C语言里面的堆和栈理解的不是太清楚,模模糊糊。他们到底有哪些区别呢?我认为主要从以下几根方面来了解他们的不同之处: 1,变量位置:栈和堆都是程...

    程序员互动联盟
  • Java基础深入解析——类与对象

    成员变量与局部变量的区别 1.成员变量定义在类中,整个类中都能够访问。   局部变量定义在局部代码块中,只能在局部代码块中访问。 2.成员变量存在于堆内存中,有...

    大闲人柴毛毛
  • jieba(结巴)分词种词性简介

    在做实际项目中,经常用到文本分析过程中的结巴分词功能,为了更好的得到结果,需要限定分词词性,接替可参见之间的博客: http://blog.csdn.net...

    学到老
  • 从技术人到管理者:阿里的职场4年,教会了他2件事!

    他却说:“站在已经三十多的年龄关口,想想自己也太过尘埃,或许我需要一个适合我去主导的舞台,玩出自己想要的精彩。”

    养码场

扫码关注云+社区

领取腾讯云代金券