18

Ситуация:Обучение несбалансированных данных с использованием TensorFlow

Мне интересно, как использовать TensorFlow оптимально, когда моя подготовка данных неуравновешенным в распределении этикетки между 2 этикетками. Например, предположим, что MNIST tutorial упрощен, чтобы различать только 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) 

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

+0

ли вы решить вашу проблему? У меня есть аналогичная проблема, и в настоящее время я экспериментирую с: a) выпадением 50% при скрытом1, b) регуляцией L2 при потере и c) удалением наиболее известного класса 90% и вычислением с 10% равномерно распределенных классов. – Frank

+0

Я никогда не находил лучшего решения, чем случайные партии. Для практичности я в конечном итоге отказался от нейронных сетей в пользу древовидных методов, реализованных в scikit-learn. Здесь есть встроенные методы кросс-валидации, которые могут оптимизировать AUROC, что прекрасно решает проблему дисбаланса. Они также работают намного быстрее, чем TensorFlow, так как у меня много процессоров, но нет GPU. – MJoseph

ответ

5

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

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

(3) Что касается взвешивания стоимости по отношению к экземплярам класса, то она аналогична Loss function for class imbalanced binary classifier in Tensor flow и ответ.

2

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

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

Не уверен 2.

4

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

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

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

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

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