4.4.2分类模型评判指标(二) - ROC曲线与AUC面积

简介

ROC曲线与AUC面积均是用来衡量分类型模型准确度的工具。通俗点说,ROC与AUC是用来回答这样的问题的:

  • 分类模型的预测到底准不准确?
  • 我们建出模型的错误率有多大?正确率有多高?
  • 两个不同的分类模型中,哪个更好用?哪个更准确?

一句话概括版本:

ROC是一条线,如果我们选择用ROC曲线评判模型的准确性,那么越靠近左上角的ROC曲线,模型的准确度越高,模型越理想;

AUC是线下面积,如果我们选择用AUC面积评判模型的准确性,那么模型的AUC面积值越大,模型的准确度越高,模型越理想;


数据分析与挖掘体系位置

ROC曲线与AUC面积都是评判模型结果的指标,因此属于模型评估的一部分。此外,ROC曲线与AUC面积均多用于判断分类器(Classifier)的优劣,因此适用于分类型的数据模型,如分类树(Classification Tree)、逻辑回归(Logistic Regression)、线性判别分析(Linear Discriminant Analysis)等方法。

在分类型模型评判的指标中,常见的方法有如下三种:

  1. 混淆矩阵(也称误差矩阵,Confusion Matrix)
  2. ROC曲线
  3. AUC面积

本篇主要介绍第二与第三种方法,即ROC曲线与AUC面积。

此方法在整个数据分析与挖掘体系中的位置如下图所示。



ROC曲线的定义

ROC曲线全称为受试者工作特征曲线(Receiver Operating Characteristic Curve)。虽然听上去很高端,但是ROC其实非常容易理解。一句话说,ROC就是一张图上的曲线,我们通过曲线的形状来判定模型的好坏。

那么要想了解一个曲线代表什么意思,首先最好搞明白曲线的横轴与纵轴分别代表什么。


下图中显示的是两条ROC曲线,一条蓝色,一条红色。他们分别对应两个不同的模型。我们可以看到,图中横轴写着“False positive rate”,纵轴写着“True positive rate”。

这两个就是ROC曲线绘制的关键:我们通过计算分类模型的“False positive rate”与“True positive rate”值,分别把它们当成横纵轴,就能够绘制出这个模型的ROC曲线。

那么,怎么计算这两个指标呢?

ROC曲线的计算

ROC曲线的横轴与纵轴,与混淆矩阵(Confusion Matrix)有着密切的关系,具体的理解请详见混淆矩阵篇的讲解。这里只是简单回顾一下:

在分类型模型中,以二分类为例,我们的模型结果一般可以视为0/1问题,或者说positive/negative的问题。模型的产出物,不是positive,就是negative。

我们通过样本的采集,能够直接知道真实的情况下,哪些数据结果是positive,哪些结果是negative。同时,我们通过用样本数据跑出分类型模型的结果,也可以知道模型认为这些数据哪些是positive,哪些是negative。

因此,我们就能得到这样四个结果:

  • 真实值是positive,模型认为是positive的数量(True Positive=TP)
  • 真实值是positive,模型认为是negative的数量(False Negative=FN)
  • 真实值是negative,模型认为是positive的数量(False Positive=FP)
  • 真实值是negative,模型认为是negative的数量(True Negative=TN)

将这四种结果一起呈现在表格中,就能得到如下这样一个矩阵,我们称它为混淆矩阵(Confusion Matrix):



从名字上就能看出,ROC的横纵轴计算方式是与混淆矩阵有着密切关系的。


横轴(False positive rate)的计算:

横轴的指标,在英文中被称为False positive rate,简称FPR。

FPR可以被理解为:在所有真实值为Negative的数据中,被模型错误的判断为Positive的比例。其计算公式为:


纵轴(True Positive Rate)的计算:

纵轴的指标,在英文中被称为True Positive Rate,简称TPR。

TPR可以被理解为:在所有真实值为Positive的数据中,被模型正确的判断为Positive的比例。其计算公式为:



ROC曲线的解读

FPR与TPR分别构成了ROC曲线的横纵轴,因此我们知道在ROC曲线中,每一个点都对应着模型的一次结果。

  • 如果ROC曲线完全在纵轴上,代表这一点上,x=0,即FPR=0。模型没有把任何negative的数据错误的判为positive,预测完全准确。这是真正的大牛模型,我是做不出来了。
  • 如果ROC曲线完全在横轴上,代表这一点上,y=0,即TPR=0。模型没有把任何positive的数据正确的判断为positive,预测完全不准确。平心而论,这种模型能做出来也是蛮牛的,因为模型真正做到了完全不准确,所以只要反着看结果就好了嘛。
  • 所以如果ROC曲线完全与右上方45度倾角线重合,证明模型的准确率是正好50%,错判的几率是一半一半。

因此,我们绘制出来ROC曲线的形状,是希望TPR大,而FPR小。因此对应在图上就是曲线尽量往左上角贴近。45度的直线一般被常用作Benchmark,即基准模型,我们的预测分类模型的ROC要能优于45度线,否则我们的预测还不如50/50的猜测来的准确。

所以,回到下图。从整个图上看,红色的ROC线更靠近左上方。因此,红色线代表的SVM分类器的表现要整体优于蓝色线代表的LDA分类器。



ROC曲线的绘制

我们已经知道,ROC曲线中的每一个点就能代表一次预测的结果。那么整条ROC的曲线是如何绘制的呢?

答案就是:ROC曲线上的一系列点,代表选取一系列的阈值(threshold)产生的结果。

在分类问题中,我们模型预测的结果不是negative/positive。而是一个negatvie或positive的概率。那么在多大的概率下我们认为观测值应该是negative或positive呢?这个判定的值就是阈值(threshold)。

ROC曲线上众多的点,每个点都对应着一个阈值的情况下模型的表现。多个点连起来就是ROC曲线了。


AUC的定义与解读

AUC的英文叫做Area Under Curve,即曲线下的面积,不能再直白。它就是值ROC曲线下的面积是多大。每一条ROC曲线对应一个AUC值。AUC的取值在0与1之间。

  • AUC = 1,代表ROC曲线在纵轴上,预测完全准确。不管Threshold选什么,预测都是100%正确的。
  • 0.5 < AUC < 1,代表ROC曲线在45度线上方,预测优于50/50的猜测。需要选择合适的阈值后,产出模型。
  • AUC = 0.5,代表ROC曲线在45度线上,预测等于50/50的猜测。
  • 0 < AUC < 0.5代表ROC曲线在45度线下方,预测不如50/50的猜测。
  • AUC = 0代表ROC曲线在横轴上,预测完全不准确。


ROC曲线在R中的实现

rm(list=ls())

# 引入library
library(ggplot2)
library(reshape2)
library(ROCR)

# 引入样本,划分Train与Test
diamonds$is_expensive <- diamonds$price > 2400
is_test <- runif(nrow(diamonds)) > 0.75
train <- diamonds[is_test==FALSE,]
test <- diamonds[is_test==TRUE,]

################### Logistic Model A ################### 
fit_A <- glm(is_expensive ~ carat + cut + clarity, data=train)

# 预测
prob_A <- predict(fit_A, newdata=test, type="response")
pred_A <- prediction(prob_A, test$is_expensive)
perf_A <- performance(pred_A, measure = "tpr", x.measure = "fpr")

# 计算AUC
auc_A <- performance(pred_A, measure = "auc")
auc_A <- [email protected][[1]]

# ROC曲线数据
roc.data_A <- data.frame(fpr=unlist([email protected]),
                         tpr=unlist([email protected]),
                         model="GLM_A")

################### Logistic Model B ################### 					   
fit_B <- glm(is_expensive ~ carat, data=train)

# 预测
prob_B <- predict(fit_B, newdata=test, type="response")
pred_B <- prediction(prob_B, test$is_expensive)
perf_B <- performance(pred_B, measure = "tpr", x.measure = "fpr")

# 计算AUC
auc_B <- performance(pred_B, measure = "auc")
auc_B <- [email protected][[1]]

# ROC曲线数据
roc.data_B <- data.frame(fpr=unlist([email protected]),
                         tpr=unlist([email protected]),
                         model="GLM_B")

################### 绘制ROC曲线 ################### 		

# 将两个模型的结果放在一个data frame下
roc.data <- rbind(roc.data_A,roc.data_B)  
summary(roc.data)

ggplot(roc.data, aes(x=fpr, y=tpr, color=model)) + geom_line()

猜你喜欢

转载自blog.csdn.net/orange_spotty_cat/article/details/80499031