CNN: Создайте матрицу путаницы для всего тестового набора данных

#python #conv-neural-network #confusion-matrix

Вопрос:

Я использую следующий код для прогнозирования вывода моей модели в наборе данных.

 correct = 0
total_predictions = []
actual_labels = []
with torch.no_grad():
    for images, labels in testloader:
        images, labels = images.to(device), labels.to(device)
        
        outputs = model(images)
  
        _, predicted = torch.max(outputs.data, 1)
        actual_labels.append(labels)
        total_predictions.append(final_pred)
        final_pred = torch.FloatTensor(final_pred).to(device)
        correct  = (predicted == labels).sum().item()
 

Теперь, чтобы создать матрицу путаницы всего набора данных, я попытался сохранить свои прогнозы и тестовые метки в списке и передать его confusion_matrix в sklearn, но это не удается со следующей ошибкой:

 ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead.
 

Может ли кто-нибудь помочь мне в вычислении матрицы путаницы для всего моего набора данных?

Следующий код вычисляет его только для последней партии:

  cf = confusion_matrix(predicted.cpu(), labels.cpu())
 

Обновление-1

Используя шаблон @CutePoison, я получаю это.

Похоже, вы используете устаревшее представление данных с несколькими метками. Последовательность последовательностей больше не поддерживается; вместо этого используйте двоичный массив или разреженную матрицу — преобразователь MultiLabelBinarizer может конвертировать в этот формат.

 labels={}
labels['healthy_wheat'] = 0
labels['leaf_rust'] = 1
labels['stem_rust'] = 2

def conf_mat(y_true,y_pred,columns,**kwargs):
    conf_mat = confusion_matrix(y_true,y_pred,labels = columns,**kwargs)
    df = pd.DataFrame(conf_mat,columns = columns, index = columns)
    df.columns.name="pred"
    df.index.name="true"
    return df

conf_mat(actual_labels,total_predictions ,columns =labels,normalize="true")
 

Комментарии:

1. Что терпит неудачу? В чем заключается сообщение об ошибке?

2. @CutePoison Если я использую «total_predictions» и «actual_labels», которые являются списками, я получаю следующую ошибку: Ошибка значения: Похоже, вы используете устаревшее представление данных с несколькими метками. Последовательность последовательностей больше не поддерживается; вместо этого используйте двоичный массив или разреженную матрицу.

Ответ №1:

Я использую этот фрагмент для создания матриц путаницы, которые работают для нескольких классов

 from sklearn.metrics import confusion_matrix

def conf_mat(y_true,y_pred,columns,**kwargs):
    """
    Creates a "pretty" confusion matrix
    """

    conf_mat = confusion_matrix(y_true,y_pred,labels = columns,**kwargs)
    df = pd.DataFrame(conf_mat,columns = columns, index = columns)
    df.columns.name="pred"
    df.index.name="true"
    return df



conf_mat(actual_labels,final_pred ,columns =np.unique(actual_labels),normalize="true")
 

Обратите внимание, что вы можете захотеть изменить их в columns зависимости от того, как создаются ваши метки.

Кроме того, вы final_pred должны содержать свой прогноз класса, а не оценку, т. е. final_pred = [0,1,2,0...] и не final_pred= [[0.8,0.1,0.1], [0.1,0.7,0.2],[0.05,0.05,0.9],[0.75,0.2,0.05],...]

Комментарии:

1. Пожалуйста, ознакомьтесь с моими обновлениями. Я предоставил параметры, как вы объяснили, но все равно получаю ту же ошибку.

2. Вы убедились, что ваш final_pred ответ соответствует моему ответу? Согласно ошибке, похоже, что они находятся в неправильном формате