同时使用sample_weight和class_weight

use*_*665 5 python keras tensorflow

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

我可以同时使用它们sample_weightclass_weightmodel.fit()功能中进一步重新加权吗?

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

编辑:

为了进一步说明,我已经在我的数据集中为每个样本设置了单独的权重,并且为了进一步增加复杂性,第一类的样本权重的总和远远大于第二类的总样本权重.

例如,我目前有:

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_weightAND class_weight功能.如果一个覆盖另一个,那么我将不得不创建新的sample_weights然后使用fit()train_on_batch().

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

Dar*_*nus 9

如果你愿意的话,你当然可以做到这两件事,如果那就是你需要的东西.根据keras 文档:

  • class_weight:可选字典将类索引(整数)映射到权重(浮点)值,用于加权损失函数(仅限训练期间).这可以用来告诉模型"更多地关注"来自代表性不足的类的样本.

  • sample_weight:训练样本的可选Numpy权重数组,用于加权损失函数(仅限训练期间).您可以传递与输入样本长度相同的平坦(1D)Numpy数组(权重和样本之间的1:1映射),或者在时间数据的情况下[...].

所以考虑到你提到你"与第二类相比有更多的第一类"我认为你应该选择class_weight参数.在那里,您可以指出数据集所呈现的比率,以便您可以补偿不平衡的数据类.在sample_weight当你要定义的权重或重要性更为每个数据元素.

例如,如果您通过:

class_weight = {0 : 1. , 1: 50.}
Run Code Online (Sandbox Code Playgroud)

你会说来自班级的每个样本都会从课堂上1算作50个样本0,因此从课堂上给你的元素提供了更多的"重要性" 1(因为你肯定会减少这些样本).您可以根据自己的需要进行定制.更多关于这个伟大问题的信息不平衡数据集.

注意:为了进一步比较这两个参数,请记住,传递class_weightas {0:1., 1:50.}等同于传递sample_weightas [1.,1.,1.,...,50.,50.,...],因为你有样本的类在哪里[0,0,0,...,1,1,...].

正如我们所看到的,class_weight在这种情况下使用它更实际,并且sample_weight可以用于更具体的情况,在这些情况下,您实际上希望单独为每个样本赋予"重要性".如果案例需要,也可以使用两者,但必须考虑到它的累积效应.

编辑:根据你的新问题,挖掘Keras 源代码似乎确实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
Run Code Online (Sandbox Code Playgroud)

这意味着您只能使用其中一个,但不能同时使用两者.因此,您确实需要乘以您需要sample_weights的比率来弥补不平衡.

  • 实际上,`sample_weight` 将覆盖 Keras 中的 `class_weight`,后者根本没有任何影响(有点出乎 IMO 的意料)。因此 OP 可能需要将权重合并为一个,然后再将其传递给“fit”。 (2认同)
  • @Yu-Yang 有趣,感谢分享(将在桌面上尝试并更新)。OP 仍然如何描述似乎使用`class_weight` 就足以平衡不平衡的数据集。如果需要进一步定制,那么手动合并和计算 `sample_weighs` 可以提供更多帮助。 (2认同)