为什么 sklearn.metrics 支持值每次都在变化?

Why is sklearn.metrics support value changing every time?

我正在训练一个监督学习 keras 模型,以将数据分类为 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 打印每个 class 的支持度以及其他指标。根据这个 link,支持度是每个 class 在 y_true 中出现的次数,这是真实的标签。 https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html

我的问题:每个运行,支持不同。我使用相同的数据,并且对每个 class 的支持总和相同(但与文件中的总数不同——我也不明白),但每个 class 的数字不同。

例如,一个 运行 可能会说 [16870, 16299, 7807],下一个可能会说 [17169, 15923, 7884]。它们相加相同,但每个 class 不同。

由于我的数据在 运行 秒之间没有变化,我希望每次的支持都是相同的。我错了吗?如果不是,这是怎么回事?我试过谷歌搜索,但没有得到任何有用的结果。

可能有用的信息:当我 运行 sklearn.metrics.classification_report 时,我遇到了同样的问题,并且其中的数字与 precision_recall_fscore_support 中的数字相匹配。

旁注:与上述问题无关,但我也无法 google-fu 回答这个问题,我希望可以在此处包含。当我 运行 model.evaluate 时,打印输出的一部分是例如74us/sample。 us/sample 是什么意思?

添加:

np.random.seed(42)

打乱数组之前
np.random.shuffle(array)

The reason for this is without seeding np.shuffle 每次都会产生不同的结果。因此,当您将数组输入模型时,它会 return 不同的结果。播种允许您每次都以相同的方式洗牌,从而产生可重现的结果。

或者您不能每次都洗牌并获得相同的数组以输入模型。一种或两种方法都将确保模型内的可重复性。