gpt4 book ai didi

python - 同时使用 sample_weight 和 class_weight

转载 作者:太空狗 更新时间:2023-10-30 00:47:37 26 4
gpt4 key购买 nike

我的数据集已经有加权示例。在这个二元分类中,与第二类相比,我也有更多的第一类。

我可以同时使用 sample_weight 并在 model.fit() 函数中使用 class_weight 进一步重新加权吗?

或者我是否首先创建一个新的 new_weights 数组并将其作为 sample_weight 传递给 fit 函数?

编辑:

为了进一步说明,我已经为数据集中的每个样本设置了单独的权重,更复杂的是,第一类样本权重的总和远远超过第二类样本权重的总和。

例如我目前有:

y = [0,0,0,0,1,1]

sample_weights = [0.01,0.03,0.05,0.02, 0.01,0.02]

所以类“0”权重总和0.11类“1”0.03。所以我应该:

class_weight = {0 : 1. , 1: 0.11/0.03}

我需要同时使用 sample_weightclass_weight 功能。如果一个覆盖另一个,那么我将不得不创建新的 sample_weights,然后使用 fit()train_on_batch()

所以我的问题是,我可以同时使用两者,还是一个覆盖另一个?

最佳答案

如果你愿意,你当然可以同时做这两件事,关键是你是否需要。根据kerasdocs :

  • class_weight: Optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function (during training only). This can be useful to tell the model to "pay more attention" to samples from an under-represented class.

  • sample_weight: Optional Numpy array of weights for the training samples, used for weighting the loss function (during training only). You can either pass a flat (1D) Numpy array with the same length as the input samples (1:1 mapping between weights and samples), or in the case of temporal data [...].

鉴于您提到您“第一类比第二类多得多”,我认为您应该选择 class_weight 参数。您可以在此处指示数据集呈现的比率,以便您可以补偿不平衡的数据类。当您想为每个数据元素定义权重或重要性时,sample_weight 更适合。

例如,如果您通过:

class_weight = {0 : 1. , 1: 50.}

您会说 1 类中的每个样本都算作 0 类中的 50 个样本,因此为 类中的元素赋予更多“重要性” 1(因为你肯定有更少的样本)。您可以自定义它以满足您自己的需要。更多关于不平衡数据集的信息 this好问题。

注意:要进一步比较这两个参数,请记住将 class_weight 作为 {0:1., 1:50.} 传递相当于将 sample_weight 作为 [1.,1.,1.,...,50.,50.,...] 传递,假设您有样本其类 [0,0,0,...,1,1,...]

正如我们所见,在这种情况下使用 class_weight 更为实用,而 sample_weight 可用于您实际想要给出​​“重要性”分别对每个样本。如果情况需要,也可以同时使用两者,但必须牢记其累积效应。

编辑:根据您的新问题,挖掘 Keras source code似乎确实 sample_weights 覆盖了 class_weights,这是在 _standarize_weigths 方法上执行的代码片段(第 499 行):

if sample_weight is not None:
#...Does some error handling...
return sample_weight #simply returns the weights you passed

elif isinstance(class_weight, dict):
#...Some error handling and computations...
#Then creates an array repeating class weight to match your target classes
weights = np.asarray([class_weight[cls] for cls in y_classes
if cls in class_weight])

#...more error handling...
return weights

这意味着您只能使用其中之一,而不能同时使用两者。因此,您确实需要将 sample_weights 乘以补偿不平衡所需的比率。


更新:截至本次编辑(2020 年 3 月 27 日),查看 source code training_utils.standardize_weights() 我们可以看到它现在支持两者 class_weightssample_weights:

Everything gets normalized to a single sample-wise (or timestep-wise) weight array. If both sample_weights and class_weights are provided, the weights are multiplied together.

关于python - 同时使用 sample_weight 和 class_weight,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48173168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com