roc曲线的正确解读

Python026

roc曲线的正确解读,第1张

关于roc曲线的正确解读如下:

ROC曲线,也称受试者工作特征曲线,感受性曲线;ROC曲线最初是运用在军事上,当前在医学领域使用非常广泛,用于研究X对于Y的预测准确率情况。

案例:雷达兵的任务在于监视雷达,观察是否有敌机来袭,当然如果有飞鸟来袭,也会出现信号,如果过于谨慎有信号就报告,

会增加误报风险,但如果过于大胆,凡是信号都认为是飞鸟这会出现很大风险。ROC曲线正是解决此类问题,即用于尽最大可能研究敌机信号和飞鸟信号之间的区别,以增加预报准确性。

核心在于研究漏报和误报之间的概率分布情况,横坐标表示飞鸟信息不报告的概率,纵坐标表示敌机信息报告的概率即正确报告的概率,将对应的点连成曲线,这条曲线就是ROC曲线。

名词解释ROC曲线最初运用于军事上,当前ROC曲线在医学领域有着广泛的使用。医学上更多称为“阳性”(比如敌机)或“阴性”(比如飞鸟),对应着X轴即1-特异性也称为假阳性率(误报率),该值越小越好;Y轴敏感度也称为真阳性率(敏感度),该值越大越好。

操作与分析数据背景本案例研究产妇年龄,产妇体重这两项对于“低出生体重儿”的预测准确率,针对“低出生体重儿”列,数字1表示低出生体重儿,0表示不是低出生体重。数字1表示“阳性”,数字0表示“阴性”,因此切割点设置为1。

从上表可知,针对产妇年龄, 产妇体重共2项构造ROC曲线,用于判断其对于“低出生体重儿”的诊断预测价值,首先进行状态变量的设置。

以数字1作为切割点, 1为阳性,0作为阴性。最终从上表可可以看出:阳性(此处即为“低出生体重儿”)比例为68.78%,阴性(此处即为“非低出生体重儿”)比例为31.22%。

ROC 曲线可用于疾病识别能力的判断,首先需要确定金标准(分割点),并且主动设置;第一步:状态变量等于分割点时为阳性,其它为阴性;第二步:可对阳性和阴性的基本频数分布情况进行简单描述。

R语言利用caret包比较ROC曲线

我们之前探讨了多种算法,每种算法都有优缺点,因而当我们针对具体问题去判断选择那种算法时,必须对不同的预测模型进行重做评估。为了简化这个过程,我们使用caret包来生成并比较不同的模型与性能。

操作

加载对应的包与将训练控制算法设置为10折交叉验证,重复次数为3:

library(ROCR)

library(e1071)

library("pROC")

library(caret)

library("pROC")

control = trainControl(method = "repaetedcv",

number = 10,

repeats =3,

classProbs = TRUE,

summaryFunction = twoClassSummary)

使用glm在训练数据集上训练一个分类器

glm.model = train(churn ~ .,

data= trainset,

method = "glm",

metric = "ROC",

trControl = control)

使用svm在训练数据集上训练一个分类器

svm.model = train(churn ~ .,

data= trainset,

method = "svmRadial",

metric = "ROC",

trControl = control)

使用rpart函数查看rpart在训练数据集上的运行情况

rpart.model = train(churn ~ .,

data = trainset,

method = "svmRadial",

metric = "ROC",

trControl = control)

使用不同的已经训练好的数据分类预测:

glm.probs = predict(glm.model,testset[,!names(testset) %in% c("churn")],type = "prob")

svm.probs = predict(svm.model,testset[,!names(testset) %in% c("churn")],type = "prob")

rpart.probs = predict(rpart.model,testset[,!names(testset) %in% c("churn")],type = "prob")

生成每个模型的ROC曲线,将它们绘制在一个图中:

glm.ROC = roc(response = testset[,c("churn")],

predictor = glm.probs$yes,

levels = levels(testset[,c("churn")]))

plot(glm.ROC,type = "S",col = "red")

svm.ROC = roc(response = testset[,c("churn")],

predictor = svm.probs$yes,

levels = levels(testset[,c("churn")]))

plot(svm.ROC,add = TRUE,col = "green")

rpart.ROC = roc(response = testset[,c("churn")],

predictor = rpart.probs$yes,

levels = levels(testset[,c("churn")]))

plot(rpart.ROC,add = TRUE,col = "blue")

三种分类器的ROC曲线

说明将不同的分类模型的ROC曲线绘制在同一个图中进行比较,设置训练过程的控制参数为重复三次的10折交叉验证,模型性能的评估参数为twoClassSummary,然后在使用glm,svm,rpart,三种不同的方法建立分类模型。

从图中可以看出,svm对训练集的预测结果(未调优)是三种分类算法里最好的。