对分类器来说,一个好得多的性能评估指标是混淆矩阵。大体思路是:输出类别 A 被分类成类别 B 的次数。举个例子,为了知道分类器将 5 误分为 3 的次数,需要查看混淆矩阵的第五行第三列。
为了计算混淆矩阵,首先需要有一系列的预测值,这样才能将预测值与真实值做比较。或许想在测试集上做预测。但是我们现在先不碰它。 相 反, 应该使用 cross_val_predict() 函数
from sklearn.model_selection import cross_val_predict
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
就像 cross_val_score() , cross_val_predict() 也使用 K 折交叉验证。它不是返回一个评估分数,而是返回基于每一个测试折做出的一个预测值。这意味着,对于每一个训练集的样例,得到一个干净的预测(“干净”是说一个模型在训练过程当中没有用到测试集的数据)。
现在使用 confusion_matrix() 函数,将会得到一个混淆矩阵。传递目标类( y_train_5 )和预测类( y_train_pred )给它。
>>> from sklearn.metrics import confusion_matrix
>>> confusion_matrix(y_train_5, y_train_pred)
array([[53272, 1307],
[ 1077, 4344]])
混淆矩阵中的每一行表示一个实际的类, 而每一列表示一个预测的类。该矩阵的第一行认为“非 5”(反例)中的 53272 张被正确归类为 “非 5”(他们被称为真反例,true negatives), 而其余 1307 被错误归类为"是 5" (假正例,false positives)。第二行认为“是 5” (正例)中的 1077 被错误地归类为“非 5”(假反例,false negatives),其余 4344 正确分类为 “是 5”类(真正例,true positives)。一个完美的分类器将只有真反例和真正例,所以混淆矩阵的非零值仅在其主对角线(左上至右下)。
>>> confusion_matrix(y_train_5, y_train_perfect_predictions)
array([[54579, 0],
[ 0, 5421]])
混淆矩阵可以提供很多信息。有时候会想要更加简明的指标。一个有趣的指标是正例预测的精度,也叫做分类器的准确率(precision)。