【问题标题】:How to set parts of positive samples weight in TensorFlow for binary classfication如何在TensorFlow中设置部分正样本权重以进行二进制分类
【发布时间】:2018-08-25 01:18:07
【问题描述】:

我想为部分阳性样本设置相同的权重。但是,tf.nn.weighted_cross_entropy_with_logits 在我看来只能设置所有正样本的权重。

例如,在ctr预测中,我想为订单样本设置10个权重,点击样本和未点击样本的权重仍然是1。

这是我的未加权代码

def my_model(features, labels, mode, params):
    net = tf.feature_column.input_layer(features, params['feature_columns'])
    for units in params['hidden_units']:
       net = tf.layers.dense(net, units=units, activation=params["activation"])  
    logits = tf.layers.dense(net, params['n_classes'], activation=None)

    predicted_classes = tf.argmax(logits, 1)
    if mode == tf.estimator.ModeKeys.PREDICT:
       predictions = {
        'class_ids': predicted_classes, #predicted_classes[:, tf.newaxis],
        'probabilities': tf.nn.softmax(logits),
        'logits': logits,
       }
       return tf.estimator.EstimatorSpec(mode, predictions=predictions)

    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

    metrics = {'auc': tf.metrics.auc(labels=labels, predictions=tf.nn.softmax(logits)[:,1])}

    if mode == tf.estimator.ModeKeys.EVAL:
       return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=metrics)

    assert mode == tf.estimator.ModeKeys.TRAIN
    optimizer = tf.train.AdagradOptimizer(learning_rate=0.1)
    train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step()) 
    return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

火车

train_input_fn = tf.estimator.inputs.pandas_input_fn(x=data_train, y=data_train_click, batch_size = 1024, num_epochs=1, shuffle=False)
classifier.train(input_fn=train_input_fn)

这里data_train_click是一个Series,点击样本为1,未点击样本为0。我有一个名为data_train_order的Series,订单样本为1,其他为0

【问题讨论】:

  • 你的意思是你想对假阳性和假阴性进行不同的加权?
  • @Nickpick 我想要基于实例的权重,而不是基于类的权重。
  • 基于实例是什么意思?基于样本并取决于结果?
  • @Nickpick 不同的样本有不同的权重

标签: python tensorflow weighted


【解决方案1】:

您可以通过将权重参数传递给损失函数来对每个样本进行不同的加权,该损失函数是一个形状为 [batch_size] 的张量,其中包含每个样本的相应权重。

loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits, weights=weights)

【讨论】:

    【解决方案2】:

    最简单的方法是使用 keras

    https://keras.io/models/model/

    fit 函数有一个 sample_weight 参数。

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 1970-01-01
      • 2021-04-10
      • 2017-02-10
      • 2017-07-25
      • 2017-05-30
      • 2017-11-07
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多