Результат не соответствует ожиданиям в прогнозе

#python #machine-learning #prediction #calibration

Вопрос:

У меня есть обучающие и тестовые наборы данных, подобные этому:

 train: 2000 files
hit.txt
nohit.txt
hit.txt

Test: 1500 
hit.txt
nohit.txt
hit.txt
 

Я обучил модель и получил точность 74 процента; вот код ниже:

Но когда я делаю свой прогноз по набору тестовых данных, результаты, которые я получаю, представляют собой массив, который мне не нужен.

 test_dir = 'test/'
dictionary = make_dic(test_dir)

features_, labels_ = make_dataset(dictionary)

calibrated_pred_final = calibrated_clf_pipe.predict(features_)

calibrated_pred_final
array([1, 1, 1, ..., 1, 1, 0])

test_pred_final = calibrated_clf_pipe.predict_proba(features_)
import numpy as np
batch_y = np.array(test_pred_final).flatten()

f = open('scores.txt', 'w')
for i in range(len(batch_y)):
    f.write(str(batch_y))    
 

score.txt файл выглядит так,

 [0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306][0.38636364 0.61363636 0.05147059 ... 0.61363636 0.86734694 0.13265306] this goes forever.
 

То, что я ожидаю, — это оценка за тестовое письмо, как показано ниже.

  0.38636364     
 0.61363636 
 0.05147059
    ...
    ...
 

Я не уверен, что происходит не так. Почему я получаю этот результат в массиве, который повторяется 1500 раз? Я предполагаю, что этот массив оценок представляет оценку за письмо, но как мне удалить весь список и получить только один балл за письмо, как мои ожидаемые результаты?

Ответ №1:

Прогнозы соответствуют ожиданиям. Проблема в том, как вы пишете score.txt . Вы пропустили индексирование batch_y , поэтому он добавляет весь массив для каждого элемента в массиве. Вот обновленный код:

 test_dir = 'test/'
dictionary = make_dic(test_dir)

features_, labels_ = make_dataset(dictionary)

calibrated_pred_final = calibrated_clf_pipe.predict(features_)

calibrated_pred_final
array([1, 1, 1, ..., 1, 1, 0])

# line changed below.
test_pred_final = calibrated_clf_pipe.predict_proba(features_)

import numpy as np
batch_y = np.array(test_pred_final).flatten()

f = open('scores.txt', 'w')
for i in range(len(batch_y)):
    f.write(str(batch_y[i])   'n') # You missed indexing into batch_y here
 

Вы можете продолжать использовать predict_proba , если вам нужны вероятности. Если вам нужны прогнозы 0 1, используйте predict .

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

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

2. с вашим кодом индексирования мой вывод по-прежнему выглядит так [0.42857143 0.94117647 0.0625 … 0.84210526 0.71875 0.62 ][0.42857143 0.94117647 0.0625 … 0.84210526 0.71875 0.62 ][0.42857143 0.94117647 0.0625 … 0.84210526 0.71875 0.62 ][0.42857143 0.94117647 0.0625 … 0.84210526 0.71875 0.62 ][0.42857143 0.94117647 0.0625 … 0.84210526 0.71875 0.62 ][0.42857143 0.94117647 0.0625 … 0.84210526 0.71875 0.62 ][0.42857143 0.94117647 0.0625 … 0.84210526 0.71875 0.62 ]

3. Верно. Затем вам нужно извлечь индекс с наибольшей вероятностью. Тогда почему вы используете predict_proba ? Вы должны использовать predict

4. знаете ли вы, почему мы получаем такое количество вероятностей для одной строки точки данных?.

5. Он основан на используемом вами классификаторе. Как правило, при использовании predict_proba вы получаете вероятность того , что каждый класс в вашем наборе данных будет положительным. Вот почему вы получаете так много вероятностей (для каждого класса). Если вы используете predict , то это дает только класс с наибольшей вероятностью.