ROC、AUC、经验误差和估计方法

1、什么是ROC

ROC的全名叫做Receiver Operating Characteristic,其主要分析工具是一个画在二维平面上的曲线——ROC 曲线。平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)。对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。这样,此分类器就可以映射成ROC平面上的一个点。调整这个分类器分类时候使用的阈值,我们就可以得到一个经过(0, 0),(1, 1)的曲线,这就是此分类器的ROC曲线。一般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上方。因为(0, 0)和(1, 1)连线形成的ROC曲线实际上代表的是一个随机分类器。如果很不幸,你得到一个位于此直线下方的分类器的话,一个直观的补救办法就是把所有的预测结果反向,即:分类器输出结果为正类,则最终分类的结果为负类,反之,则为正类。虽然,用ROC 曲线来表示分类器的性能很直观好用。可是,人们总是希望能有一个数值来标志分类器的好坏。于是Area Under roc Curve(AUC)就出现了。顾名思义,AUC的值就是处于ROC 曲线下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的性能。AUC(Area Under roc Curve)是一种用来度量分类模型好坏的一个标准。

ROC示例曲线(二分类问题):

解读ROC图的一些概念定义::
真正(True Positive , TP)被模型预测为正的正样本;
假负(False Negative , FN)被模型预测为负的正样本;
假正(False Positive , FP)被模型预测为正的负样本;
真负(True Negative , TN)被模型预测为负的负样本。


真正例率(Ture positive rare),TPR=TP/(TP+FN)ROC曲线的纵轴
假正例率(False positive rare),FPR=FP/(TN+FP) ROC曲线的横轴

2、为什么使用ROC曲线

既然已经这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。下图是ROC曲线和Precision-Recall曲线的对比:



在上图中,(a)和(c)为ROC曲线,(b)和(d)为Precision-Recall曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)和(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果。可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。

【Precision/Recall曲线】

要评价信息检索系统的性能水平,就必须在一个检索系统中进行多次检索。每进行一次检索,都计算其查准率和查全率,并以此作为坐标值,在平面坐标图上标示出来。通过大量的检索,就可以得到检索系统的性能曲线。
Precision/Recall曲线一般是以每一次计算的查全率为横坐标,每一次计算的查准率为纵坐标。如下图所示:


该图是由100次检索得到的,由图可知:在查全率和查准率之间存在着相反的相互依赖关系–如果提高输出的查全率,就会降低其查准率

3、AUC值

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。


4、经验误差与过拟合

经验误差是指在训练集上得到的误差。通常我们把分类错误的样本数占样本总数的比例称为"错误率”,学习器在训练集上的误差称为“经验误差”或“训练误差”,在新样本上的误差称为“泛化误差”。我们需要的是泛化误差低的学习器,但是我们只能习得一个经验误差很小、在训练集上表现很好的学习器。然而,如果学习器把训练样本的自身的一些特点当做了所有潜在样本都具有的一般性质,会导致泛化性能下降,这称为“过拟合”,相对的“欠拟合”是指对样本的一般性质未学好。

过拟合通常是由于学习能力过于强大,而欠拟合则相反。不过欠拟合比较容易客服,比如在决策树学习中扩展分支和在神经网络学习中增加训练轮数,但是过拟合就很麻烦。过拟合是无法彻底避免的,能做的只有在一些算法中进行相关的“缓解”操作。

image

5、评估方法

通常我们通过实验测试对学习器的泛化误差进行评估并进而做出选择,因此需要一个“测试集”,以测试集上的“测试误差”作为泛化误差的近似值。所以我们假设测试样本也是从样本真实分布中独立同分布采样而得,需要注意的是测试集要尽可能与训练集互斥。常见的做法有“留出法”、“交叉验证法”、“自助法”。

留出法,直接将数据集按给定比例进行若干次随机分割,并尽可能保持分割后的训练集跟测试集数据分布后的一致。在进行n次评估后,留出法返回n次结果的均值。例如数据集D有500个正例和500反例,按70%训练集、30测试集划分,得到了训练集包含350正例、350反例,测试集包含150正例、150反例。通常将2/3~4/5的样本用于训练,剩余用作测试。

# 留出法顺序分割 方法一:
def HoldOut(df, M):
    test = df[:M]
    train = df[M:]
    return train , test

# 留出法 方法二:
from sklearn.model_selection import train_test_split
train_data, test_data = train_test_split(data, test_size=0.2)

交叉验证法,把数据集分成k个大小相似的互斥子集,每个子集尽可能数据分布一致。然后每次把k-1个子集当成训练集,剩下一个当成测试集,从而可以进行k次训练和测试,最终返回k次结果的均值。k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值。常见的有10次10折交叉验证。其中当k=m时就是留一法,准确度很高但在数据集很大时耗费资源大,不适合。


image
# K次交叉验证
from sklearn.model_selection import KFold
kf = KFold(n_splits=2)  # 设置k的次数
for train_index, test_index in kf.split(df):
    print("TRAIN:", train_index, "TEST:", test_index)
    train_data_kf, test_data_kf = df[train_index], df[test_index]

自助法,给定m个样本的数据集D,并对它进行采样m次得到数据集D'。于是可以将D’用作训练集,D/D'用作测试集来对学习器进行评估。自助法在数据集较少、难以有效划分训练\测试集时很有用。

#  自助法
def SplitData(df, M, k, seed):
    test = []
    train = []
    random.seed(seed)
    for users, items in df:
        if random.randint(0, M) == k:
            test.append([users, items])
        else:
            train.append([users, items])
    return train , test

参考简书
完整代码请参考码云

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容