tensorflow 如何在线性分类器中应用类权值进行二值分类?

juud5qan  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(144)

这是我用来执行二进制分类的线性分类器,下面是代码片段:

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。
我如何将平衡应用到这些数据上呢?我一直在四处搜索,我可以找到与类权重等相关的东西,但我找不到如何创建类权重以及如何应用到tensorflow 的训练方法。
下面是我计算损失的方法:

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)
50few1ms

50few1ms1#

我假设您使用sklearn中的log_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)

相关问题