混淆矩阵

本案例使用混淆矩阵评估鸢尾花数据集上分类器输出质量。对角线元素表示预测标签等于真实标签的点数,而非对角线元素则是分类器未正确标记的点。混淆矩阵的对角线值越高越好,表明正确的预测越多。

这些图按类支持尺寸(class support size,即每个类中的样本量)显示了归一化后及未归一化的混淆矩阵。在类别不平衡的情况下,这种归一化可能带来有趣的结果,可以对哪个类被错误分类具有更直观的解释。

在这里,结果并不如我们预期的那样好,因为我们选择的正则化参数C并不是最好的选择。在现实生活的应用中,通常使用超参数的调参来选择此参数。

输出:

Confusion matrix, without normalization
[[13  0  0]
 [ 0 10  6]
 [ 0  0  9]]

Normalized confusion matrix
[[1.   0.   0.  ]
 [0.   0.62 0.38]
 [0.   0.   1.  ]]

输入:

print(__doc__)

import numpy as np
import matplotlib.pyplot as plt

from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_confusion_matrix

# 导入一些数据来进行操作
iris = datasets.load_iris()
X = iris.data
y = iris.target
class_names = iris.target_names

# 将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# 使用过于规范化(C太低)的模型运行分类器,以查看对结果的影响
classifier = svm.SVC(kernel='linear', C=0.01).fit(X_train, y_train)

np.set_printoptions(precision=2)

# 绘制没有归一化的混淆矩阵
titles_options = [("Confusion matrix, without normalization"None),
                  ("Normalized confusion matrix"'true')]
for title, normalize in titles_options:
    disp = plot_confusion_matrix(classifier, X_test, y_test,
                                 display_labels=class_names,
                                 cmap=plt.cm.Blues,
                                 normalize=normalize)
    disp.ax_.set_title(title)

    print(title)
    print(disp.confusion_matrix)

plt.show()

脚本的总运行时间:(0分钟0.213秒)