Обучение несбалансированным данным с использованием TensorFlow

Ситуация:

Мне интересно, как оптимально использовать TensorFlow, когда мои данные обучения несбалансированы в распределении меток между 2 метками. Например, предположим, что MNIST учебник упрощается, чтобы различать только 1 и 0, где все доступные нам изображения являются либо 1, либо 0. Это просто тренироваться, используя предоставленные учебники TensorFlow, когда у нас есть примерно 50% каждого типа изображения для обучения и тестирования. Но как насчет случая, когда 90% изображений, доступных в наших данных, равны 0, а только 10% - 1? Я замечаю, что в этом случае TensorFlow обычно предсказывает, что весь мой тестовый набор равен 0, достигая точности бессмысленных 90%.

одна из стратегий, которую я использовал для некоторого успеха, - это выбор случайных партий для обучения, которые имеют равномерное распределение 0 и 1. Этот подход гарантирует, что я все еще могу использовать все свои данные обучения и получить достойные результаты, менее 90% точность, но гораздо более полезный классификатор. Поскольку точность несколько бесполезна для меня в этом случае, моя метрика выбора обычно является областью под кривой ROC (AUROC), и это дает результат респектабельно выше, чем .50.

вопросы:

(1) является ли стратегия, которую я описал, принятым или оптимальным способом обучения несбалансированным данным, или есть тот, который может работать лучше?

(2) так как метрика точности не так полезна в случае несбалансированные данные, есть ли еще одна метрика, которая может быть максимизирована путем изменения функции затрат? Я, конечно, могу рассчитать AUROC после обучения, но могу ли я тренироваться таким образом, чтобы максимизировать AUROC?

(3) Есть ли другие изменения, которые я могу внести в свою функцию затрат, чтобы улучшить результаты для несбалансированных данных? В настоящее время я использую предложение по умолчанию, данное в учебниках TensorFlow:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

Я слышал, это может быть возможно до взвешивания стоимости miscategorizing меньший класс label, но я не уверен, как это сделать.

4 ответов


(1)можно использовать вашу стратегию. Я также работаю с несбалансированными данными, которые я пытаюсь использовать сначала методы выборки вниз и выборки вверх, чтобы сделать учебный набор даже распределенным. Или используя метод ансамбля для обучения каждого классификатора с четным распределенным подмножеством.

(2) я не видел никакого метода для максимизации AUROC. Я думаю, что AUROC основан на положительной скорости и ложной положительной скорости, которая не говорит, насколько хорошо она работает в каждом случае. Таким образом, он не может необходимо максимизировать возможность разделения классов.

(3)Что касается взвешивания стоимости по соотношению экземпляров класса, это похоже на функция потерь для несбалансированного двоичного классификатора класса в Тензорном потоке и ответ.


Я тот, кто борется с несбалансированными данными. Какова моя стратегия противодействия несбалансированным данным, как показано ниже.

1) Используйте функцию цены высчитывая 0 и 1 ярлыки в тоже время как ниже.

cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(_pred) + (1-y)*tf.log(1-_pred), reduction_indices=1))

2) Используйте SMOTE, метод передискретизации, делая количество меток 0 и 1 похожими. См. здесь http://comments.gmane.org/gmane.comp.python.scikit-learn/5278

обе стратегии работали, когда я пытался сделать кредитный рейтинг модель.

логистическая регрессия-типичный метод обработки несбалансированных данных и двоичной классификации, такой как прогнозирование скорости по умолчанию. AUROC является одним из лучших показателей для противодействия несбалансированным данным.


1) Да. Это хорошо принятая Стратегия противодействия несбалансированности данных. Но эта стратегия хороша в нейронных сетях только при использовании SGD.

еще один простой способ сбалансировать данные обучения - использовать взвешенные примеры. Просто увеличьте потерю каждого экземпляра на больший вес / меньше, когда видите несбалансированные примеры. Если вы используете онлайн-градиентный спуск, это может быть так же просто, как использовать большую/меньшую скорость обучения при просмотре несбалансированных примеров.

Не уверен 2.


Что касается несбалансированных наборов данных, первые два метода, которые приходят на ум (перевешивание положительных выборок, выборка для достижения сбалансированных пакетных распределений).

Upweighting положительные образцы Это относится к увеличению потерь неправильно классифицированных положительных выборок при обучении наборам данных с гораздо меньшим количеством положительных выборок. Это стимулирует алгоритм ML изучать параметры, которые лучше подходят для положительных образцов. Для бинарной классификации, существует простой API в tensorflow, который достигает этого. См. (weighted_cross_entropy) ссылка ниже

Пакетная Выборка Это включает в себя выборку набора данных таким образом, чтобы каждая партия обучающих данных имела равномерное распределение положительных выборок на отрицательные. Это можно сделать с помощью API выборки отклонений, предоставленного tensorflow.