我正在尝试从一个svm分类器的x_test数据中得出预测:
maduros = []
ma_predecido = []
pintones = []
pi_predecido = []
verdes = []
ve_predecido = []
print("[INFO] Realizando clasificaciones de en los ejemplos de test (20%)")
for i in range(len(x_test)):
#Predecir la clase para la imágen actual
prediccion = svm.predict([x_test[i]])
if y_test[i] == 0: #Maduro class
maduros.append(0) #save the class
ma_predecido.append(int(prediccion)) #save his output
if y_test[i] == 1: #Pintones class
pintones.append(1)
pi_predecido.append(int(prediccion))
if y_test[i] == 2: #Verdes class
verdes.append(2)
ve_predecido.append(int(prediccion))
#Concatenate the lists in an array
test_results = np.array(np.concatenate([maduros, ma_predecido, pintones, pi_predecido, verdes, ve_predecido]))
df = pd.DataFrame(test_results)
filepath = args["salida"]+str('/pruebas_test.xlsx')
df.to_excel(filepath, index=False)
例如maduros []列表是clase的名称,并且ma_predecido []将保存此类的输出。
我的课程是:
"Maduro" one-hot encode = 0
"Pinton" one-hot encode = 1
"Verde one-hot encode = 2
无论如何,我的代码给了我一个一维数组,我可以在使用pandas库获取的.xlsx文件中进行检查:
我的目标是尝试从头开始创建一个混淆矩阵,我想将我的结果与sklearn混淆矩阵pycm进行比较。目前,我想保存该类及其结果(TP / FP)。我想对其进行改进:
test_results = np.array(np.concatenate([maduros, ma_predecido, pintones, pi_predecido, verdes, ve_predecido]))
获得一个二维数组,如最后一张图片。 谢谢
这是我的困惑矩阵:
[[74 2 0]
[ 1 64 1]
[ 0 0 68]]
根据pycm:
TPR(Sensitivity) 0.97368 0.9697 1.0
TNR(Specificity) 0.99254 0.98611 0.99296
ACC(Accuracy) 0.98571 0.98095 0.99524
PPV(Precision or positive predictive value) 0.98667 0.9697 0.98551
答案 0 :(得分:1)
您可以使用numpy函数构造混淆矩阵:np.where可以找到预测标签的位置,然后知道正确的位置。看起来可能像这样:
from sklearn.metrics import confusion_matrix
import numpy
y_test = np.array([0,1,2,0,1,2,0,1,2])
y_pred = np.array([0, 0, 2, 0, 0, 2, 0, 0, 2])
# Expected output is the scikit learn confusion matrix
sk_cm = confusion_matrix(y_test, y_pred)
出:
array([[3, 0, 0],
[3, 0, 0],
[0, 0, 3]])
现在我们构造自己的混淆矩阵:
confusion_matrix = []
precision = []
succ_pred = 0
nmb = 0
TP = []
FN = []
for i in range(3):
indices = np.where(y_test == i)
new_row = []
# Rows where we predicted 0
new_row.append(len(np.where(y_pred[indices] == 0)[0]))
# Rows where we predicted 1
new_row.append(len(np.where(y_pred[indices] == 1)[0]))
# Rows where we predicted 2
new_row.append(len(np.where(y_pred[indices] == 2)[0]))
precision.append(new_row[i]/np.sum(new_row))
succ_pred += new_row[i]
TP.append(new_row[i])
FN.append(np.sum(new_row)-new_row[i])
nmb += np.sum(new_row)
confusion_matrix.append(new_row)
accuracy = succ_pred/nmb
输出:
[[3, 0, 0], [3, 0, 0], [0, 0, 3]]
最后,您可以将此数组放入df中并将其保存到excel中:
df = pd.DataFrame({'0' : confusion_matrix[0], '1' :confusion_matrix[1], '2': confusion_matrix[2]})
df.to_excel('test.xls')