前言
ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值哪森分类器(binary classifier)的优劣。这篇文章将先简单的介绍ROC和AUC,而后用实例演示如何python作出ROC曲线图以及计算AUC。
AUC介绍
AUC(Area Under Curve)是机器学习二分类模型中非常常用的评估指标,相比于F1-Score对项目的不平衡有更大的容忍性,目前常见的机器学习库中(比如scikit-learn)一般也都是集成该指标的计算,但是有时候模型是单独的或者自己编写的,此时想要评估训练模型的好坏就得自己搞一个AUC计算模块,本文在查询资料时发现libsvm-tools有一个非常通俗易懂的auc计算,因此抠出来用作日后之用。
AUC计算
AUC的计算分为下面三个步骤:
1、计算数据的准备,如果模型训练时只有训练集的话一般使用交叉验证的方式来计算,如果有评估集(evaluate)一般就可以直接计算了,数据的格式一般就是需要预测得分以及其目标类别(注意是目标类别,不是预测得到的类别)
2、根据阈值划分得到横(X:False Positive Rate)以及纵(Y:True Positive Rate)点
3、将坐标点连成曲线之后计算其曲线下面积,就饥袭是AUC的值
直接上python代码
#! -*- coding=utf-8 -*-
import pylab as pl
from math import log,exp,sqrt
evaluate_result="you file path"
db = [] #[score,nonclk,clk]
pos, neg = 0, 0
with open(evaluate_result,'r') as fs:
for line in fs:
nonclk,clk,score = line.strip().split('\t')
nonclk = int(nonclk)
clk = int(clk)
score = float(score)
db.append([score,nonclk,clk])
pos += clk
neg += nonclk
db = sorted(db, key=lambda x:x[0], reverse=True)
#计算ROC坐标点
xy_arr = []
tp, fp = 0., 0.
for i in range(len(db)):
tp += db[i][2]
fp += db[i][1]
xy_arr.append([fp/neg,tp/pos])
#计算曲线下面积
auc = 0.
prev_x = 0
for x,y in xy_arr:
if x != prev_x:
auc += (x - prev_x) * y
prev_x = x
print "the auc is %s."%auc
x = [_v[0] for _v in xy_arr]
y = [_v[1] for _v in xy_arr]
pl.title("ROC curve of %s (AUC = %.4f)" % ('svm',auc))
pl.xlabel("False Positive Rate")
pl.ylabel("True Positive Rate")
pl.plot(x, y)# use pylab to plot x and y
pl.show()# show the plot on the screen
输入的数据集可以参考svm预测结果
其格式为:
nonclk \t clk \t score
其中:
1、nonclick:未点击的数据,可以看做负样本的数量
2、clk:点击的数量,可以看做正样本的数量
3、score:预测的分数,以该分数为group进行正负样本的预统计可以减少AUC的计算量
运行的结果为:
烂缓兄 如果本机没安装pylab可以直接注释依赖以及画图部分
注意
上面贴的代码:
1、只能计算二分类的结果(至于二分类的标签随便处理)
2、上面代码中每个score都做了一次阈值,其实这样效率是相当低的,可以对样本进行采样或者在计算横轴坐标时进行等分计算
首先我们来看看对AUcell的介绍
AUCell可以识别单细胞RNA序列数据中具有活跃基因集(例如signatures,基因模块...)的细胞。 AUCell使用“曲线下面积”(AUC)来计算输入基因集的关键子集是否在每个细胞的表达基因中富集。 AUC分数在所有细胞中的分布允许探索特征的相对表达。 由于计分方法是基于排名的,因此AUCell不受基因表达单位和标准化程序的影响。 此外,由于对cell进行了单独评估,因此可以轻松地将其应用于更大的数据集,并根据需要对表达式矩阵进行分组。
那也就是说,AUcell是分析感兴趣的基因集在所有细胞是否存在富集,道理很简单,我们来看看主要分析内容
用AUcell进行分析分三步:
1、 Build the rankings
2、Calculate the Area Under the Curve (AUC)
3、Set the assignment thresholds
For each cell, the genes are ranked from highest to lowest value. The genes with same expression value are shuffled. Therefore, genes with expression ‘0’ are randomly sorted at the end of the ranking. It is important to check that most cells have at least the number of expressed/detected genes that are going to be used to calculate the AUC (aucMaxRank in calcAUC()). The histogram provided by AUCell_buildRankings() allows to quickly check this distribution. plotGeneCount(exprMatrix) allows to obtain only the plot before building the rankings.
这个地方我们可以看出,对于每个基因,从高到底进行排名,也就是说每个细胞的每个基因都有一个排名,得到一个排名的矩阵。
二、 什么是ROC曲线
ROC全称是“受试者工作特征”(Receiver OperatingCharacteristic)曲线。 我们根据学习器的预测结果,把阈值从0变到最大,即刚开始是把每个样本作为正例进行预测,随着阈值的增大,学习器预测正样例数越来越少,直到最后没有一个样本是正样例。在这一过程中,每次计算出两个重要量的值,分别以它们为横、纵坐标作图,就得到了“ROC曲线”。
** ROC曲线的纵轴是“真正例率”(True Positive Rate, 简称TPR),横轴判悔是“假正例率”(False Positive Rate,简称FPR),**基于上篇文盯虚章 《错误率、精度、查准率、查全率和F1度量》 的表1中符号,两者分别定义为:
显示ROC曲线的图称为“ROC图”。图1给出了一个示意图,显然, 对角线掘则正对应于“随机猜测”模型 ,而点(0,1)则对应于将所有正例预测为真正例、所有反例预测为真反例的“理想模型”。
图1:ROC曲线与AUC面积
现实任务中通常是利用有限个测试样例来绘制ROC图,此时仅能获得有限个(真正例率,假正例率)坐标对,无法产生图1中的光滑ROC曲线,只能绘制出图2所示的近似ROC曲线。绘制过程很简单:给定m + 个正例和m - 个反例,根据学习器预测结果对样例进行排序,然后把分类阈值设置为最大,即把所有样例均预测为反例,此时真正例率和假正例率均为0,在坐标(0,0)处标记一个点。然后,将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。设前一个标记点坐标为
三、 ROC曲线的意义
(1)主要作用
1. ROC曲线能很容易的查出任意阈值对学习器的泛化性能影响。
2.有助于选择最佳的阈值。ROC曲线越靠近左上角,模型的查全率就越高。最靠近左上角的ROC曲线上的点是分类错误最少的最好阈值,其假正例和假反例总数最少。
3.可以对不同的学习器比较性能。将各个学习器的ROC曲线绘制到同一坐标中,直观地鉴别优劣,靠近左上角的ROC曲所代表的学习器准确性最高。
(2)优点
1. 该方法简单、直观、通过图示可观察分析方法的准确性,并可用肉眼作出判断。ROC曲线将真正例率和假正例率以图示方法结合在一起,可准确反映某种学习器真正例率和假正例率的关系,是检测准确性的综合代表。
2. 在生物信息学上的优点:ROC曲线不固定阈值,允许中间状态的存在,利于使用者结合专业知识,权衡漏诊与误诊的影响,选择一个更加的阈值作为诊断参考值。
四、 AUC面积的由来
如果两条ROC曲线没有相交,我们可以根据哪条曲线最靠近左上角哪条曲线代表的学习器性能就最好。但是,实际任务中,情况很复杂,如果两条ROC曲线发生了交叉,则很难一般性地断言谁优谁劣。在很多实际应用中,我们往往希望把学习器性能分出个高低来。在此引入AUC面积。
在进行学习器的比较时,若一个学习器的ROC曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者;若两个学习器的ROC曲线发生交叉,则难以一般性的断言两者孰优孰劣。此时如果一定要进行比较,则比较合理的判断依据是比较 ROC曲线下的面积,即AUC(Area Under ROC Curve), 如图1图2所示。
五、 什么是AUC面积
的点按序连接而形成,参见图2,则AUC可估算为公式3。
六、 AUC面积的意义
AUC是衡量二分类模型优劣的一种评价指标,表示预测的正例排在负例前面的概率。
看到这里,是不是很疑惑,根据AUC定义和计算方法,怎么和预测的正例排在负例前面的概率扯上联系呢?如果从定义和计算方法来理解AUC的含义,比较困难,实际上AUC和Mann-WhitneyU test(曼-慧特尼U检验)有密切的联系。从Mann-Whitney U statistic的角度来解释,AUC就是从所有正样本中随机选择一个样本,从所有负样本中随机选择一个样本,然后根据你的学习器对两个随机样本进行预测,把正样本预测为正例的概率p 1 ,把负样本预测为正例的概率p 2 ,p 1 >p 2 的概率就等于AUC。 所以AUC反映的是分类器对样本的排序能力。 根据这个解释,如果我们完全随机的对样本分类,那么AUC应该接近0.5。
另外值得注意的是,AUC的计算方法同时考虑了学习器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器做出合理的评价。AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价学习器性能的一个原因。例如在癌症预测的场景中,假设没有患癌症的样本为正例,患癌症样本为负例,负例占比很少(大概0.1%),如果使用准确率评估,把所有的样本预测为正例便可以获得99.9%的准确率。但是如果使用AUC,把所有样本预测为正例,TPR为1,FPR为1。这种情况下学习器的AUC值将等于0.5,成功规避了样本不均衡带来的问题。
最后,我们在讨论一下: 在多分类问题下能不能使用ROC曲线来衡量模型性能?
我的理解:ROC曲线用在多分类中是没有意义的。只有在二分类中Positive和Negative同等重要时候,适合用ROC曲线评价。如果确实需要在多分类问题中用ROC曲线的话,可以转化为多个“一对多”的问题。即把其中一个当作正例,其余当作负例来看待,画出多个ROC曲线。
回到我们生信分析的第二步,对于AUC的计算
To determine whether the gene set is enriched at the top of the gene-ranking for each cell, AUCell uses the “Area Under the Curve” (AUC) of the recovery curve.
In order to calculate the AUC, by default only the top 5% of the genes in the ranking are used (i.e. checks whether the genes in the gene-set or signature are within the top 5%). This allows faster execution on bigger datasets, and reduce the effect of the noise at the bottom of the ranking (e.g. where many genes might be tied at 0 counts). The percentage to take into account can be modified with the argument aucMaxRank. For datasets where most cells express many genes (e.g. a filtered dataset), or these have high expression values, it might be good to increase this threshold. Check the histogram provided by AUCell_buildRankings to get an estimation on where this threshold lies within the dataset.
这里我们深入理解一下,对于一个细胞进行基因排序之后,得到下面的图:
至于基因集的选择,可以借助于hallmark,用于研究肿瘤特征分析。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)