从n个列表中获取维数组

时间:2019-05-31 06:27:16

标签: python arrays python-3.x list numpy

我正在尝试从一个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文件中进行检查: 1-d array

我想得到这样的东西: 2d array

我的目标是尝试从头开始创建一个混淆矩阵,我想将我的结果与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

Cmatrix image

1 个答案:

答案 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')