【问题标题】:How to apply class weights in linear classifier for binary classification?如何在线性分类器中应用类权重进行二元分类?
【发布时间】:2019-08-06 11:36:21
【问题描述】:

这是我用来执行二进制分类的线性分类器,这里是代码 sn-p:

my_optimizer = tf.train.AdagradOptimizer(learning_rate = learning_rate)
my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer,5.0)
# Create a linear classifier object
linear_classifier = tf.estimator.LinearClassifier(
          feature_columns = feature_columns, 
          optimizer = my_optimizer 
          )
linear_classifier.train(input_fn = training_input_fn, steps = steps)

数据集不平衡,只有两个类是/否。 NO类示例数为36548,YES类示例数为4640。

如何对这些数据应用平衡?我一直在四处寻找,我可以找到与类权重等相关的东西,但我找不到如何创建类权重以及如何应用于张量流的训练方法。

这是我计算损失的方法:

training_probabilities = linear_classifier.predict(input_fn = training_predict_input_fn)
training_probabilities = np.array([item['probabilities'] for item in training_probabilities])

validation_probabilities = linear_classifier.predict(input_fn=validation_predict_input_fn)
validation_probabilities = np.array([item['probabilities'] for item in validation_probabilities])

training_log_loss = metrics.log_loss(training_targets, training_probabilities)
validation_log_loss = metrics.log_loss(validation_targets, validation_probabilities)

【问题讨论】:

    标签: tensorflow machine-learning scikit-learn logistic-regression


    【解决方案1】:

    我假设您正在使用来自sklearnlog_loss 函数来计算您的损失。如果是这种情况,您可以使用参数sample_weight 添加类权重,并传递一个数组,其中包含要为每个数据点赋予的权重。 sample_weightclass_weights 的推出版本。您可以通过传递给定here 的样本权重来计算sample_weight 数组。

    将以下行添加到您的代码中:

    sample_wts = compute_sample_weight("balanced", training_targets)
    training_log_loss = metrics.log_loss(training_targets, training_probabilities, sample_weight= sample_wts)
    

    希望这会有所帮助!

    【讨论】:

    • 训练样本为 28832 x 2,而训练目标为 28832 x 1,生成的样本权重为 28832 x 1,您能详细说明这是什么意思吗?这将用于解决类不平衡问题吧?
    • 当您说class_weights 时,您实际上给出了一个字典,其中每个类的权重都说为{0:0.1, 1: 5}。现在让我们回到sample_weights让我们假设你有10个数据点y_true = [0,0,0,0,1,1,0,0,0,0],样本权重所做的只是创建一个元素为[0.1,0.1,0.1,0.1,5,5, 0.1,0.1,0.1,0.1]的数组,是的,这将解决类不平衡的问题。
    • 谢谢,如果我按照上面的代码 sn-p 我看到 compute_sample_weight 只是根据数据点所属的类为数据点分配权重,但请记住,我没有在任何地方明确提到 class_weight ,他们是如何计算的?
    • 它在compute_sample_weight 函数中计算。在这里,我将balanced 指定为class_weight 参数,该参数调整与输入数据中的类频率成反比的调整权重为n_samples / (n_classes * np.bincount(y))。更多详情请参考scikit-learn.org/stable/modules/generated/…
    猜你喜欢
    • 2015-03-31
    • 2016-03-29
    • 2017-02-08
    • 2015-04-06
    • 2017-09-09
    • 2013-02-04
    • 1970-01-01
    • 2020-09-09
    • 2016-07-26
    相关资源
    最近更新 更多