混淆矩阵和分类报告

Posted

技术标签:

【中文标题】混淆矩阵和分类报告【英文标题】:Confusion matrix and classification report 【发布时间】:2020-08-21 04:59:36 【问题描述】:

我成功创建了一个简单的 1D CNN,用于分类 3 个类别。在训练过程中,我将模型和权重保存到 yaml 和 h5 文件中。然后,在测试过程中,我成功加载了模型和权重,并将其用于实时分类,将类作为输出返回。但是,我也用测试数据测试我的模型,我想把它看作一个混淆矩阵。这是我制作的代码:

from keras.models import model_from_yaml
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, confusion_matrix
import os
from numpy import array
import numpy as np
import pandas as pd

# load YAML and create model
yaml_file = open('a32.yaml', 'r')
loaded_model_yaml = yaml_file.read()
yaml_file.close()
loaded_model = model_from_yaml(loaded_model_yaml)

# load weights into new model
loaded_model.load_weights("a32.h5")
print("Loaded model from disk")

loaded_model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer='adam',
    metrics=(['accuracy'])
)

#Load data
test_data=pd.read_csv('data/ccpp/t2datn.csv',header=None)
test=test_data.iloc[:,0:2]

#Normalized test set
scaler=StandardScaler().fit(test)
x_test=scaler.transform(test)
y=np.expand_dims(x_test,axis=2)

#Make a prediction
predictions = loaded_model.predict(y)
ynew = loaded_model.predict_classes(y)

yp = np.argmax(predictions, axis=1)
#print(yp)
print("Confusion Matrix")
print(confusion_matrix(ynew, yp))
print("Classification Report")
target_names = ['Too High', 'Normal', 'Too Low']
print(classification_report(ynew,yp, target_names=target_names))

但我总是将输出 100% 分类为每个类别。然而,当我评估测试数据时,准确率只有 80% 左右。你能告诉我混淆矩阵的代码的哪一部分是错误的吗?

输出:

Confusion Matrix
[[1967    0    0]
 [   0 3252    0]
 [   0    0 1159]]
Classification Report
              precision    recall  f1-score   support

    Too High       1.00      1.00      1.00      1967
      Normal       1.00      1.00      1.00      3252
     Too Low       1.00      1.00      1.00      1159

    accuracy                           1.00      6378
   macro avg       1.00      1.00      1.00      6378
weighted avg       1.00      1.00      1.00      6378

【问题讨论】:

【参考方案1】:

ynewyp,两者都是您分别从 predict_classes()predict() 获得的模型预测。

虽然confusion_matrix() 和classification_report() 将输入作为-confusion_matrix(y_true, y_pred),其中y_true 是目标类,y_pred 在模型的预测中。

你应该输入你的目标而不是ynew

【讨论】:

感谢您的回复!!我解决了这个问题,我把我的测试数据的结果类作为实际数据的输入是错误的。【参考方案2】:

在您的分类报告中,您正在比较ynewyp,它们基本相同,但计算方式不同。您应该将ynewy_groundtruth 进行比较。

【讨论】:

感谢您的回复!!我解决了这个问题,我把我的测试数据的结果类作为实际数据的输入是错误的。

以上是关于混淆矩阵和分类报告的主要内容,如果未能解决你的问题,请参考以下文章

计算多标签分类问题的ROC曲线、分类报告和混淆矩阵

StratifiedKFold的混淆矩阵和分类报告

python 混淆矩阵和分类报告

python 分类报告,混淆矩阵

为图像分类模型绘制混淆矩阵

Weka中决策树和混淆矩阵中正确/错误分类实例之间的差异