Обучение несбалансированным данным с использованием 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) поскольку метрика точности не столь полезна в случае несбалансированных данных, существует ли другая метрика, которая может быть максимизируется путем изменения функции затрат? Я, конечно, могу рассчитать АУРОК после тренировки, но могу ли я тренироваться таким образом, чтобы максимизировать АУРОК?
(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)
Я слышал, что это можно сделать, взвесив стоимость неправильной классификации меньшего класса меток, но я не уверен, как это сделать.
4 ответов:
(1)можно использовать свою стратегию. Я также работаю с несбалансированными данными, которые я стараюсь сначала использовать методы с пониженной выборкой и с повышенной выборкой, чтобы сделать обучающий набор равномерно распределенным. Или использование метода ансамбля для обучения каждого классификатора с равномерным распределенным подмножеством.
(2) я не видел никакого способа максимизировать AUROC. Я думаю, что AUROC основан на положительной скорости ture и ложноположительной скорости, что не говорит о том, насколько хорошо он работает в каждом случае. Таким образом, это может быть не обязательно максимизируйте возможность разделения классов.
(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.
Что касается несбалансированных наборов данных, то первыми двумя методами, которые приходят на ум, являются (взвешивание положительных выборок, выборка для достижения сбалансированных пакетных распределений).
Перевешивание положительных образцов Это относится к увеличению потерь неправильно классифицированных положительных выборок при обучении на наборах данных, которые имеют гораздо меньше положительных выборок. Это стимулирует алгоритм ML изучать параметры, которые лучше подходят для положительных выборок. Для бинарной классификации существует простой API в тензорный поток, который достигает этого. Смотрите (weighted_cross_entropy), ссылка на который приведена ниже
Пакетный Отбор Проб Это включает в себя выборку набора данных таким образом, чтобы каждая партия обучающих данных имела равномерное распределение положительных выборок по отрицательным выборкам. Это можно сделать с помощью API выборки отклонений, предоставленного tensorflow.
Comments