三个类别:

Sample True Predict
1 [0 0 1] [0.1 0.2 0.7]
2 [0 1 0] [0.1 0.6 0.3]
3 [1 0 0] [0.5 0.2 0.3]
4 [0 0 1] [0.1 0.1 0.8]
5 [1 0 0] [0.4 0.2 0.4]
6 [0 1 0] [0.6 0.3 0.1]
7 [0 1 0] [0.4 0.2 0.4]
8 [0 1 0] [0.4 0.1 0.5]
9 [0 0 1] [0.1 0.1 0.8]
10 [0 1 0] [0.1 0.8 0.1]

ROC曲线一般是针对二分类问题的,那对于多分类问题ROC曲线该怎么绘制?

也是One vs. Rest原则,将其中一类看做正例,其它看做负例。比如我们有三个类别,那我们就可以绘制3条ROC曲线。

以第一个类别为例,将类别一看做正例,其它看做负例,得到下面的表:

Sample True Score
1 n 0.1
2 n 0.1
3 p 0.5
4 n 0.1
5 p 0.4
6 n 0.6
7 n 0.4
8 n 0.4
9 n 0.1
10 n 0.1

按Score从小到大排序,得到:

Sample True Score
6 n 0.6
3 p 0.5
5 p 0.4
7 n 0.4
8 n 0.4
1 n 0.1
2 n 0.1
4 n 0.1
9 n 0.1
10 n 0.1

得到TPR和FPR:

Sample True Score TPR FPR
6 n 0.6 0/2 0/8
3 p 0.5 1/2 1/8
5 p 0.4 2/2 3/8
7 n 0.4
8 n 0.4
1 n 0.1 2/2 8/8
2 n 0.1
4 n 0.1
9 n 0.1
10 n 0.1

以FPR为横坐标,TPR为纵坐标,就可以绘制ROC曲线。

我们用Scikit-Learn进行FPR和TPR的计算,并用Matplotlib绘制ROC曲线如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics

y_true = np.array([[0, 0, 1],
                   [0, 1, 0],
                   [1, 0, 0],
                   [0, 0, 1],
                   [1, 0, 0],
                   [0, 1, 0],
                   [0, 1, 0],
                   [0, 1, 0],
                   [0, 0, 1],
                   [0, 1, 0]])

y_predict = np.array([[0.1, 0.2, 0.7],
                      [0.1, 0.6, 0.3],
                      [0.5, 0.2, 0.3],
                      [0.1, 0.1, 0.8],
                      [0.4, 0.2, 0.4],
                      [0.6, 0.3, 0.1],
                      [0.4, 0.2, 0.4],
                      [0.4, 0.1, 0.5],
                      [0.1, 0.1, 0.8],
                      [0.1, 0.8, 0.1]])

fpr, tpr, _ = metrics.roc_curve(y_true[:, 0], y_predict[:, 0])

print(fpr)
print(tpr)

plt.plot(fpr, tpr, marker='x', clip_on=False, )
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.show()
Out:
[0.  0.125 0.125 0.375 1. ]
[0.  0.    0.5   1.    1. ]

这里写图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐