В машинном обучении обработка несбалансированных наборов данных является распространенной проблемой. Одним из эффективных подходов к решению этой проблемы является использование весов классов. Веса классов присваивают более высокие веса недостаточно представленным классам, что позволяет модели придавать им большую важность во время обучения. В этой статье вы познакомитесь с различными методами расчета и применения весов классов при использовании Keras ImageDataGenerator. Итак, приступим!
Метод 1: расчет вручную
Один из способов получить веса классов — рассчитать их вручную на основе распределения классов в наборе данных. Вот пример фрагмента кода, иллюстрирующий этот метод:
import numpy as np
from sklearn.utils import class_weight
# Load your dataset
# ...
# Get class labels
labels = np.argmax(y_train, axis=1)
# Calculate class weights
class_weights = class_weight.compute_class_weight('balanced', np.unique(labels), labels)
# Convert class weights to dictionary
class_weights_dict = dict(enumerate(class_weights))
Метод 2: использование Keras ImageDataGenerator
ImageDataGenerator предоставляет удобный способ автоматического вычисления весов классов. Вот пример фрагмента кода:
from keras.preprocessing.image import ImageDataGenerator
# Create an instance of ImageDataGenerator
datagen = ImageDataGenerator()
# Flow from directory
generator = datagen.flow_from_directory(
directory='path_to_directory',
target_size=(224, 224),
class_mode='categorical',
batch_size=32
)
# Calculate class weights
class_weights = datagen.compute_class_weight(generator.class_indices, generator.classes)
# Convert class weights to dictionary
class_weights_dict = dict(enumerate(class_weights))
Метод 3: обработка больших несбалансированных наборов данных
Для больших несбалансированных наборов данных вычисление весов классов вручную или использование ImageDataGenerator может оказаться невозможным из-за ограничений памяти. В таких случаях вы можете рассмотреть возможность использования специализированных библиотек, таких как «imbalanced-learn», для вычисления весов классов. Вот пример фрагмента кода:
from imblearn import over_sampling
from collections import Counter
# Load your dataset
# ...
# Get class labels
labels = np.argmax(y_train, axis=1)
# Compute class weights using imbalanced-learn
class_weights = over_sampling.RandomOverSampler().fit_resample(X_train, labels)
class_weights = dict(Counter(class_weights[1]))
# Normalize class weights
total_samples = sum(class_weights.values())
for key in class_weights.keys():
class_weights[key] = total_samples / class_weights[key]
В этой статье мы рассмотрели несколько методов получения весов классов при использовании Keras ImageDataGenerator. Мы рассмотрели расчеты вручную с использованием встроенной функции ImageDataGenerator и обработку больших несбалансированных наборов данных с помощью внешних библиотек. Применяя соответствующие веса классов, вы можете улучшить процесс обучения и повысить производительность ваших моделей на несбалансированных наборах данных.