基本概念

precision:预测为对的当中,原本为对的比例(越大越好,1为理想状态)

recall:原本为对的当中,预测为对的比例(越大越好,1为理想状态)

F-measure:F度量是对准确率和召回率做一个权衡(越大越好,1为理想状态,此时precision为1,recall为1)

accuracy:预测对的(包括原本是对预测为对,原本是错的预测为错两种情形)占整个的比例(越大越好,1为理想状态)

fp rate:原本是错的预测为对的比例(越小越好,0为理想状态)

tp rate:原本是对的预测为对的比例(越大越好,1为理想状态)

ROC曲线通常在Y轴上具有真阳性率,在X轴上具有假阳性率。这意味着图的左上角是“理想”点 - 误报率为零,真正的正率为1。这不太现实,但它确实意味着曲线下面积(AUC)通常更好。

二分类问题:ROC曲线

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

import time

start_time = time.time()

import matplotlib.pyplot as plt

from sklearn.metrics import roc_curve

from sklearn.metrics import auc

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.metrics import recall_score,accuracy_score

from sklearn.metrics import precision_score,f1_score

from keras.optimizers import Adam,SGD,sgd

from keras.models import load_model

print('读取数据')

X_train = np.load('x_train-rotate_2.npy')

Y_train = np.load('y_train-rotate_2.npy')

print(X_train.shape)

print(Y_train.shape)

print('获取测试数据和验证数据')

X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.1, random_state=666)

Y_train = np.asarray(Y_train,np.uint8)

Y_valid = np.asarray(Y_valid,np.uint8)

X_valid = np.array(X_valid, np.float32) / 255.

print('获取模型')

model = load_model('./model/InceptionV3_model.h5')

opt = Adam(lr=1e-4)

model.compile(optimizer=opt, loss='binary_crossentropy')

print("Predicting")

Y_pred = model.predict(X_valid)

Y_pred = [np.argmax(y) for y in Y_pred] # 取出y中元素最大值所对应的索引

Y_valid = [np.argmax(y) for y in Y_valid]

# micro:多分类

# weighted:不均衡数量的类来说,计算二分类metrics的平均

# macro:计算二分类metrics的均值,为每个类给出相同权重的分值。

precision = precision_score(Y_valid, Y_pred, average='weighted')

recall = recall_score(Y_valid, Y_pred, average='weighted')

f1_score = f1_score(Y_valid, Y_pred, average='weighted')

accuracy_score = accuracy_score(Y_valid, Y_pred)

print("Precision_score:",precision)

print("Recall_score:",recall)

print("F1_score:",f1_score)

print("Accuracy_score:",accuracy_score)

# 二分类 ROC曲线

# roc_curve:真正率(True Positive Rate , TPR)或灵敏度(sensitivity)

# 横坐标:假正率(False Positive Rate , FPR)

fpr, tpr, thresholds_keras = roc_curve(Y_valid, Y_pred)

auc = auc(fpr, tpr)

print("AUC : ", auc)

plt.figure()

plt.plot([0, 1], [0, 1], 'k--')

plt.plot(fpr, tpr, label='Keras (area = {:.3f})'.format(auc))

plt.xlabel('False positive rate')

plt.ylabel('True positive rate')

plt.title('ROC curve')

plt.legend(loc='best')

plt.savefig("../images/ROC/ROC_2分类.png")

plt.show()

print("--- %s seconds ---" % (time.time() - start_time))

ROC图如下所示:

多分类问题:ROC曲线

ROC曲线通常用于二分类以研究分类器的输出。为了将ROC曲线和ROC区域扩展到多类或多标签分类,有必要对输出进行二值化。⑴可以每个标签绘制一条ROC曲线。⑵也可以通过将标签指示符矩阵的每个元素视为二元预测(微平均)来绘制ROC曲线。⑶另一种用于多类别分类的评估方法是宏观平均,它对每个标签的分类给予相同的权重。

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

import time

start_time = time.time()

import matplotlib.pyplot as plt

from sklearn.metrics import roc_curve

from sklearn.metrics import auc

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.metrics import recall_score,accuracy_score

from sklearn.metrics import precision_score,f1_score

from keras.optimizers import Adam,SGD,sgd

from keras.models import load_model

from itertools import cycle

from scipy import interp

from sklearn.preprocessing import label_binarize

nb_classes = 5

print('读取数据')

X_train = np.load('x_train-resized_5.npy')

Y_train = np.load('y_train-resized_5.npy')

print(X_train.shape)

print(Y_train.shape)

print('获取测试数据和验证数据')

X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.1, random_state=666)

Y_train = np.asarray(Y_train,np.uint8)

Y_valid = np.asarray(Y_valid,np.uint8)

X_valid = np.asarray(X_valid, np.float32) / 255.

print('获取模型')

model = load_model('./model/SE-InceptionV3_model.h5')

opt = Adam(lr=1e-4)

model.compile(optimizer=opt, loss='categorical_crossentropy')

print("Predicting")

Y_pred = model.predict(X_valid)

Y_pred = [np.argmax(y) for y in Y_pred] # 取出y中元素最大值所对应的索引

Y_valid = [np.argmax(y) for y in Y_valid]

# Binarize the output

Y_valid = label_binarize(Y_valid, classes=[i for i in range(nb_classes)])

Y_pred = label_binarize(Y_pred, classes=[i for i in range(nb_classes)])

# micro:多分类

# weighted:不均衡数量的类来说,计算二分类metrics的平均

# macro:计算二分类metrics的均值,为每个类给出相同权重的分值。

precision = precision_score(Y_valid, Y_pred, average='micro')

recall = recall_score(Y_valid, Y_pred, average='micro')

f1_score = f1_score(Y_valid, Y_pred, average='micro')

accuracy_score = accuracy_score(Y_valid, Y_pred)

print("Precision_score:",precision)

print("Recall_score:",recall)

print("F1_score:",f1_score)

print("Accuracy_score:",accuracy_score)

# roc_curve:真正率(True Positive Rate , TPR)或灵敏度(sensitivity)

# 横坐标:假正率(False Positive Rate , FPR)

# Compute ROC curve and ROC area for each class

fpr = dict()

tpr = dict()

roc_auc = dict()

for i in range(nb_classes):

fpr[i], tpr[i], _ = roc_curve(Y_valid[:, i], Y_pred[:, i])

roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area

fpr["micro"], tpr["micro"], _ = roc_curve(Y_valid.ravel(), Y_pred.ravel())

roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

# Compute macro-average ROC curve and ROC area

# First aggregate all false positive rates

all_fpr = np.unique(np.concatenate([fpr[i] for i in range(nb_classes)]))

# Then interpolate all ROC curves at this points

mean_tpr = np.zeros_like(all_fpr)

for i in range(nb_classes):

mean_tpr += interp(all_fpr, fpr[i], tpr[i])

# Finally average it and compute AUC

mean_tpr /= nb_classes

fpr["macro"] = all_fpr

tpr["macro"] = mean_tpr

roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])

# Plot all ROC curves

lw = 2

plt.figure()

plt.plot(fpr["micro"], tpr["micro"],

label='micro-average ROC curve (area = {0:0.2f})'

''.format(roc_auc["micro"]),

color='deeppink', linestyle=':', linewidth=4)

plt.plot(fpr["macro"], tpr["macro"],

label='macro-average ROC curve (area = {0:0.2f})'

''.format(roc_auc["macro"]),

color='navy', linestyle=':', linewidth=4)

colors = cycle(['aqua', 'darkorange', 'cornflowerblue'])

for i, color in zip(range(nb_classes), colors):

plt.plot(fpr[i], tpr[i], color=color, lw=lw,

label='ROC curve of class {0} (area = {1:0.2f})'

''.format(i, roc_auc[i]))

plt.plot([0, 1], [0, 1], 'k--', lw=lw)

plt.xlim([0.0, 1.0])

plt.ylim([0.0, 1.05])

plt.xlabel('False Positive Rate')

plt.ylabel('True Positive Rate')

plt.title('Some extension of Receiver operating characteristic to multi-class')

plt.legend(loc="lower right")

plt.savefig("../images/ROC/ROC_5分类.png")

plt.show()

print("--- %s seconds ---" % (time.time() - start_time))

ROC图如下所示:

以上这篇python实现二分类和多分类的ROC曲线教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持python博客。

python 多分类 recall_python实现二分类和多分类的ROC曲线教程相关推荐

  1. 视频|分类模型评估:精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现

    最近我们被客户要求撰写关于分类模型的研究报告,包括一些图形和统计输出. 本文将帮助您回答以下问题: ROC曲线是什么? 曲线下的面积是多少? 二元分类的决策阈值是多少? 分类模型可接受的 AUC值是多 ...

  2. 基于逻辑回归的癌症分类预测-良/恶性乳腺癌肿瘤预测及ROC曲线绘制

    逻辑回归 逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归.由于算法的简单和高效,在实际中应用非常广泛.逻辑回归是解决二分类问题 ...

  3. python:实现二分类和多分类的ROC曲线

    基本概念 precision:预测为对的当中,原本为对的比例(越大越好,1为理想状态) recall:原本为对的当中,预测为对的比例(越大越好,1为理想状态) F-measure:F度量是对准确率和召 ...

  4. 分类模型-评估指标(2):ROC曲线、 AUC值(ROC曲线下的面积)【只能用于二分类模型的评价】【不受类别数量不平衡的影响;不受阈值取值的影响】【AUC的计算方式:统计所有正负样本对中的正序对】

    评价二值分类器的指标很多,比如precision.recall.F1 score.P-R曲线等.但这些指标或多或少只能反映模型在某一方面的性能.相比而言,ROC曲线则有很多优点,经常作为评估二值分类器 ...

  5. 多分类-- ROC曲线和AUC值

    本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明.如果对ROC和AUC二分类下的概念不是很了解 由于ROC曲线是针对二分类的情况,对于多分类问题 ...

  6. 「机器学习速成」分类,评估指标(TP、FP、TN、FN),ROC曲线和AUC

    https://www.toutiao.com/a6706449645901464078/ 2019-06-25 20:49:47 大家好,今天我们学习[机器学习速成]之 分类,评估指标(TP.FP. ...

  7. AUC值越大_「机器学习速成」分类,评估指标(TP、FP、TN、FN),ROC曲线和AUC

    大家好,今天我们学习[机器学习速成]之 分类,评估指标(TP.FP.TN.FN),ROC曲线和AUC. 本节介绍了如何使用逻辑回归来执行分类任务, 并探讨了如何评估分类模型的有效性. 我们 马上学三点 ...

  8. python画pr曲线代码_利用Python中的numpy包实现PR曲线和ROC曲线的计算

    闲来无事,边理解PR曲线和ROC曲线,边写了一下计算两个指标的代码.在 python 环境下,sklearn里有现成的函数计算ROC曲线坐标点,这里为了深入理解这两个指标,写代码的时候只用到numpy ...

  9. python绘制pr曲线图_利用Python中的numpy包实现PR曲线和ROC曲线的计算!

    闲来无事,边理解PR曲线和ROC曲线,边写了一下计算两个指标的代码.在python环境下,sklearn里有现成的函数计算ROC曲线坐标点,这里为了深入理解这两个指标,写代码的时候只用到numpy包. ...

最新文章

  1. 通过反射实现IOC功能
  2. Lucene教程具体解释
  3. jzoj_3385_黑魔法师之门
  4. 再学 GDI+[60]: TGPGraphics.SetSmoothingMode - 绘图质量
  5. 数据结构---判断一棵树是否是二叉搜索树
  6. html 并集选择器,CSS并集选择器
  7. NLP《词汇表示方法(二)词嵌入表示》
  8. 电商首焦素材的万能构图模板
  9. python调用实例做父类_Python super() 调用父类方法, 但是父类中 self 并不是父类的实例而是子类的实例?...
  10. wpf mvvm框架_[Windows] 在 Microsoft Docs 网站中挖掘 MVVM 的各种学习资源
  11. OSPF建立邻居、邻接关系 学习笔记
  12. 130242014034(2)-“电商系统某功能模块”需求分析与设计实验课小结
  13. LeetCode:每日一题(2020.4.7)
  14. golang GUI编程之walk初建
  15. 第一章 为什么我们对机器学习感兴趣?(二)
  16. ftp服务器和文件夹共享文件夹,ftp服务器和文件夹共享文件夹
  17. 二叉搜索树前序序列转中序和后序
  18. HTML消息提醒(Notification)
  19. numpy 对矩阵,数组的操作
  20. python3 ACM模式的输入输出例子教学

热门文章

  1. Stanford机器学习笔记-1.线性回归
  2. 深度学习用于图片的分类和检测总结
  3. 用opencv的traincascade.exe训练行人的HAAR、LBP和HOG特征的xml
  4. 让你彻底理解Synchronized
  5. MyBatis 源码分析 - 内置数据源
  6. 七大排序算法的个人总结(一)
  7. IDEA 代码生成插件 CodeMaker
  8. Chrome控制台使用详解 1
  9. LaTex:算法排版
  10. Hadoop MapReduce的一些相关代码Code