Python: как напечатать цикл for с несколькими аргументами для numpy.int64?

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

Я нашел этот код из Sklearn SVM - как получить список неверных прогнозов?

for idx, input, prediction, label in zip(enumerate(X_test), X_test, predicted, y_test):
    print("No.", idx[0], 'input,',input, ', has been classified as', prediction, 'and should be', label) 

Я получаю эту ошибку TypeError: объект 'numpy.int64' не является итерируемым

Мои данные состоят из текстовых данных (электронных писем) из папок, которые TFIDF преобразует в int, и есть около 250 файлов, которые были неправильно классифицированы, и я хочу перечислить их, чтобы глубже изучить неправильно классифицированные файлы.

Пожалуйста, помогите мне найти способ перечислить эти неправильные классификации.

Данные состоят из более чем 4000 электронных писем, таких как:

Email[X_test]: messageid 14149441075861143483javamailevansthyme date thu 13 dec 2001 051749 0800 pst from staylorsdecom to teblokeyenroncom subject flight mimeversion 10 contenttype textplain charsetusascii contenttransferencoding 7bit xfrom taylor sandy staylorsdecom xto teblokeyenroncom xcc xbcc xfolder teblokeymar2002lokey tebinbox xorigin lokeyt xfilename tlokey nonprivilegedpst ive made a tentative reservation on континентальный вылет в четверг 20 декабря в 17:50 остановка в кливленде без изменений и прибытие в хьюстон в 23:33 возвращение первым классом в воскресенье 30 декабря в 10:50 пересадка в кливленде и прибытие в манчестер в 17:03 как насчет того, чтобы забронировать билет, чтобы вылететь со мной Вы всегда можете отменить и вернуться, когда мне будет приятно, просто знать, что вы даже подумаете об этом, вам нужен перерыв, и я мог бы использовать компанию, я знаю, что вы любите Деб друг Тенант, и она, и вы, и то же самое для Грейси, дайте мне знать, что вы думаете, люблю Сэнди

И после преобразования с помощью TfidfVectorizer() и todense() письмо выглядит так.

X_test[пример]: [[0. 0. 0.03120722 ... 0. 0. 0. ]]

Значения представляют количество tf-idf.

тип X_test: ‹класс 'numpy.matrix'› (4519, 115674)

4519: количество писем в X_test

115674: количество функций (уникальные термины)

Электронные письма помечены как фишинговые (1) или законные (0).

#Fit motel to data
model = LogisticRegression()
model.fit(X_train, y_train)

# make predictions
expected = y_test
predicted = model.predict(X_test)
proba = model.predict_proba(X_test)

# Scores
accuracy = accuracy_score(expected, predicted)
recall = recall_score(expected, predicted, average="binary")
precision = precision_score(expected, predicted , average="binary")
f1 = f1_score(expected, predicted , average="binary")

# Confustion matrix
cm = metrics.confusion_matrix(expected, predicted)
print(cm)

Это когда я хочу перечислить неправильные классификации из X_test.

введите здесь описание изображения


person JFFO    schedule 14.04.2021    source источник
comment
просто поместите в свой цикл оператор if not Prediction == label: print(..)   -  person some_name.py    schedule 14.04.2021
comment
Спасибо за быстрый ответ @some_name Но я все еще получаю сообщение об ошибке TypeError: объект 'numpy.int64' не является итерируемым?   -  person JFFO    schedule 14.04.2021
comment
Вы можете создать полный пример с некоторыми искусственными тестовыми данными, чтобы воспроизвести ошибку?   -  person some_name.py    schedule 14.04.2021
comment
Данные перечислены следующим образом из TfidfVectorizer() и todense() [[0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] ... [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.]] Количество документов в данных поезда: 4585 Образцов на класс (поезд): [4082 503] Количество документов в тестовых данных: 4519 Образцов на класс (тест): [ 4022 497] Помечен как [легитимный, фишинговый] и включен в модель классификации.   -  person JFFO    schedule 14.04.2021
comment
да, но когда я создаю некоторые искусственные данные для запуска кода, он работает... поэтому, исходя из приведенной выше информации, я, вероятно, не могу помочь... так что, возможно, вы можете отредактировать свой вопрос и сделать пример, который мы могли бы запустить, чтобы воспроизвести ошибку . Просто настройте X_test с парой примеров и скопируйте его, чтобы он служил прогнозом.   -  person some_name.py    schedule 14.04.2021
comment
Я обновил вопрос, из-за больших текстовых файлов сложно загрузить много примеров.   -  person JFFO    schedule 14.04.2021
comment
Можете ли вы показать нам вывод типа (X_test), типа (предсказанный) и типа (y_test)   -  person some_name.py    schedule 14.04.2021
comment
тип (X_test) дает выходную матрицу numpy, а тип (прогнозируемый) дает вывод numpy.int64, а тип (y_test) дает выходной список   -  person JFFO    schedule 14.04.2021
comment
вот и все... прогнозируемый также должен быть списком или массивом numpy. Кажется, это только одно число, поэтому вы не можете перебирать его. Прежде всего убедитесь, что все эти переменные имеют одинаковую длину.   -  person some_name.py    schedule 14.04.2021
comment
Моя ошибка, это работает при использовании логистической регрессии, однако, когда я использую линейный SVM, предсказанное становится numpy.int64, вы знаете, как ответить на мой вопрос, когда классификатор является линейным SVM?   -  person JFFO    schedule 14.04.2021
comment
кажется очень странным... model.predict(X_test) всегда должен иметь ту же форму или длину, что и X_test... Вы действительно должны быть осторожны (и понимать), что происходит в этот момент в коде и, возможно, использовать некоторый assert len(prediction ) == len(X_test), чтобы убедиться, что вы не столкнетесь с проблемами позже.   -  person some_name.py    schedule 14.04.2021