混淆矩阵和分类报告
Confusion matrix and classification report
我用 3 classes 成功地为 classification 创建了一个简单的 1D CNN。在训练过程中,我将模型和权重保存到yaml和h5文件中。然后,在测试过程中,我成功地加载了模型和权重,并将其用于实时 class 化,返回 class 作为输出。但是,我还使用测试数据测试我的模型,我想将其视为混淆矩阵。这是我编写的代码:
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))
但我总是得到每个 class 的 100% class 化输出。然而,当我评估测试数据时,准确率只有 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
在您的分类报告中,您比较的是 ynew
和 yp
,它们基本相同但计算方式不同。您应该将 ynew
与 y_groundtruth
进行比较。
ynew
和 yp
,两者都是您分别从 predict_classes()
和 predict()
获得的模型预测。
虽然 confusion_matrix() 和 classification_report() 将输入作为 - confusion_matrix(y_true, y_pred)
其中 y_true
是目标 class 和 y_pred
模型的预测。
您应该输入目标而不是 ynew
。
我用 3 classes 成功地为 classification 创建了一个简单的 1D CNN。在训练过程中,我将模型和权重保存到yaml和h5文件中。然后,在测试过程中,我成功地加载了模型和权重,并将其用于实时 class 化,返回 class 作为输出。但是,我还使用测试数据测试我的模型,我想将其视为混淆矩阵。这是我编写的代码:
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))
但我总是得到每个 class 的 100% class 化输出。然而,当我评估测试数据时,准确率只有 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
在您的分类报告中,您比较的是 ynew
和 yp
,它们基本相同但计算方式不同。您应该将 ynew
与 y_groundtruth
进行比较。
ynew
和 yp
,两者都是您分别从 predict_classes()
和 predict()
获得的模型预测。
虽然 confusion_matrix() 和 classification_report() 将输入作为 - confusion_matrix(y_true, y_pred)
其中 y_true
是目标 class 和 y_pred
模型的预测。
您应该输入目标而不是 ynew
。