#python #tensorflow2.0 #tensorflow-datasets #imbalanced-data
Вопрос:
Я использую пользовательскую модель тензорного потока для проблемы несбалансированной классификации. Для этого мне нужно разделить данные на поезд и набор тестов и разделить набор поездов на пакеты. Однако партии необходимо расслаивать из-за проблемы дисбаланса. На данный момент я делаю это вот так:
X_train, X_test, y_train, y_test = skmodel.train_test_split( Xscaled, y_new, test_size=0.2, stratify=y_new) dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train)).shuffle( X_train.shape[0]).batch(batch_size)
Но я не уверен, что пакеты в наборе данных стратифицированы или нет? Если нет, то как я могу убедиться, что они стратифицированы?
Комментарии:
1. Пакеты определенно не стратифицированы, но на самом деле у вас нет простого способа получить это с помощью tf.data (и, кроме того, в зависимости от размера пакета и соотношения положительных/отрицательных классов может оказаться невозможным иметь точно стратифицированные классы). Обычный подход состоит в том, чтобы просто тренироваться с набором данных как есть и, возможно, рассмотреть потерю, которая лучше подходит для сильно несбалансированных наборов данных (например, посмотрите на фокальную потерю).
2. Спасибо! Я использую пользовательскую функцию потери несбалансированных данных! Знаете ли вы, что если я буду использовать только срезы тензора для создания набора данных, данные останутся стратифицированными?
3. Единственный способ, которым я могу думать о стратифицированных пакетах,-это иметь набор данных положительного класса, набор данных отрицательного класса и генерировать пакеты, беря соответствующее количество образцов из каждого набора данных и «вручную» создавая пакет (и даже это страдает от того, что в конечном итоге в одном из наборов данных закончатся образцы раньше другого, в зависимости от точного соотношения положительного/отрицательного и размера пакета). Короче говоря, не беспокойтесь о стратифицированных пакетах, просто убедитесь, что вы перетасовали свой набор данных и тренируетесь достаточно долго.