混淆矩阵Python

时间:2020-06-11 14:48:00

标签: python classification confusion-matrix

我一直在尝试学习python中的逻辑回归。我想要一种通过混淆矩阵评估模型的方法。由于我是python的新手,所以我不知道该怎么做。谷歌搜索显示了如何创建一个,但是我得到的结果只是创建矩阵。我想要更多的统计推断。在R中,“插入符”包具有一个称为confusionMatrix的函数,该函数提供了许多有用的信息。 例如: 代码:

library(caret)
x <- c(1,0,1,1,0,1,1,0,0,1)
y <- c(0,1,1,1,0,1,0,0,0,0)
x <- as.factor(x)
y <- as.factor(y)
confusionMatrix(x,y)

输出:

Confusion Matrix and Statistics

          Reference
Prediction 0 1
         0 3 1
         1 3 3

               Accuracy : 0.6             
                 95% CI : (0.2624, 0.8784)
    No Information Rate : 0.6             
    P-Value [Acc > NIR] : 0.6331          

                  Kappa : 0.2308          

 Mcnemar's Test P-Value : 0.6171          

            Sensitivity : 0.500           
            Specificity : 0.750           
         Pos Pred Value : 0.750           
         Neg Pred Value : 0.500           
             Prevalence : 0.600           
         Detection Rate : 0.300           
   Detection Prevalence : 0.400           
      Balanced Accuracy : 0.625           

       'Positive' Class : 0 

有没有办法在python中创建类似的输出?另外,我需要一种绘制ROC曲线的方法。 请帮助我,我是python的新手。

1 个答案:

答案 0 :(得分:1)

1。我使用这段代码来绘制scikit-learn;

from sklearn.metrics import confusion_matrix
from matplotlib import pyplot as plt
import matplotlib.ticker as ticker

# make predictions replace clf with your trained classifier
y_pred = clf.predict(X_test)

# create the confusion matrix
conf_mat = confusion_matrix(y_true=y_test, y_pred=y_pred)

# create the axis to plot onto 
fig = plt.figure()
ax = fig.add_subplot(111)

# plot the matrix
cax = ax.matshow(conf_mat, cmap=plt.cm.Blues)
fig.colorbar(cax)

# labels 
plt.xlabel('Predicted')
plt.ylabel('Expected')

plt.show()

2。对于ROC曲线,您需要具有决策功能的分类器。 From the documentation;

# caculate ROC for all class 

y_score = classifier.fit(X_train, y_train).decision_function(X_test)

# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

注意:

  • fpr:包含误报率

  • tpr:包含真实的阳性率

比绘制每个班级的发现;

# plot of a ROC curve for a specific class

plt.figure()
lw = 2
plt.plot(fpr[2], tpr[2], color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

3。分类报告;

from sklearn.metrics import classification_report

print(classification_report(y_test_pred, y_test))

这是10个班级的示例报告;

                precision    recall  f1-score   support

           0       0.42      0.64      0.51     76061
           1       0.00      0.34      0.01       450
           2       0.40      0.65      0.50     15627
           3       0.24      0.50      0.32     69567
           4       0.12      0.63      0.21      4839
           5       0.04      0.48      0.07      2648
           6       0.26      0.49      0.34     44727
           7       0.57      0.55      0.56    189774
           8       0.44      0.66      0.53     66019
           9       0.14      0.64      0.23       810
          10       0.47      0.61      0.53     85557

    accuracy                           0.44   2367204
   macro avg       0.31      0.54      0.35   2367204
weighted avg       0.57      0.44      0.47   2367204

注意:

  • precision =准确性

  • recall =敏感度

  • f1_score =精度和查全率的谐波平均值

  • support =分类失衡或分类的相关条目