В настоящее время я работаю над алгоритмом биномиальной классификации с сильно искаженными данными (90% отрицательных / 10% положительных), используя tf.estimator.DNNClassifier
.
Поскольку все модели, которые я обучаю, сходятся, чтобы пометить все выборки как негативы, мне нужно реализовать функцию взвешенных потерь.
Я посмотрел здесь много разных вопросов, и многие из них освещают. Однако я не мог получить практический исчерпывающий ответ о том, как на самом деле реализовать функции. Эта и эта темы были лучшими.
Моя проблема: я хочу использовать tf.nn.weighted_cross_entropy_with_logits()
, но я не знаю, куда мне вставить его в мой код.
У меня есть функция для конструирования Feature Colums:
def construct_feature_columns(input_features):
return set([tf.feature_column.numeric_column(my_feature)
for my_feature in input_features])
Функция, которая определяет tf.estimator.DNNClassifier
, а также другие параметры, такие как оптимизатор и функция ввода:
def train_nn_classifier_model(
learning_rate,
steps,
batch_size,
hidden_units,
training_examples,
training_targets,
validation_examples,
validation_targets):
dnn_classifier = tf.estimator.DNNClassifier(
feature_columns=construct_feature_columns(training_examples),
hidden_units=hidden_units,
optimizer=my_optimizer)
Функция обучения:
dnn_classifier.train(input_fn=training_input_fn, steps=steps_per_period)
Функция прогнозирования для расчета ошибки во время тренировки:
training_probabilities = dnn_classifier.predict(input_fn=predict_training_input_fn)
Оптимизатор:
my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)
Функции ввода (для входных данных обучения, прогнозирования входных данных для обучения и входных данных для проверки):
training_input_fn = lambda: my_input_fn(
training_examples,
training_targets['True/False'],
batch_size=batch_size)
Куда мне вставить tf.nn.weighted_cross_entropy_with_logits
, поэтому моя модель рассчитывает потери, используя эту функцию?
Кроме того, как мне вызвать targets (A Tensor of the same type and shape as logits)
внутри функции кросс-энтропии? Это training_targets
DataFrame, это выход input function
с training_targets
в качестве ввода?
А какие конкретно логиты? Потому что для меня они должны быть предсказаниями, которые исходят от функции:
training_probabilities = dnn_classifier.predict(input_fn=predict_training_input_fn)
Но это не имеет смысла для меня. Я пробовал много разных способов реализовать это, но ни один из них не сработал.