评估分类器性能的一个更好的方法是着眼于混淆矩阵。大概的想法是计算类别A的样本被分类为B类的总数。例如,要想知道分类器将值是5的图片混淆为3的总数,,你可以查看混淆矩阵的第5行,第3列。
要计算混淆矩阵,首先需要有一组预测,这样就可以使用它们与实际的目标值(即label)进行比较。您可以在测试集上进行预测,但是我们现在不动它(记住,一旦您有了一个可以发布的分类器,您希望在项目的最后阶段再使用测试集)。相反,您可以使用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-fold交叉验证,但是它不返回评估分数值,而是返回在每个测试折叠上所做的预测。这意味着你可以得到在训练集上的每一个样本上的一个干净的预测(“clean(干净)”在这里的意思是该预测是由一个在训练期间从未见过数据的模型做出来的)
现在,您已经准备好使用 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]])
混淆矩阵中的每一行表示一个实际(actual)的类别,而每个列表示一个预测(predicted)的类别。该矩阵的第一行考虑的是非-5图像(即负类[negatives class]):其中53,272个被正确归类为非-5类别(它们也被称为真负[true negatives]),而其余的1,307被错误地归类为5类别(它们也被称为假正[false (false positives])。第二行考虑的是5的图像(也成为正类[positive class]):1077个图像被错误的分类为non-5类别(也被称为假负[false negatives]),剩下的4,344被正确归类为5的类别(也被称为真正[true positives])。一个完美的分类器只会有真正[True Positive ]和真负[True Negative] ,所以它的混淆矩阵只有在主对角线上有非零值(左上至右下):
True Positive (真正, TP)被模型预测为正的正样本;
True Negative(真负 , TN)被模型预测为负的负样本 ;
False Positive (假正, FP)被模型预测为正的负样本;
False Negative(假负 , FN)被模型预测为负的正样本;
>>> confusion_matrix(y_train_5, y_train_perfect_predictions)
array([[54579, 0],
[ 0, 5421]])
混乱矩阵提供了大量的信息,但有时您可能更喜欢更简洁的度量。比较有趣的一种度量是关于正样本的预测的准确率/精度;这被称为分类器的准确率/精度【precision】(方程3-1)。
recision = TP / (TP + FP)
公式3 - 1 精度/准确率
TP是真正的数量,而FP是假正的数量。精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是对的。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP)。
一种非常简单的方法可以达到完美的准确率/精度:只做一个关于正样本的预测,并确保它是正确的(精度= 1/1 = 100%)。这将不会非常有用,因为分类器忽略了所有其他的样本,而只关注这个正样本。因此,准确率/精度通常与另一个叫召回率(Recall)的度量方法一起使用,也称为灵敏度(sensitivity)或真正率(TPR):它是指正样本被分类器正确检测的比率(公式3-2)。
recall = TP / (TP + FN)
公式3 - 2 召回
FN当然是假负的数目。召回率是针对我们原来的样本而言的,它表示的是样本中的正样本有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。
如果您对混淆矩阵感到困惑,图3-2可能会有所帮助。
图3 - 2 说明混淆矩阵