【问题标题】:Why is sklearn.metrics support value changing every time?为什么 sklearn.metrics 每次都支持值变化?
【发布时间】:2020-05-28 11:59:09
【问题描述】:

我正在训练一个监督学习 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 打印每个类的支持以及其他指标。根据此链接,支持是 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 中的数字相匹配。

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

【问题讨论】:

  • 回答您的旁注:74us/sample 意味着用您的一个数据样本进行训练需要 74 微秒(我们)
  • @BStadlbauer 谢谢!
  • 另外,对于你问的问题,你能提供一个最小的例子吗?因为如果y_true每次都一样,那么支持不一样似乎有点奇怪
  • 显然它不像你说的那样工作,或者它会给你同样的答案。但是,如果我们看不到您的代码,没有人可以帮助您。请阅读minimal reproducible example。例如,您说“改组”,这意味着您正在更改每次读入模型的数据。这很可能是您得到不同答案的原因。

标签: python machine-learning scikit-learn supervised-learning


【解决方案1】:

添加:

np.random.seed(42)

在你洗牌之前

np.random.shuffle(array)

The reason for this is without seedingnp.shuffle 每次都会创建不同的结果。因此,当您将数组输入模型时,它将返回不同的结果。播种允许您每次都将其重新洗牌,从而产生可重复的结果。

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

【讨论】:

  • 您能解释一下为什么我所拥有的东西不起作用吗?这是完全相同的数据,只是打乱了,所以我认为每个班级的计数每次都是相同的。我了解(现在)种子如何使每次运行的随机播放相同,谢谢。
  • 简短的回答是因为 shuffle 随机选择 2 个元素进行交换,因此您每次向模型提供不同的数据,因此模型的学习方式不同。长答案是"Black Box."
猜你喜欢
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多