三个类别:
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. ]