Руководство для начинающих по созданию высококачественных наборов данных для машинного обучения
Практическое руководство для начинающих создание высококачественных наборов данных для машинного обучения
Инструменты и техники для очистки данных, визуализации, аугментации и генерации синтетических данных
Умные данные против больших данных. Это посыл “Data-Centric AI”.
Более чем просто “предобработка” данных, ученые-данные должны вести непрерывную и систематическую практику понимания и улучшения своих наборов данных.
Это в конечном итоге переведет наше внимание от слепого преследования более высоких результатов классификации путем применения всё более сложных алгоритмов к проблеме к глубокому пониманию того, почему результаты классификации такие, какие они есть, что является действительным источником сложности проблемы, и как мы можем адаптировать данные, чтобы классификаторы могли лучше учиться проблеме, таким образом повышая их производительность.
Если вы новичок в машинном обучении, это может показаться немного пугающим: “Но каковы лучшие практики создания качественных наборов данных и как их реализовать?”
- Раскрытие сути зависимости и ее важность в причинно-следственной связи и причинно-следственной проверке
- Создание анимации градиентного спуска на Python
- Ускорьте Python посредством кэширования функций Мемоизация
В этом руководстве мы рассмотрим простой случай использования парадигмы “Data-Centric AI” для достижения качественных данных и улучшения результатов классификации машинного обучения.
Следуя принципу “Data-Centric AI”, — всё дело в данных, — мы никогда не будем углубляться в саму модель (честно говоря, это будет простое дерево принятия решений).
Мы используем Набор данных о диабете индейцев Пима, который бесплатно доступен на Kaggle (Лицензия: CC0: Общественное достояние). Вы также можете найти весь код и дополнительные материалы на GitHub сообщества Data-Centric AI.
Начнем?
Шаг 1: Выполнение профилирования данных для понимания данных
Прежде чем мы начнем курировать наш набор данных, нам необходимо понять проблему, которую мы пытаемся решить, и особенности данных, с которыми мы работаем. Тщательное понимание характеристик наших данных, сложности проблемы и области использования случаев является одним из первых принципов Data-Centric AI.
Это поможет нам определить следующие шаги для продвижения по нашей машинной обучению.
Когда речь идет о профилировании данных, существует несколько интересных инструментов с открытым исходным кодом, с которыми вы можете ознакомиться: я провел обзор нескольких самостоятельно, включая ydata-profiling
, dataprep
, sweetviz
, autoviz
и lux
.
Я в основном использую ydata-profiling: нахожу его отличным инструментом для практиков данных, который вместо заставления нас прыгать через препятствия pandas для получения наибольшей надежности наших данных и визуализаций позволяет сделать всё это всего за несколько строк кода.
Сначала вам нужно установить ydata-profiling (лучше использовать виртуальное окружение для этого — если вы не знаете, как это сделать, вы можете посмотреть это 2-минутное видео, или этот полный учебник, если вы никогда не работали в среде conda раньше):
Затем мы можем получить полное представление данных, сохраняя отчет в формате .html
со всеми характеристиками и визуализациями, необходимыми для начала работы:
Данный отчет сразу же предоставляет нам общую информацию о характеристиках наших данных и выделяет некоторые предупреждения, которые мы должны учесть:

Набор данных содержит 768 наблюдений и 9 переменных/характеристик. 8 из них числовые, 1 определена как категориальная (Outcome
представляет нашу цель). Нет дублирующих строк и, кажется, нет пропущенных значений. Наконец, среди характеристик обнаружено несколько предупреждений о Высокой Корреляции
. Более того, некоторые характеристики содержат большое количество Нулей
.
Теперь пришло время играть в детектива данных. Высокая Корреляция
достаточно ожидаема для биологических характеристик, но что насчет этих Нулевых
значений?
Изучая некоторые отмеченные характеристики (например, BMI
), мы видим, что эти значения значительно отличаются от общего распределения. И, опираясь на областные знания, эти значения “0” на самом деле не имеют смысла: значение 0 допустимо для Положительных Беременностей
, но для ИМТ, глюкозы, инсулина, артериального давления или толщины кожи оно является недействительным.

Мы быстро понимаем, что эти нули обозначают: отсутствующие данные.
Пока что мы поправим эту проблему, но тщательный процесс EDA может открывать гораздо больше. Посмотрите этот Важный руководство по Исследовательскому Анализу Данных, чтобы узнать, что еще вы можете обнаружить в ваших данных.
Шаг 2: Исследование проблем качества данных
Теперь, когда мы обнаружили, что некоторые столбцы имеют недопустимые нулевые значения, мы можем начать работу с пропущенными данными в нашем наборе данных.
Множество моделей машинного обучения и оценщиков scikit-learn не поддерживают пропущенные значения изначально, поэтому нам нужно как-то обработать эти значения NaN перед передачей нашего набора данных оценщику.
Сначала отметим эти значения 0 в качестве NaN значений:
Теперь мы можем использовать заполнение данных для замены NaN наблюдений правдоподобными значениями.
Теорема “не бывает бесплатного обеда” говорит нам, что нет наилучшего решения для каждой ситуации – мы должны изучить, как различные решения влияют на сложность наших данных тренировки и определить, что наилучшим образом повышает эффективность нашей модели машинного обучения. Это фактически еще один принцип Центрического Подхода к Данным: постоянная итерация и совершенствование.
Пока что мы воспользуемся очень простым методом – SimpleImputer
– для замены нулевых значений средним значением каждой характеристики. Это очень наивный подход, который может вызвать нежелательные “пиковые” значения в наших распределениях, но цель просто показать, как выделить и заполнить отсутствующие данные. Более лучшие подходы мы можем попробовать позже:
Теперь мы можем попробовать очень простой классификатор на основе решающих деревьев и увидеть, какие будут результаты нашей классификации. Как сайд-нот, решающие деревья можно расширить для нативной поддержки пропущенных значений, используя замену суррогатами или другие методы. Действительно, в документации scikit-learn указано, что решающие деревья имеют встроенную поддержку пропущенных значений в некоторых условиях в текущей версии (1.3.2
). Однако, так как я использовал версию 1.2.2
, я столкнулся с этой ошибкой:
Тем не менее, даже если NaN-значения обрабатываются внутренне, обучение моделей на данных с пропусками – это не хорошая практика, так как это подрывает концепции, которые модель извлекает из беспорядочной и ограниченной информации.
Вот матрица путаницы:
Результаты классификации не очень хорошие. Имейте в виду, что мы используем простое дерево решений, но все же… есть существенная разница между прогнозами для наших целевых категорий. Почему классификатор работает лучше для класса “0”, чем для класса “1”?
Шаг 3: Увеличение недостаточно представленных классов
Если мы обратили внимание на Шаг 1 (возможно, вы уже обнаружили это), наш целевой класс Outcome
несбалансирован. Возможно, не настолько, чтобы вызвать предупреждение в настройках по умолчанию (порог по умолчанию – 0.5
), но всё же достаточно, чтобы классификатор был склонен к большинству, игнорируя меньшинство. Об этом свидетельствует визуализация данных, представленная в отчете о профилировании:

Обратите внимание, что хотя пропущенные данные могут быть вызваны различными ошибками во время сбора, передачи или хранения данных, несбалансированность классов может отражать естественную характеристику области: например, просто меньше пациентов, у которых диагностирован диабет, в этом медицинском центре.
Тем не менее, важно предпринять действия с обучающими данными, чтобы модель не упускала меньшинство случаев: на самом деле, это то, что мы пытаемся предсказать более точно.
Ложно положительный результат плох, так как это даст неверную информацию здоровому пациенту о наличии у него диабета. Но когда будут проведены дополнительные тесты, это будет всего лишь “паника”.
Однако в этом случае ложноотрицательный результат хуже. Мы будем сообщать пациенту с диабетом, что все в порядке, она остается недиагностированной, а болезнь прогрессирует.
Один из способов увеличить эти числа – использование техник дополнения данных. Дополнение данных – популярная техника среди практиков в области обработки данных для корректировки распределений набора данных – то есть соотношение между существующими классами или категориями данных – тем самым устраняя проблему несбалансированных данных.
И это только одно из множества интересных и полезных применений синтетических данных.
Хотя синтетические данные могут иметь несколько толкований – например, “фальшивые данные”, “фиктивные данные”, “симулированные данные” – здесь мы имеем в виду “на основе данных” генерацию синтетических данных.
В этом смысле синтетические данные создаются искусственно, но сохраняют характеристики реальных данных – их структуру, статистические свойства, зависимости и корреляции.
Существует множество методов и инструментов с открытым исходным кодом для генерации синтетических данных – ydata-synthetic
, sdv
, gretel-synthetics
, nbsynthetic
, and synthcity
– это лишь некоторые из них, с которыми я экспериментировал в прошлом.
И снова… “ничего не бывает бесплатного”: выбор наиболее подходящего метода неизбежно будет зависеть от цели, для которой необходимы синтетические данные.
Чтобы быстро понять, как синтетические данные могут быть использованы для увеличения, мы воспользуемся пакетом ydata-synthetic
и проведем эксперименты с их Гауссовыми смесями моделей.
Сначала нам нужно установить пакет:
И как только это сделано, создание синтетических данных становится очень простым:
После того, как у нас есть синтетические данные, мы можем просто выбрать подмножество новых сгенерированных образцов меньшего класса, сгенерированных сэмплированием из синтетических данных, и добавить его в обучающие данные для создания сбалансированного (т.е. 50%-50%) распределения:
Давайте посмотрим, как это повлияет на обучение нашего дерева решений и его последующие результаты:
И матрица путаницы:
Обратите внимание, как такая простая модификация нашего набора обучающих данных привела к улучшению показателя F-меры на 10% и значительному улучшению результатов чувствительности меньшего класса (с 53% до 73%).
Вот в чем красота парадигмы Data-Centric AI: без вмешательства в параметризацию нашей модели мы значительно улучшили качество нашего набора обучающих данных с помощью очень простых эвристик и стандартных методов – представьте, что мы могли бы сделать с более продвинутыми стратегиями и специализированными конвейерами подготовки данных!
Конечно, отзыв класса 0 немного пострадал, но в конечном итоге нам нужно, чтобы эта модель была более чувствительной, чем специфичной (т.е. лучше определяла положительный класс, чем отрицательный) из-за особых ограничений, с которыми мы сталкиваемся: диагностика заболевания – снова, еще один принцип Data-Centric AI: методы и результаты должны оцениваться на основе потребностей и ограничений области.
Итоги и дальнейшие направления
На протяжении этой статьи мы экспериментировали с парадигмой Data-Centric AI на основе очень практического случая.
Мы начали, как всегда, с понимания наших данных. Мы обнаружили, исследовали и решили особенные проблемы с качеством данных, такие как отсутствующие данные и улучшение наших обучающих данных с использованием синтетических данных для преодоления несбалансированности области. Конечно, для такого быстрого и простого исследования мы сосредоточились на простых эвристиках, чтобы выполнить поставленную задачу, но работа ученого по обработке данных никогда не заканчивается тут.
Как изменятся результаты, если мы рассмотрим другой метод импутации? Как можно было бы достичь лучшей подгонки в генерации синтетических данных? Следовало бы сбалансировать оба класса равномерно или возможно увеличить представительность меньшего класса еще больше? Могла ли помочь некоторая трансформация признаков или снижение размерности для классификации? Следовало ли удалить некоторые смешанные признаки?
Все эти вопросы кажутся невозможными в начале любого проекта машинного обучения. Но когда мы начинаем измерять и раскрывать источник сложности в каждом наборе данных, мы получаем лучшие представления о том, какие методы могут улучшить результаты классификации (своего рода «мета-обучение»). И, безусловно, данные нужно манипулировать и улучшать в соответствии как с характеристиками данных, так и с конечной целью проекта.
Производство заранее определенного конвейера и рассмотрение подготовки данных как единого решения, подходящего всем, похоже на полет в слепую. Вместо этого опытный ученый по данным постоянно играет роль детектива данных и пытается найти лучшие техники на основе подсказок, которые данные оставляют для нас. И обычно это происходит. Мы просто должны держать глаза открытыми!
Надеюсь, вам понравился урок, и как всегда, буду благодарен за отзывы, вопросы и предложения. Дайте мне знать, о каких других темах вы бы хотели, чтобы я написал в комментариях!
Хотите начать заниматься наукой о данных? Приходите и встретьтесь с нами в следующий четверг, 23 ноября!
Если вы еще не являетесь частью сообщества Data-Centric AI, вам стоит присоединиться. Мы – дружная группа энтузиастов данных, которые разделяют страсть к изучению науки о данных. Мы время от времени организуем некоторые очень крутые сеансы кодирования вместе с нами, и мы только начинаем некоторые крайне неформальные учебные группы.
Я буду вести следующий встречу 23 ноября, 2023, где я расскажу о некоторых концепциях исследовательского анализа данных .
Встретимся там?
Обо мне
Доктор наук, исследователь машинного обучения, преподаватель, сторонник анализа данных и в целом “мастер на все руки”. Здесь, на VoAGI, я пишу о Анализе данных, основанном на искусственном интеллекте и качестве данных, обучая сообщества специалистов по науке о данных и машинному обучению, как перейти от неполных данных к интеллектуальным.
Связи с разработчиками @ YData | Сообщество, основанное на анализе данных | GitHub | Google Ученый | LinkedIn