Machine learning 如何解读scikit';s学习混淆矩阵和分类报告?

Machine learning 如何解读scikit';s学习混淆矩阵和分类报告?,machine-learning,nlp,scikit-learn,svm,confusion-matrix,Machine Learning,Nlp,Scikit Learn,Svm,Confusion Matrix,我有一个情绪分析任务,对于这个Im,意见有5个等级(very neg,neg,neu,pos,very pos),从1到5。因此,我将其分类如下: from sklearn.feature_extraction.text import TfidfVectorizer import numpy as np tfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True, sublinear_

我有一个情绪分析任务,对于这个Im,意见有5个等级(
very neg
neg
neu
pos
very 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)
然后,利用这些指标,我获得了以下混淆矩阵和分类报告,如下所示:

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]]

我如何解释上述混淆矩阵和分类报告。我试着读了这本书。但仍然可以解释这里发生了什么,特别是用这些数据?。Wny这个矩阵是“对角的”?。另一方面,什么是召回率、精确性、分数和对这些数据的支持?。关于这些数据我能说些什么?。提前感谢各位

分类报告必须简单明了-测试数据中每个元素的p/R/F测量报告。在多类问题中,读取整个数据的精度/召回率和F测量值不是一个好主意。任何不平衡都会让您觉得您已经获得了更好的结果。这就是这些报告的作用所在

关于混淆矩阵,它是关于标签的详细描述。因此,在第一个类中有71个点(标签0)。其中,您的模型成功识别了标签0中正确的54个,但17个标记为标签4。同样,请看第二排。一班有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度量是精度和召回率的调和平均值。
请务必阅读有关这些的详细信息

以下是scikit learn的sklearn.metrics.precision\u recall\u fscore\u支持方法的文档:


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

混淆矩阵告诉我们预测值在所有实际结果中的分布。准确度、回忆(敏感性)、精确度、特异性和其他类似指标是混淆矩阵的子集。 F1成绩是精确性和召回率的和谐手段。 分类报告中的支持列告诉我们测试数据中每个类的实际计数。 好吧,其余部分在上面解释得很好。
谢谢。

所以,当我对矩阵的值求和时,我得到了857,因为我像这样分割数据:
X\u-train,X\u-test,y\u-train,y\u-test=cross\u-validation.train\u-test\u-split(X,y,test\u-size=0.33)
(33%用于训练,有2599个意见实例,我认为2599的33%是857). 这就是在混淆矩阵?中反映2599个实例的地方?。但是,正如您所看到的,对于这个任务,我没有“平衡”数据。当我平衡数据结果时,你认为这是为什么?是的。每一个数据元素都是一个特征向量,这是一个完美的解释。谢谢你能解释一下为什么使用调和平均数,为什么不使用算术、几何等平均数?