如何解读scikit-learn的混淆矩阵和分类报告?

我有一个情感分析任务,为此我使用了这个语料库,意见分为5个类别(very negnegneuposvery pos),从1到5。因此,我进行分类如下:

from sklearn.feature_extraction.text import TfidfVectorizerimport numpy as nptfidf_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_scoreimport pandas as pddf = pd.read_csv('/corpus.csv',                     header=0, sep=',', names=['id', 'content', 'label'])X = tfidf_vect.fit_transform(df['content'].values)y = df['label'].valuesfrom sklearn import cross_validationX_train, X_test, y_train, y_test = cross_validation.train_test_split(X,                                                    y, test_size=0.33)from sklearn.svm import SVCsvm_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       367avg / total       0.94      0.93      0.93       858Confussion 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]]

如何解读上面的混淆矩阵和分类报告?我尝试阅读了文档和这个问题。但我仍然无法理解这里特别是这些数据发生了什么?为什么这个矩阵看起来是“对角线”的?另一方面,召回率、精确率、F1分数和支持度对于这些数据意味着什么?我能对这些数据说些什么?提前感谢大家


回答:

分类报告应该很直接 – 它是对测试数据中每个元素的精确率/召回率/F-Measure的报告。在多类别问题中,整体数据的精确率/召回率和F-Measure并不是一个好主意,任何不平衡都会让你觉得达到了更好的结果。这就是这种报告的帮助之处。

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

enter image description here

现在你可以看到它遵循的模式。一个理想的分类器,具有100%的准确率,会产生一个纯对角线矩阵,所有点都会被预测在它们正确的类别中。

谈到召回率/精确率。它们是评估你的系统表现如何最常用的度量之一。现在你有71个点在第一类(称之为0类)。其中你的分类器能够正确获取54个元素。这就是你的召回率。54/71 = 0.76。现在只看表中的第一列。有一个单元格的条目是54,其余都是零。这意味着你的分类器在类别0中标记了54个点,并且这54个点实际上都在类别0中。这就是精确率。54/54 = 1。看看标记为4的列。在这个列中,元素分散在所有五行中。367个被正确标记。其余都是错误的。所以这降低了你的精确率。

F度量是精确率和召回率的调和平均数。请务必阅读这些的详细信息。https://en.wikipedia.org/wiki/Precision_and_recall

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注