Правильное место для регуляризации дисбаланса класса (уровень данных или уровень пакета) - PullRequest
0 голосов
/ 04 октября 2019

У меня есть два двоичных несбалансированных набора данных, где метки представляют собой эфиры 0 или 1, а выходные данные прогноза находятся в диапазоне от 0 до 1. Положительный случай имеет 10000 выборок, а отрицательный случай имеет 90000 выборок. Я использую партию 100 при обучении.

при расчете BinaryCrossEntropyLoss (в pytorch) можно указать вес регуляризации для каждого элемента партии.

Мой вопрос таков: чтобы рассчитать общую весовую дозу, имеет смысл рассчитать ее 1 раз в начале (т. Е. 1 / (10000 / (100000) для положительного случая) и масштабировать потерю каждоговыборка с этим значением

или:

Рассчитайте вес на уровне партии, сначала найдя дисбаланс класса партии (например, в партии это может быть 25 положительных и 75 отрицательных, следовательно, 1 /(25 / (25 + 75) для положительного случая)

Я спрашиваю об этом, потому что потери усредняются по партии

1 Ответ

1 голос
/ 04 октября 2019

Если вы хотите сделать это таким образом, вы должны рассчитать дисбаланс класса каждой партии.

С другой стороны, вы, вероятно, должны убедиться, что каждая партия сохраняет статистику меток (например, для партии 64 иВ этом случае у вас должно быть 6 положительных образцов, а остальные отрицательные). Таким образом, было бы достаточно рассчитать дисбаланс классов один раз и добавить его к torch.nn.BCELoss для каждой партии.

Я бы предложил другой подход, например, передискретизациюили занижение выборки с использованием класса Sampler PyTorch (не делайте этого, копируя примеры, это излишне тратит пространство). Вы можете реализовать это вручную или использовать стороннюю библиотеку, которая сделала это для вас, например torchdata (раскрытие: я автор) и torchdata.samplers.RandomOverSampler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...