#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
, то это дает только класс с наибольшей вероятностью.