Вопрос или проблема
В настоящее время у меня есть набор данных с 21392 образцами, из которых 16948 относятся к мажоритарному классу (класс A), а оставшиеся 4444 – к миноритарному классу (класс B). В настоящее время я использую SMOTE (Метод синтетического увеличения миноритарных классов) для генерации синтетических данных, но не уверен, какой процент синтетических образцов следует генерировать, чтобы обеспечить хорошую классификационную производительность моделей машинного/глубокого обучения.
У меня есть несколько вариантов на уме: 1. Первый вариант – сгенерировать 21392 новых образца, из которых 16904 будут основными образцами класса A, а оставшиеся 4488 – миноритарными образцами класса B. Затем объединить оригинальные и синтетически сгенерированные новые образцы. Однако я считаю, что ключевой недостаток этого подхода заключается в том, что процент миноритарных образцов в моем общем наборе данных (оригинальные + новые) останется более-менее прежним, что, по моему мнению, противоречит цели увеличения миноритарных образцов. 2. Второй вариант – сгенерировать 21392 новых образца, из которых 16904 будут основными и 4488 – миноритарными образцами. Затем объединить только оригинальные данные с новыми сгенерированными миноритарными образцами. Таким образом, процент миноритарных (класс B) образцов в моих общих данных увеличится (с 4444/21392 = 20.774 %
до (4444+4488)/(21392+4488) = 34.513 %
. Я считаю, что это и есть цель SMOTE (увеличить количество миноритарных образцов и уменьшить дисбаланс в общем наборе данных).
Я довольно нов в использовании SMOTE и буду очень признателен за любые предложения/комментарии о том, какой из этих 2 вариантов вы считаете лучшим, или о любом другом варианте, который я мог бы рассмотреть.
Прежде всего, вам нужно разделить ваш набор данных на обучающую и тестовую выборки, прежде чем выполнять какое-либо увеличение/уменьшение выборки. Если вы примените любую стратегию на основе ваших подходов, а затем разделите данные, вы создадите предвзятость в вашей модели, и это неправильно, так как вы вводите точки в вашу будущую тестовую выборку, которых не существует, и ваши оценки производительности будут неточными.
После разделения ваших данных вы будете использовать только SMOTE на обучающем наборе. Если вы используете SMOTE из imblearn, он автоматически сбалансирует классы для вас. Кроме того, вы можете использовать некоторые параметры, чтобы изменить это, если не хотите идеального баланса, или попробовать различные стратегии.
Таким образом, у вас будет что-то вроде этого:
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
X_train, X_test, y_train, y_test = train_test_split(X, y, split_size=0.3)
X_resample, y_resampled = SMOTE().fit_resample(X_train, y_train)
Затем вы продолжаете обучать вашу модель на X_resample
, y_resample
. В данном случае X
– это ваша матрица признаков, а y
– ваши целевые метки.
Ответ или решение
Прежде всего, важно отметить, что использование SMOTE (Synthetic Minority Over-sampling Technique) для генерации синтетических данных может значительно улучшить производительность моделей машинного и глубокого обучения на несбалансированных данных. Однако прежде чем применять SMOTE, необходимо правильно разделить ваши данные на обучающую и тестовую выборки.
-
Разделение на обучающую и тестовую выборки:
Очень важно сделать это до применения SMOTE. Если вы сначала добавите синтетические образцы, а затем разделите набор данных, это может привести к утечке информации в тестовую выборку, что снизит точность оценки модели.Пример кода для разделения данных:
from sklearn.model_selection import train_test_split # Замените X и y соответственно вашими признаками и метками X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
-
Применение SMOTE только к обучающей выборке:
После того как вы разделили данные, вы можете применять SMOTE только к обучающей выборке для увеличения количествo образцов меньшинства. Это гарантирует, что ваша модель не будет смущена синтетическими образцами во время тестирования.Пример кода для применения SMOTE:
from imblearn.over_sampling import SMOTE smote = SMOTE() # Вы можете указать параметры для настройки баланса классов X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
-
Выбор объема синтетически созданных образцов:
Теперь перейдем к вопросу о том, сколько синтетических образцов необходимо создавать. Ваша вторая опция, где вы генерируете только синтетические образцы для меньшинства и объединяете их с существующими образцами меньшинства, кажется более подходящей. Это позволит увеличить пропорцию меньшинства (класса B) в вашем наборе данных, тем самым улучшая баланс классов и способствуя лучшей общей производительности ваших моделей. -
Параметры SMOTE:
SMOTE имеет несколько параметров, которые можно использовать для дальнейшей настройки. Например, вы можете указать, сколько новых образцов вы хотите создать относительно меньшинства, используя параметрsampling_strategy
. Вы также можете рассмотреть возможность использования других методов, таких как ADASYN, который адаптируется к плотности распределения данных. -
Оценка модели:
После того как вы объединили ваши синтетические образцы и обучили модель, вы можете оценить эффективность с использованием метрик, таких как точность, полнота, F1-мера и AUC-ROC. Это поможет вам понять, как ваши синтетические образцы повлияли на производительность модели.
В итоге, для достижения хорошей классификации вам следует сконцентрироваться на разумном увеличении пропорции образцов меньшинства в обучающем наборе данных, при этом избегая утечки данных в тестовой выборке. Всегда помните о важности оценки производительности модели на тестовом наборе, который не содержит синтетических данных, чтобы получить адекватное представление о ее способности к обобщению.