Python 什么时候使用keras中的样本重量合适?

Python 什么时候使用keras中的样本重量合适?,python,tensorflow,keras,Python,Tensorflow,Keras,根据这一点,我了解到keras中的class\u weight在训练过程中应用了加权损失,而sample\u weight则在样本方面做了一些事情,如果我对所有训练样本没有同等的信心 所以我的问题是 验证过程中的损失是按等级权重加权的,还是仅在培训过程中加权的 我的数据集有两个类,实际上我没有严重的不平衡的类分布。比率约为1.7:1。是否有必要使用class_weight来平衡损耗,甚至使用过采样?将稍微不平衡的数据保留为通常的数据集处理,可以吗 Li >我可以简单地考虑样本权重>代码>作为给

根据这一点,我了解到
keras
中的
class\u weight
在训练过程中应用了加权损失,而
sample\u weight
则在样本方面做了一些事情,如果我对所有训练样本没有同等的信心

所以我的问题是

  • 验证过程中的损失是按
    等级权重加权的,还是仅在培训过程中加权的
  • 我的数据集有两个类,实际上我没有严重的不平衡的类分布。比率约为1.7:1。是否有必要使用
    class_weight
    来平衡损耗,甚至使用过采样?将稍微不平衡的数据保留为通常的数据集处理,可以吗
  • <> Li >我可以简单地考虑<代码>样本权重>代码>作为给每个火车样本的权重吗?我的trainig样本可以以同样的置信度处理,所以我可能不需要使用这个
  • 从keras文档中可以看出
  • class_weight:可选字典将类索引(整数)映射到权重(浮点)值,用于对损失函数进行加权(仅在训练期间)。这有助于告诉模型“更加注意”来自未充分表示的类的样本

    因此,
    class_重量
    只会影响训练过程中的损耗。我本人对理解在测试和培训期间如何处理课堂和样本重量很感兴趣。看看keras github回购协议和度量和损失代码,似乎损失或度量都不受它们的影响。打印的值很难在训练代码(如
    model.fit()
    及其相应的tensorflow后端训练函数)中跟踪。所以我决定编写一个测试代码来测试可能的场景,请参见下面的代码。结论是
    class_weight
    sample_weight
    只影响训练损失,对任何指标或验证损失都没有影响。有点令人惊讶,因为
    val\u sample\u weights
    (您可以指定)似乎什么都不做(?)

  • 这类问题始终取决于您的问题、日期的倾斜程度以及您尝试以何种方式优化模型。如果您对精度进行了优化,那么只要训练数据与模型生产时一样倾斜,就可以在没有任何过度/不足采样和/或类权重的情况下进行训练,获得最佳结果。 另一方面,如果一个类比另一个类更重要(或更昂贵),那么应该对数据进行加权。例如,在欺诈预防方面,欺诈通常比非欺诈收入昂贵得多。我建议您尝试未加权类、加权类和一些欠采样/过采样和检查,以获得最佳验证结果。使用验证函数(或编写自己的验证函数),该函数最能比较不同的模型(例如,根据成本的不同对真阳性、假阳性、真阴性和假阴性进行加权)。 在倾斜数据的kaggle竞赛中,一个相对较新的损失函数显示了巨大的结果,即
    焦点损失
    <代码>焦点损失
    减少采样过度/不足的需要。不幸的是,
    Focal loss
    在keras中还不是内置的inn功能,但可以手动编程

  • 是的,我想你是对的。我通常使用
    sample\u weight
    有两个原因。1、训练数据具有某种测量不确定度,如果已知,可以使用这种不确定度对准确数据进行加权,而不是对不准确的测量进行加权。或者,我们可以比旧数据更重视新数据,迫使模型更快地适应新行为,而不忽略有价值的旧数据

  • 用于比较有无
    类权重
    样本权重
    的代码,同时保持模型和其他一切静止

    将tensorflow导入为tf
    将numpy作为np导入
    数据大小=100
    输入大小=3
    等级=3
    x\u train=np.random.rand(数据大小、输入大小)
    y_train=np.random.randint(0,类,数据大小)
    #样本重量序列=np.rand.rand(数据大小)
    x_val=np.random.rand(数据大小、输入大小)
    y_val=np.random.randint(0,类,数据大小)
    #样本重量=np.random.rand(数据大小)
    输入=tf.keras.layers.Input(形状=(输入大小))
    pred=tf.keras.layers.density(类,activation='softmax')(输入)
    模型=tf.keras.models.model(输入=输入,输出=预测)
    损失=tf.keras.loss.sparse\u分类\u交叉熵
    度量=tf.keras.metrics.sparse\u分类精度
    compile(loss=loss,metrics=[metrics],optimizer='adam')
    #将模型设置为静态,以便我们可以在不同场景之间进行比较
    对于model.layers中的图层:
    layer.trainable=错误
    #基本模型无权重(与无类权重的结果相同)
    #模型拟合(x=x_序列,y=y_序列,验证数据=(x_val,y_val))
    类_权重={0:1,1:1,2:1.}
    模型拟合(x=x\u序列,y=y\u序列,类权重=类权重,验证数据=(x\u val,y\u val))
    #哪些产出:
    >损失:1.1882-稀疏分类精度:0.3300-val损失:1.1965-val稀疏分类精度:0.3100
    #将类权重更改为零,以检查受影响的损失和度量
    类_权重={0:0,1:0,2:0}
    模型拟合(x=x\u序列,y=y\u序列,类权重=类权重,验证数据=(x\u val,y\u val))
    #哪些产出:
    >损失:0.0000e+00-稀疏分类精度:0.3300-瓦尔分类精度:1.1945-瓦尔分类精度:0.3100
    #将样本权重更改为零,以检查受影响的损失和度量
    样本重量系列=np.零(100)
    样本重量=np.零(100)
    模型拟合(x=x_序列,y=y_序列,样本重量=样本重量_序列,验证数据=(x_val,y_val,样本重量_val))
    #哪些产出:
    >损失:0.0000e+00-稀疏分类精度:0.3300-瓦尔分类精度:1.1931-瓦尔分类精度:0.3100
    
    使用重量和不使用重量之间存在一些小偏差