Почему значение поддержки sklearn.metrics меняется каждый раз? - PullRequest
0 голосов
/ 12 февраля 2020

Я работаю над обучением модели контролируемого обучения керасу для классификации данных в одну из 3 категорий. После обучения я запускаю это:

dataset = pandas.read_csv(filename, header=[0], encoding='utf-8-sig', sep=',')

# split X and Y (last column)
array = dataset.values
columns = array.shape[1] - 1
np.random.shuffle(array)
x_orig = array[:, 1:columns]
testy = array[:, columns]
columns -= 1

# normalize data
scaler = StandardScaler()
testx= scaler.fit_transform(x_orig)

#onehot
testy = to_categorical(testy)

# load weights
save_path = "[filepath]"
model = tf.keras.models.load_model(save_path)

# gets class breakdown
y_pred = model.predict(testx, verbose=1)
y_pred_bool = np.argmax(y_pred, axis=1)
y_true = np.argmax(testy, axis=1)
print(sklearn.metrics.precision_recall_fscore_support(y_true, y_pred))

sklearn.metrics.precision_recall_fscore_support печатает, среди других показателей, поддержку для каждого класса. По этой ссылке поддержка - это число вхождений каждого класса в y_true, которое является истинными метками. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html

Моя проблема: при каждом запуске поддержка различна. Я использую одни и те же данные, и поддержка каждого класса всегда складывается одинаково (но отличается от общей суммы в файле - чего я тоже не понимаю), но число на класс отличается.

Например, один прогон может сказать [16870, 16299, 7807], а следующий может сказать [17169, 15923, 7884]. Они складываются одинаково, но каждый класс отличается.

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

Потенциально полезная информация: когда я запускаю sklearn.metrics.classification_report, у меня возникает та же проблема, и числа из нее совпадают с числами из precision_recall_fscore_support ,

Sidenote: не имеет отношения к вышеупомянутому вопросу, но я не мог google-fu также ответить на этот вопрос, я надеюсь, что это нормально, чтобы включить сюда. Когда я запускаю model.evaluate, часть распечатки составляет, например, 74us / sample. Что значит нас / образец?

1 Ответ

0 голосов
/ 13 февраля 2020

Добавить:

np.random.seed(42)

перед перетасовкой массива в

np.random.shuffle(array)

Причиной этого является отсутствие заполнения np.shuffle создаст другой результат каждый раз. Таким образом, когда вы вводите массив в модель, он возвращает другой результат. Посев позволяет перемешивать его каждый раз одинаково, создавая воспроизводимые результаты.

Или вы не можете перемешивать и получать один и тот же массив каждый раз для подачи в модель. Любой или оба метода обеспечат воспроизводимость модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...