【笔记】ROC曲线
2024-08-25 22:03:22
ROC曲线
前文讲了PR曲线
这里说ROC曲线,其描述的是TPR和FPR之间的关系
TPR是什么呢,TPR就是召回率
FPR是什么呢,FPR就是和TPR对应的,即真实值为0的一行中的预测为1的部分比例
和精准率和召回率一样,TPR和FPR之间也有着内在的联系,TPR越高,FPR越高,反之一样,ROC曲线就是刻画这样的关系的曲线
快速的实现一下TPR和FPR的函数,在python chame中的metrics中写入下列代码,依次是实现TN,FP,FN,TP,混淆矩阵,精准率,召回率,F1 score,TPR,FPR,前面部分都在前面博客有相应的原理的代码,关于TPR和FPR的,也只是将公示带入使用
代码如下
def TN(y_true, y_predict):
assert len(y_true) == len(y_predict)
return np.sum((y_true == 0) & (y_predict == 0))
def FP(y_true, y_predict):
assert len(y_true) == len(y_predict)
return np.sum((y_true == 0) & (y_predict == 1))
def FN(y_true, y_predict):
assert len(y_true) == len(y_predict)
return np.sum((y_true == 1) & (y_predict == 0))
def TP(y_true, y_predict):
assert len(y_true) == len(y_predict)
return np.sum((y_true == 1) & (y_predict == 1))
def confusion_matrix(y_true, y_predict):
return np.array([
[TN(y_true, y_predict), FP(y_true, y_predict)],
[FN(y_true, y_predict), TP(y_true, y_predict)]
])
def precision_score(y_true, y_predict):
assert len(y_true) == len(y_predict)
tp = TP(y_true, y_predict)
fp = FP(y_true, y_predict)
try:
return tp / (tp + fp)
except:
return 0.0
def recall_score(y_true, y_predict):
assert len(y_true) == len(y_predict)
tp = TP(y_true, y_predict)
fn = FN(y_true, y_predict)
try:
return tp / (tp + fn)
except:
return 0.0
def f1_score(y_true, y_predict):
precision = precision_score(y_true, y_predict)
recall = recall_score(y_true, y_predict)
try:
return 2 * precision * recall / (precision + recall)
except:
return 0.0
def TPR(y_true, y_predict):
tp = TP(y_true, y_predict)
fn = FN(y_true, y_predict)
try:
return tp / (tp + fn)
except:
return 0.
def FPR(y_true, y_predict):
fp = FP(y_true, y_predict)
tn = TN(y_true, y_predict)
try:
return fp / (fp + tn)
except:
return 0.
具体使用
(在notebook中)
使用手写数据集,进行先前的操作布置好需要的变量以及数据分割,不再赘述
使用封装好的FPR和TPR,和前面绘制PR曲线的思想一致,然后绘制图像
from metrics import FPR,TPR
fprs = []
tprs = []
thresholds = np.arange(np.min(decision_scores),np.max(decision_scores),0.1)
for threshold in thresholds:
y_predict = np.array(decision_scores >= threshold,dtype='int')
fprs.append(FPR(y_test,y_predict))
tprs.append(TPR(y_test,y_predict))
plt.plot(fprs,tprs)
图像如下
使用sklearn中的ROC曲线,调用方式和先前PR曲线的使用很像,绘制图像
from sklearn.metrics import roc_curve
fprs, tprs, thresholds = roc_curve(y_test,decision_scores)
plt.plot(fprs,tprs)
图像如下(ROC曲线下的面积可以作为一个指标)
求解的话一样可以使用sklearn中的roc_auc_score,即可求出面积值的作为的指标
from sklearn.metrics import roc_auc_score
roc_auc_score(y_test,decision_scores)
结果如下
可以看出来,ROC的指标对偏斜的数据不算敏感,不想精准率和召回率那样敏感,所以针对极度偏斜的数据使用精准率和召回率是不错的,ROC曲线的应用场景是可以确定更好的模型,即面积更大模型
最新文章
- C#注册表的读,写,删除,查找
- The 2015 China Collegiate Programming Contest K Game Rooms hdu 5550
- LeetCode Combination Sum II (DFS)
- iphone dev 入门实例2:Pass Data Between View Controllers using segue
- Toast 用于一个页面有多个提示
- iOS-iPad开发之SplitViewController简单介绍
- Nexus 刷机
- TED Talk-教育如何扼杀创造力
- String、StringBuffer与StringBuilder差分
- STL源代码剖析 容器 stl_hashtable.h
- 安装gitlab8.0在reconfigure报错
- web面试题
- Django学习之django自带的contentType表 GenericRelation GenericForeignKey
- JAVA_maven 配置
- Android 新架构组件 -- WorkManager
- Python-CSS进阶
- mac 苹果鼠标 magic mouse2 当触摸代替点击当触摸板教程
- MapReduce教程(一)基于MapReduce框架开发<;转>;
- Entity Framework 6.0 Code First(转)
- 20155210潘滢昊 2016-2017-2 《Java程序设计》第4周学习总结