【问题标题】:How to interpret scikit's learn confusion matrix and classification report?如何解读 scikit 的学习混淆矩阵和分类报告?
【发布时间】:2015-08-25 02:55:54
【问题描述】:

我有一个情绪分析任务,对于这个我使用这个corpus,意见有 5 个类别(very negnegneuposvery pos),从 1 到 5。所以我做如下分类:

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
tfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True,
                            sublinear_tf=False, ngram_range=(2,2))
from sklearn.cross_validation import train_test_split, cross_val_score

import pandas as pd

df = pd.read_csv('/corpus.csv',
                     header=0, sep=',', names=['id', 'content', 'label'])

X = tfidf_vect.fit_transform(df['content'].values)
y = df['label'].values


from sklearn import cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,
                                                    y, test_size=0.33)


from sklearn.svm import SVC
svm_1 = SVC(kernel='linear')
svm_1.fit(X, y)
svm_1_prediction = svm_1.predict(X_test)

然后用这些指标我得到了如下的混淆矩阵和分类报告,如下:

print '\nClasification report:\n', classification_report(y_test, svm_1_prediction)
print '\nConfussion matrix:\n',confusion_matrix(y_test, svm_1_prediction)

那么,结果如下:

Clasification report:
             precision    recall  f1-score   support

          1       1.00      0.76      0.86        71
          2       1.00      0.84      0.91        43
          3       1.00      0.74      0.85        89
          4       0.98      0.95      0.96       288
          5       0.87      1.00      0.93       367

avg / total       0.94      0.93      0.93       858


Confussion matrix:
[[ 54   0   0   0  17]
 [  0  36   0   1   6]
 [  0   0  66   5  18]
 [  0   0   0 273  15]
 [  0   0   0   0 367]]

我该如何解释上述混淆矩阵和分类报告。我试着阅读documentation 和这个question。但是仍然可以解释这里发生的事情,特别是这些数据? Wny 这个矩阵在某种程度上是“对角线”的吗?另一方面,召回率、精度、f1score 和对这些数据的支持是什么意思?我能对这些数据说些什么?先谢谢各位了

【问题讨论】:

    标签: machine-learning nlp scikit-learn svm confusion-matrix


    【解决方案1】:

    分类报告必须简单明了——测试数据中每个元素的 P/R/F-Measure 报告。在多类问题中,在整个数据上读取 Precision/Recall 和 F-Measure 并不是一个好主意,任何不平衡都会让你觉得你已经达到了更好的结果。这就是此类报告的帮助所在。

    来到混淆矩阵,它非常详细地表示您的标签正在发生的事情。所以第一类有 71 个点(标签 0)。其中,您的模型成功识别了标签 0 中的 54 个,但有 17 个被标记为标签 4。同样看第二行。第 1 课有 43 分,但其中 36 分是正确的。您的分类器预测第 3 类中的 1 和第 4 类中的 6。

    现在您可以看到以下模式。具有 100% 准确率的理想分类器将产生一个纯对角矩阵,该矩阵将在其正确类别中预测所有点。

    进入召回/精确。它们是评估系统运行情况的一些最常用的衡量标准。现在你在头等舱有 71 分(称之为 0 级)。其中,您的分类器能够正确获得 54 个元素。那是你的回忆。 54/71 = 0.76。现在只看表中的第一列。有一个单元格有条目 54,其余的都是零。这意味着您的分类器在 0 类中标记了 54 个点,而所有 54 个点实际上都在 0 类中。这就是精度。 54/54 = 1。查看标记为 4 的列。在这一列中,元素分散在所有五行中。其中 367 个被正确标记。其余都是不正确的。这样会降低您的精度。

    F Measure 是 Precision 和 Recall 的调和平均值。 请务必阅读有关这些内容的详细信息。 https://en.wikipedia.org/wiki/Precision_and_recall

    【讨论】:

    • 所以,当我对矩阵的值求和时,我得到 857,因为我这样拆分数据:X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.33)(33% 用于训练,有 2599 个意见实例,我有 33 个2599 的 % 是 857)。这就是混淆矩阵中反映 2599 个实例的地方?但是,正如您在此任务中看到的那样,我没有“平衡”数据。当我平衡数据时结果好得多,你认为为什么会发生这种情况?
    • 是的。每个数据元素 - 以特征向量的形式呈现。
    • 这是一个完美的解释。谢谢。你能给出一些为什么使用调和平均值,为什么不使用算术、几何等平均值?
    【解决方案2】:

    这里是 scikit-learn 的 sklearn.metrics.precision_recall_fscore_support 方法的文档:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html#sklearn.metrics.precision_recall_fscore_support

    这似乎表明支持是真实响应(测试集中的响应)中每个特定类的出现次数。您可以通过对混淆矩阵的行求和来计算它。

    【讨论】:

      【解决方案3】:

      Confusion Matrix 告诉我们预测值在所有实际结果中的分布情况。Accuracy_scores、Recall(敏感性)、Precision、Specificity 和其他类似指标是 Confusion Matrix 的子集。 F1 分数是准确率和召回率的调和平均值。 Classification_report 中的支持列告诉我们测试数据中每个类的实际计数。 好吧,休息上面解释得很漂亮。 谢谢。

      【讨论】:

        猜你喜欢
        • 2013-08-25
        • 2019-01-22
        • 2020-08-21
        • 2022-10-20
        • 2019-07-26
        • 2018-10-23
        • 2019-05-26
        • 2020-07-25
        • 2020-04-11
        相关资源
        最近更新 更多