Ситуация:Обучение несбалансированных данных с использованием 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 меньшего класса надписей, но я не уверен в том, как это сделать.
ли вы решить вашу проблему? У меня есть аналогичная проблема, и в настоящее время я экспериментирую с: a) выпадением 50% при скрытом1, b) регуляцией L2 при потере и c) удалением наиболее известного класса 90% и вычислением с 10% равномерно распределенных классов. – Frank
Я никогда не находил лучшего решения, чем случайные партии. Для практичности я в конечном итоге отказался от нейронных сетей в пользу древовидных методов, реализованных в scikit-learn. Здесь есть встроенные методы кросс-валидации, которые могут оптимизировать AUROC, что прекрасно решает проблему дисбаланса. Они также работают намного быстрее, чем TensorFlow, так как у меня много процессоров, но нет GPU. – MJoseph