提升类别的权重

我已经构建了一个使用DNNClassifier的TensorFlow模型,用于将输入分类为两个类别。

我的问题是,第一种结果(Outcome 1)出现的频率高达90-95%。因此,TensorFlow对所有预测给出的概率都是相同的。

我试图预测另一种结果(例如,对于第二种结果(Outcome 2),宁愿出现假阳性也不愿错过可能的发生)。我知道在机器学习中,一般在这种情况下,尝试提升第二种结果的权重是值得的。

然而,我不知道如何在TensorFlow中实现这一点。文档暗示这是可能的,但我找不到任何实际操作的例子。是否有人成功地做到了这一点,或者有人知道我可以在哪里找到一些示例代码或详细的解释(我使用的是Python)?

注意:我看到有人在使用TensorFlow的更基础部分而不是估计器时,操作了暴露的权重。出于维护原因,我需要使用估计器来实现这一点。


回答:

tf.estimator.DNNClassifier构造函数有一个weight_column参数:

weight_column:一个字符串或由tf.feature_column.numeric_column创建的_NumericColumn,定义表示权重的特征列。它用于在训练期间降低或提升例子的权重。它将乘以例子的损失。如果它是一个字符串,则用作从features中获取权重张量的键。如果它是一个_NumericColumn,则通过键weight_column.key获取原始张量,然后对其应用weight_column.normalizer_fn以获取权重张量。

因此,只需添加一个新列,并为稀有类填充一些权重:

weight = tf.feature_column.numeric_column('weight')...tf.estimator.DNNClassifier(..., weight_column=weight)

[更新] 这是一个完整的工作示例:

import numpy as npimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets('mnist', one_hot=False)train_x, train_y = mnist.train.next_batch(1024)test_x, test_y = mnist.test.images, mnist.test.labelsx_column = tf.feature_column.numeric_column('x', shape=[784])weight_column = tf.feature_column.numeric_column('weight')classifier = tf.estimator.DNNClassifier(feature_columns=[x_column],                                        hidden_units=[100, 100],                                        weight_column=weight_column,                                        n_classes=10)# 训练train_input_fn = tf.estimator.inputs.numpy_input_fn(x={'x': train_x, 'weight': np.ones(train_x.shape[0])},                                                    y=train_y.astype(np.int32),                                                    num_epochs=None, shuffle=True)classifier.train(input_fn=train_input_fn, steps=1000)# 测试test_input_fn = tf.estimator.inputs.numpy_input_fn(x={'x': test_x, 'weight': np.ones(test_x.shape[0])},                                                   y=test_y.astype(np.int32),                                                   num_epochs=1, shuffle=False)acc = classifier.evaluate(input_fn=test_input_fn)print('测试准确率: %.3f' % acc['accuracy'])

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注