#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
ответ соответствует моему ответу? Согласно ошибке, похоже, что они находятся в неправильном формате