计算多标签分类问题的ROC曲线、分类报告和混淆矩阵
Calculate ROC curve, classification report and confusion matrix for multilabel classification problem
我想了解如何为我的多标签分类问题制作混淆矩阵和 ROC 曲线。我正在构建一个神经网络。
这是我的 类:
mlb = MultiLabelBinarizer()
ohe = mlb.fit_transform(as_list)
# loop over each of the possible class labels and show them
for (i, label) in enumerate(mlb.classes_):
print("{}. {}".format(i + 1, label))
[INFO] class labels:
1. class1
2. class2
3. class3
4. class4
5. class5
6. class6
我的标签已转换:
ohe
array([[0, 1, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 0],
[1, 1, 1, 0, 1, 0],
[0, 1, 1, 1, 0, 1],...]]
训练数据:
array([[[[ 1.93965047e+04, 8.49532852e-01],
[ 1.93965047e+04, 8.49463479e-01],
[ 1.93965047e+04, 8.49474722e-01],
...,
型号:
model.compile(loss="binary_crossentropy", optimizer=opt,metrics=["accuracy"])
H = model.fit(trainX, trainY, batch_size=BS,
validation_data=(testX, testY),
epochs=EPOCHS, verbose=1)
我能得到百分比,但我对如何计算混淆矩阵或 ROC 曲线,或获得分类报告有点无能为力..
这是百分比:
proba = model.predict(testX)
idxs = np.argsort(proba)[::-1][:2]
for i in proba:
print ('\n')
for (label, p) in zip(mlb.classes_, i):
print("{}: {:.2f}%".format(label, p * 100))
class1: 69.41%
class2: 76.41%
class3: 58.02%
class4: 63.97%
class5: 48.91%
class6: 58.28%
class1: 69.37%
class2: 76.42%
class3: 58.01%
class4: 63.92%
class5: 48.88%
class6: 58.26%
如果有人有一些关于如何做的提示或示例,我将不胜感激!提前致谢!
从 v0.21 开始,scikit-learn 包含一个多标签混淆矩阵;将 docs 中的示例改编为 5 classes:
import numpy as np
from sklearn.metrics import multilabel_confusion_matrix
y_true = np.array([[1, 0, 1, 0, 0],
[0, 1, 0, 1, 1],
[1, 1, 1, 0, 1]])
y_pred = np.array([[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[1, 1, 1, 0, 0]])
multilabel_confusion_matrix(y_true, y_pred)
# result:
array([[[1, 0],
[0, 2]],
[[1, 0],
[0, 2]],
[[0, 1],
[1, 1]],
[[2, 0],
[0, 1]],
[[0, 1],
[2, 0]]])
通常的 classification_report
也可以正常工作:
from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred))
# result
precision recall f1-score support
0 1.00 1.00 1.00 2
1 1.00 1.00 1.00 2
2 0.50 0.50 0.50 2
3 1.00 1.00 1.00 1
4 0.00 0.00 0.00 2
micro avg 0.75 0.67 0.71 9
macro avg 0.70 0.70 0.70 9
weighted avg 0.67 0.67 0.67 9
samples avg 0.72 0.64 0.67 9
关于 ROC,您可以从文档中的 Plot ROC curves for the multilabel problem 示例中获取一些想法(虽然不太确定概念本身是否非常有用)。
混淆矩阵和class化验报告需要硬class预测(如示例所示); ROC 需要预测作为概率。
要将概率预测转换为硬 classes,您需要一个阈值。现在,通常(并且隐含地)将此阈值设为 0.5,即如果 y_pred > 0.5
则预测为 1,否则预测为 0。然而,情况并非总是如此,这取决于特定问题。一旦设置了这样的阈值,您就可以轻松地将概率预测转换为具有列表理解的硬 classes;这是一个简单的例子:
import numpy as np
y_prob = np.array([[0.9, 0.05, 0.12, 0.23, 0.78],
[0.11, 0.81, 0.51, 0.63, 0.34],
[0.68, 0.89, 0.76, 0.43, 0.27]])
thresh = 0.5
y_pred = np.array([[1 if i > thresh else 0 for i in j] for j in y_prob])
y_pred
# result:
array([[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[1, 1, 1, 0, 0]])
我想了解如何为我的多标签分类问题制作混淆矩阵和 ROC 曲线。我正在构建一个神经网络。 这是我的 类:
mlb = MultiLabelBinarizer()
ohe = mlb.fit_transform(as_list)
# loop over each of the possible class labels and show them
for (i, label) in enumerate(mlb.classes_):
print("{}. {}".format(i + 1, label))
[INFO] class labels:
1. class1
2. class2
3. class3
4. class4
5. class5
6. class6
我的标签已转换:
ohe
array([[0, 1, 0, 0, 1, 1],
[0, 1, 1, 1, 1, 0],
[1, 1, 1, 0, 1, 0],
[0, 1, 1, 1, 0, 1],...]]
训练数据:
array([[[[ 1.93965047e+04, 8.49532852e-01],
[ 1.93965047e+04, 8.49463479e-01],
[ 1.93965047e+04, 8.49474722e-01],
...,
型号:
model.compile(loss="binary_crossentropy", optimizer=opt,metrics=["accuracy"])
H = model.fit(trainX, trainY, batch_size=BS,
validation_data=(testX, testY),
epochs=EPOCHS, verbose=1)
我能得到百分比,但我对如何计算混淆矩阵或 ROC 曲线,或获得分类报告有点无能为力.. 这是百分比:
proba = model.predict(testX)
idxs = np.argsort(proba)[::-1][:2]
for i in proba:
print ('\n')
for (label, p) in zip(mlb.classes_, i):
print("{}: {:.2f}%".format(label, p * 100))
class1: 69.41%
class2: 76.41%
class3: 58.02%
class4: 63.97%
class5: 48.91%
class6: 58.28%
class1: 69.37%
class2: 76.42%
class3: 58.01%
class4: 63.92%
class5: 48.88%
class6: 58.26%
如果有人有一些关于如何做的提示或示例,我将不胜感激!提前致谢!
从 v0.21 开始,scikit-learn 包含一个多标签混淆矩阵;将 docs 中的示例改编为 5 classes:
import numpy as np
from sklearn.metrics import multilabel_confusion_matrix
y_true = np.array([[1, 0, 1, 0, 0],
[0, 1, 0, 1, 1],
[1, 1, 1, 0, 1]])
y_pred = np.array([[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[1, 1, 1, 0, 0]])
multilabel_confusion_matrix(y_true, y_pred)
# result:
array([[[1, 0],
[0, 2]],
[[1, 0],
[0, 2]],
[[0, 1],
[1, 1]],
[[2, 0],
[0, 1]],
[[0, 1],
[2, 0]]])
通常的 classification_report
也可以正常工作:
from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred))
# result
precision recall f1-score support
0 1.00 1.00 1.00 2
1 1.00 1.00 1.00 2
2 0.50 0.50 0.50 2
3 1.00 1.00 1.00 1
4 0.00 0.00 0.00 2
micro avg 0.75 0.67 0.71 9
macro avg 0.70 0.70 0.70 9
weighted avg 0.67 0.67 0.67 9
samples avg 0.72 0.64 0.67 9
关于 ROC,您可以从文档中的 Plot ROC curves for the multilabel problem 示例中获取一些想法(虽然不太确定概念本身是否非常有用)。
混淆矩阵和class化验报告需要硬class预测(如示例所示); ROC 需要预测作为概率。
要将概率预测转换为硬 classes,您需要一个阈值。现在,通常(并且隐含地)将此阈值设为 0.5,即如果 y_pred > 0.5
则预测为 1,否则预测为 0。然而,情况并非总是如此,这取决于特定问题。一旦设置了这样的阈值,您就可以轻松地将概率预测转换为具有列表理解的硬 classes;这是一个简单的例子:
import numpy as np
y_prob = np.array([[0.9, 0.05, 0.12, 0.23, 0.78],
[0.11, 0.81, 0.51, 0.63, 0.34],
[0.68, 0.89, 0.76, 0.43, 0.27]])
thresh = 0.5
y_pred = np.array([[1 if i > thresh else 0 for i in j] for j in y_prob])
y_pred
# result:
array([[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[1, 1, 1, 0, 0]])