Работа с несбалансированными наборами данных довольно распространена в определенных отраслях и имеет свою специфику. В этой статье я хотел поделиться с вами одним из методов, которые я использовал для решения этой проблемы в своем самом первом проекте машинного обучения, а также некоторыми мыслями, которые этот проект вдохновил меня на вопрос о создании синтетических данных.

Что такое несбалансированный набор данных?

Несбалансированные наборы данных, часто встречающиеся в задачах классификации, представляют собой наборы данных, которые содержат подавляющее большинство одного класса для целевого объекта. Они довольно распространены в таких областях, как медицинская диагностика и обнаружение мошенничества, где данные об отрицательных случаях (отсутствие заболевания или какое-либо мошенничество) преобладают над положительными случаями.

Чтобы быть более конкретным, предположим, что у вас есть набор данных о пациентах с определенным заболеванием, и вы хотите предсказать, будет ли у пациента диагностировано это заболевание. В большинстве случаев у вас будет больше данных о той части населения, у которой не диагностировано это заболевание.

В моем случае у меня действительно было гораздо больше людей, не перенесших инсульта, чем людей, перенесших нарушение мозгового кровообращения. Соотношение составило более 95% для отрицательного класса.

Почему это проблема?

Проблема с несбалансированными наборами данных заключается в том, что методы машинного обучения часто игнорируют класс меньшинства на этапе обучения, что приводит к неправильной работе. Например, некоторые классификаторы, такие как логистическая регрессия и дерево решений, будут склонны предсказывать только класс большинства, когда класс меньшинства рассматривается как шум.

В моем случае метрики до любой выборки показывают точность 96% для логистической регрессии, но мы видим, что оценка F1 для класса 1 равна 0.

from sklearn.linear_model import LogisticRegression

lr=LogisticRegression(random_state=42)

lr.fit(X_train, y_train)
y_pred_lr=lr.predict(X_test)

print(classification_report(y_test,y_pred_lr))

При несбалансированном наборе данных точность не является метрикой, которую мы можем принять во внимание, поскольку она основана на большей части цели. Определенный для подавляющего большинства из 95 % людей класса 0 (то есть людей, не перенесших инсульта), алгоритм машинного обучения может просто классифицировать все в классе 0 и по-прежнему быть правильным в 95 % случаев. время. Другими словами, эта модель очень точно предсказывает, когда у человека не будет инсульта, что абсолютно бесполезно…

Каковы решения?

Один из популярных методов заключается в создании синтетических данных с использованием метода повторной выборки.

Синтетические данные — это данные, созданные искусственно с помощью компьютерной программы, а не собранные.

При использовании метода повторной выборки, называемого избыточной выборкой, данные генерируются на основе уже собранных данных. В случае несбалансированного набора данных генеративная модель будет основана на классе меньшинства.

В python imbalanced-learn — это пакет, который позволяет использовать этот метод повторной выборки и совместим с обучением scikit.

Подход, который я использовал, заключался в избыточной выборке класса меньшинства с помощью техники SMOTE.

from imblearn.over_sampling import SMOTE
sm = SMOTE()

X_oversampled, y_oversampled = sm.fit_resample(X, y)

Как это работает?

SMOTE расшифровывается как Техника передискретизации синтетического меньшинства.

По сути, этот метод будет генерировать синтетические данные с помощью метода ближнего соседа. Алгоритм будет вычислять k ближайших соседей для одной заданной точки, чтобы он мог создать все искусственные точки данных для класса меньшинства и достичь того же уровня, что и класс большинства.

Это результат набора данных после повторной выборки.

Этот метод позволил мне провести эффективную тренировку и получить правильный результат.

Несмотря на то, что это было всего лишь упражнение на основе общедоступного набора данных, и я использовал только библиотеки и пакеты на небольшом наборе данных, мне было интересно коснуться переломного момента этой техники и посмотреть, как алгоритмы машинного обучения может работать в этом случае.

Этот опыт также дал мне возможность еще раз подумать о возможности создания такого рода «фальшивых» данных.

Мои вопросы о генерации синтетических данных

Синтетические данные демонстрируют свою полезность, когда существует внутреннее ограничение набора данных, например, в случаях несбалансированного набора данных или когда данные не существуют или недоступны. Данные необходимы в каждой отрасли, но они могут быть дорогостоящими и иногда труднодоступными из-за доступности или конфиденциальности (например, в здравоохранении) или даже невозможными в случае новых технологий (самоуправляемые автомобили). Именно здесь синтетические данные могут сыграть интересную роль.

Несмотря на то, что это удивительно и полезно, возможность генерировать данные с помощью нескольких строк кода заставила меня задуматься о ее ограничениях, а также о некоторых этических последствиях.

Поскольку эти синтетические данные получены из первичного источника данных, первое ограничение, которое приходит мне на ум, связано с источником данных, из которого создаются синтетические данные. Что, если этот источник предвзят? А как насчет предубеждений ученого?

Это общие вопросы о предвзятости в данных, но мне кажется, что они имеют еще большее влияние, если эти предубеждения воспроизводятся во вновь сгенерированном наборе данных.

Другой вопрос, который у меня есть, касается качества самих синтетических данных. Для меня синтетические данные могут только имитировать реальный мир, они не являются реальным миром.

Например, мы можем думать о выбросах. В реальном мире данные довольно зашумлены — и это то, что на самом деле может отличить мошеннические данные от реальных данных при поиске манипуляций с данными в исследовательских работах… Могут ли эти синтетические данные отражать этот шум?

В исследовании 2016 года исследователи Массачусетского технологического института смогли создать систему, которая может автоматически генерировать синтетические данные, дающие те же результаты, что и реальные данные, говоря статистически. Другими словами, они смогли внести некоторый шум в сгенерированные данные. Это был довольно большой прогресс.

Тем не менее, я все еще задаюсь вопросом о неожиданном. Некоторые из величайших инноваций происходят в результате наблюдения за неожиданным явлением, и мне интересно, смогут ли эти синтетические данные смоделировать непредсказуемое…

В конечном счете, я думаю, что возможность производить данные — это невероятное достижение для искусственного интеллекта и машинного обучения, но кажется, что, как и в случае со многими новыми революционными технологиями, необходимо быть осторожным и использовать их осознанно.

Раскрытие информации: я впервые занимаюсь машинным обучением и сталкиваюсь с этой проблемой. У меня, конечно, нет полной картины; это лишь некоторые предварительные мысли, которые у меня возникли при работе над этим проектом. Так что, если у вас есть какие-либо мысли по этому поводу, пожалуйста, не стесняйтесь поделиться, я всегда с нетерпением жду возможности узнать больше.

Вы можете найти полную версию моего Блокнота Jupyter для проекта прогнозирования инсульта в моем репозитории аналитики данных здесь.

Эта статья изначально была опубликована здесь.