получить размерный массив из n списков - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь получить свои прогнозы из данных x_test одного классификатора svm:

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)

i.g maduros [] list - это имя clase, а ma_predecido [] сохранит выходные данные для этого класса.

Мои занятия:

"Maduro" one-hot encode = 0
"Pinton"  one-hot encode = 1
"Verde  one-hot encode = 2

В любом случае, мой код дает мне одномерный массив, я мог бы проверить его в файле .xlsx, который я получил, используя библиотеку pandas: 1-d array

Я хочу получить что-то вроде этого: 2d array

Моя цель - попытаться создать матрицу путаницы с нуля, я хотел бы сравнить свои результаты с матрицей путаницы склеарна. На данный момент я хотел бы сохранить класс и его результат (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 Ответ

1 голос
/ 31 мая 2019

Вы можете построить свою матрицу путаницы, используя функции 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)

Out:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...