我正在训练一个监督学习的 Keras 模型,将数据分类为三类之一。训练后,我运行以下代码:
dataset = pandas.read_csv(filename, header=[0], encoding='utf-8-sig', sep=',')# split X and Y (last column)array = dataset.valuescolumns = array.shape[1] - 1np.random.shuffle(array)x_orig = array[:, 1:columns]testy = array[:, columns]columns -= 1# normalize datascaler = StandardScaler()testx= scaler.fit_transform(x_orig)#onehottesty = to_categorical(testy)# load weightssave_path = "[filepath]"model = tf.keras.models.load_model(save_path)# gets class breakdowny_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]。它们的总和相同,但每个类别的数量不同。
由于我的数据在每次运行之间没有变化,我期望支持值每次都相同。我错了么?如果没有,这是怎么回事?我试过谷歌搜索,但没有找到有用的结果。
可能有用的信息:当我运行 sklearn.metrics.classification_report 时,我遇到了相同的问题,且这些数字与 precision_recall_fscore_support 中的数字相匹配。
附注:与上述问题无关,但我也没能通过谷歌找到答案,希望在这里提出来没问题。当我运行 model.evaluate 时,打印出的部分内容例如 74us/sample。us/sample 是什么意思?
回答:
添加:
np.random.seed(42)
在你打乱数组之前
np.random.shuffle(array)
原因是如果不设置种子 np.shuffle 每次都会产生不同的结果。因此,当你将数组输入模型时,它会返回不同的结果。设置种子可以使每次打乱的方式相同,从而产生可重复的结果。
或者你可以不打乱数组,每次都使用相同的数组输入模型。这两种方法中的任何一种或两者结合都可以确保模型内的结果可重复性。