Машинное обучение

Подготовка и очистка данных

2018. Amazon закрыла ML-систему найма - она дискриминировала женщин. Модель обучалась на 10 годах исторических данных, которые отражали гендерный перекос в индустрии. Garbage In - Garbage Out в масштабе корпорации. Инженеры в Google, Netflix и Uber сходятся в одном: 80% работы в ML - не модели и алгоритмы, а подготовка данных. И если этот этап сделан плохо, никакая архитектура не спасёт.

  • **Kaggle-соревнования:** большинство побед определяется не выбором модели, а качеством feature engineering и предобработки данных. Участники тратят 70-80% времени именно на очистку и трансформацию
  • **Amazon:** в 2018 году отказалась от ML-системы найма, потому что модель была обучена на данных с гендерным перекосом - data leakage из предвзятых данных создал дискриминирующую модель
  • **Медицина:** исследователи обнаружили, что модель для диагностики пневмонии определяла тип рентген-аппарата (в больницах с тяжёлыми пациентами стояло другое оборудование) - пример ложных корреляций в грязных данных

Tukey и рождение exploratory data analysis

В 1977 году статистик Джон Тьюки опубликовал 'Exploratory Data Analysis' - книгу, которая изменила подход к работе с данными. До Тьюки статистика была confirmatory: строили модель, проверяли гипотезы. Тьюки предложил сначала исследовать данные визуально: boxplots (ящик с усами), stem-and-leaf plots, 5-number summary. Boxplot напрямую используется для детекции выбросов через IQR - именно этот метод применяется в подготовке данных для ML сегодня.

Предварительные знания

  • What Is Machine Learning

Очистка данных: пропуски и выбросы

**2018. Amazon закрыла свой ML-сервис найма персонала** - система дискриминировала женщин. Причина: 10 лет исторических данных найма отражали гендерный перекос в индустрии. Garbage In - Garbage Out: модель выучила не «кто хороший кандидат», а «кто исторически нанимался». В индустрии есть негласное правило: **80% времени ML-инженера уходит на подготовку данных**, и только 20% - на построение моделей.

**Три типа пропущенных значений:** - **MCAR** (Missing Completely At Random) - пропуск случаен, не зависит ни от чего. Пример: сбой сети при передаче данных - **MAR** (Missing At Random) - пропуск зависит от других признаков. Пример: молодые люди чаще не указывают доход - **MNAR** (Missing Not At Random) - пропуск зависит от самого значения. Пример: люди с высоким доходом скрывают его Тип пропуска определяет стратегию заполнения. MCAR можно удалять, MAR лучше заполнять, MNAR - самый сложный случай.

**Не удалять данные бездумно!** Прежде чем удалить строку или заменить значение, задать вопросы: 1. Почему это значение пропущено? Может, сам пропуск несёт информацию 2. Это действительно выброс или редкое, но реальное событие? Квартира за 50 млн в центре Москвы - не ошибка 3. Сколько данных останется после очистки? Если удалить все строки с пропусками - может остаться 10% датасета

Датасет содержит 10000 строк. Признак "доход" пропущен у 40% записей. Какая стратегия наиболее разумна?

Нормализация и стандартизация

После очистки данных остаётся вторая проблема: признаки живут в **совершенно разных масштабах**. Возраст человека - от 0 до 100, зарплата - от 0 до 1 000 000, рост - от 150 до 200. Многие алгоритмы ML (линейная регрессия, SVM, нейросети, k-NN) используют **расстояние** между точками. Если один признак в 10 000 раз больше другого - он полностью задавит остальные. Модель будет думать, что зарплата важнее всего, просто потому что числа больше.

**Когда что использовать:** - **MinMaxScaler** [0, 1] - нейронные сети (активации работают в [0,1]), алгоритмы, чувствительные к диапазону - **StandardScaler** (z-score) - SVM, линейная регрессия, PCA, k-means (предполагают нормальное распределение) - **Не нужно нормализовать** - деревья решений, Random Forest, XGBoost, LightGBM. Они разбивают данные по порогам, а не считают расстояния

**Частая ошибка:** вызывать `fit_transform()` и на обучающих, и на тестовых данных. Скейлер должен «запомнить» параметры (mean, std, min, max) **только по обучающей выборке**. Тестовые данные трансформируются теми же параметрами через `transform()`. Иначе информация из теста утечёт в обучение (data leakage), и метрики будут завышены.

Обучается модель k-NN для предсказания цены квартиры. Признаки: площадь (30-200 кв.м) и расстояние до метро (100-15000 м). Что произойдёт без нормализации?

Кодирование категориальных признаков

ML-алгоритмы работают с числами, а не со словами. Но в реальных данных полно категориальных (текстовых) признаков: город, цвет, тип автомобиля, профессия. Нельзя просто подать строку "Москва" в нейросеть - нужно превратить её в число или вектор чисел. Выбор метода кодирования **напрямую влияет на качество модели**, потому что разные кодировки несут разную информацию.

**Правило выбора кодирования:** 1. Признак с **естественным порядком** (размер, уровень, рейтинг) - Ordinal Encoding 2. Признак **без порядка, мало категорий** (до 10-15: цвет, пол, тип) - One-Hot Encoding 3. Признак **без порядка, много категорий** (город из 1000, профессия из 500) - Target Encoding или Embedding 4. **Tree-based модели** (XGBoost, LightGBM, CatBoost) - Label Encoding работает нормально, CatBoost обрабатывает категории нативно

Обучается линейная регрессия. Признак "район" принимает 5 значений: Центр, Север, Юг, Восток, Запад. Какое кодирование выбрать?

Разделение данных: train/validation/test

Данные почищены, признаки нормализованы, категории закодированы. Теперь последний - и самый коварный - этап: **разделить данные на части**. Это как подготовка к экзамену: если учить по тем же билетам, которые будут на экзамене, - покажут 100% результат, но знаний не прибавится. ML-модель точно так же: если проверять её на тех же данных, на которых она обучалась, - метрики будут прекрасными, но в продакшене модель провалится.

**Data leakage: самая опасная ошибка в ML.** Preprocessing (нормализация, encoding, заполнение пропусков) нужно делать **после** разделения на train/test, а не до. Если вычислить mean для заполнения пропусков по всем данным, включая test, - информация из теста утекла в обучение. Правильный порядок: разделить -> fit на train -> transform на val/test.

Можно разделить данные на train и test, а preprocessing делать до разделения - модель всё равно не видит правильные ответы из теста

Preprocessing ПОСЛЕ разделения: fit() только на train, transform() на test. Даже нормализация и заполнение пропусков средним могут вызвать data leakage, если параметры вычислены по всему датасету

Data leakage происходит не только через целевую переменную (y), но и через статистики признаков (X). Если mean и std для нормализации вычислены с учётом тестовых данных - модель косвенно «знает» о распределении теста. Результат: метрики на тесте завышены на 1-5%, а в продакшене модель работает хуже ожидаемого

Нормализованы ВСЕ данные StandardScaler-ом, а затем разделены на train и test. Чем это грозит?

Ключевые идеи

  • **Очистка данных:** пропуски (fillna, KNN Imputer), выбросы (IQR, z-score), дубликаты - 80% работы ML-инженера, и от качества очистки зависит результат больше, чем от выбора алгоритма
  • **Нормализация:** MinMaxScaler [0,1] для нейросетей, StandardScaler (z-score) для линейных моделей - без неё признаки с большим масштабом задавят остальные
  • **Кодирование категорий:** One-Hot для признаков без порядка (цвет, город), Ordinal для упорядоченных (размер, уровень), Label Encoding для tree-based моделей
  • **Train/Val/Test split:** preprocessing ПОСЛЕ разделения, fit только на train - иначе data leakage завысит метрики, а в продакшене модель покажет совсем другие результаты

Связанные темы

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

  • Типы машинного обучения — Кодирование и масштабирование зависят от задачи: обучению с учителем нужен чистый столбец меток, а кластеризация чувствительна к масштабу признаков
  • Оценка моделей — Утечка данных на этапе препроцессинга завышает метрики; обучение скейлеров и импьютеров только на train-части и делает оценку честной
  • Линейная регрессия — Моделям на основе коэффициентов нужны стандартизованные признаки, чтобы ни один признак не доминировал из-за своих единиц измерения
  • Конструирование признаков — Очистка и кодирование - точка входа; feature engineering строится на чистых данных и создаёт сигналы, на которых модель действительно учится

Вопросы для размышления

  • Заполнены пропуски в признаке «доход» медианой. Но если пропуски не случайны (люди с высоким доходом чаще скрывают его), как это исказит модель? Какие альтернативные стратегии могут помочь?
  • Почему data leakage так сложно обнаружить? Модель показывает отличные метрики на тесте - всё выглядит прекрасно. Как проверить, нет ли утечки?
  • В реальном продакшене данные приходят непрерывно и их распределение может меняться со временем (concept drift). Как это влияет на параметры нормализации, вычисленные год назад?

Связанные уроки

  • ml-01-intro
  • ml-05-evaluation
  • ml-03-math-foundations
  • ml-06-linear-regression
  • ml-42-feature-engineering
  • stat-31-eda
Подготовка и очистка данных

0

1

Войти