Подтвердить что ты не робот

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

Ситуация:

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

Одна из стратегий, которую я использовал для успеха, - это выбор случайных партий для обучения, которые имеют равномерное распределение 0 и 1. Такой подход гарантирует, что я все еще могу использовать все свои данные обучения и получать достойные результаты с точностью менее 90%, но гораздо более полезный классификатор. Поскольку точность в этом случае мне бесполезна, моя метрика выбора обычно является областью под кривой ROC (AUROC), и это дает результат, значительно превышающий 0,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)

Я слышал, что это может быть возможно за счет увеличения стоимости неправильной классификации меньшего класса ярлыков, но я не уверен, как это сделать.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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 является одним из лучших показателей для компенсации несбалансированных данных.

Ответ 3

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

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

Не уверен в 2.

Ответ 4

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

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

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