Урок 6. Очистка и модификация данных, работа с пропусками, целевая переменная

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

1. Очистка датасета: удаления и переименования

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

  • Удаление дубликатов строк: Полные дубли строк возникают из-за технических сбоев парсинга или агрегации. Они искусственно завышают плотность определенных точек данных. Мы избавляемся от них методом dataset.drop_duplicates() (в нашем случае было удалено около 80 идентичных записей).
  • Удаление нерелевантных признаков: Мы целенаправленно исключаем столбцы, которые не влияют на цену аренды или перегружают модель: 'ID объявления', 'Тип' (почти везде дублирует категорию квартиры), 'Адрес' (основная географическая привязка уже заложена в близости к станциям метро) и 'Телефоны'.
  • Переименование колонок: Для удобства написания кода длинные названия признаков приводятся к лаконичному виду с помощью метода dataset.rename(columns={'Количество комнат' : 'Комнат', 'Площадь...': 'Площадь'}).

2. Модификация признаков и исправление типов данных

При выгрузке данных числовые показатели часто сохраняются в смешанном текстовом формате. Яркий пример — признак «Комнат». Вместо простых чисел на входе мы имеем записи вида: «1», «2», «2, изолированные», «3, смежные».

Алгоритм обработки признака «Комнат»:

  1. Мы берем только первый символ текстовой строки, содержащий цифру: dataset['Комнат'].astype(str).str[0], и конвертируем его в числовой формат с помощью pd.to_numeric().
  2. Техническое ограничение Pandas/NumPy: после конвертации целые числа неожиданно могут отображаться как дробные (например, 1.00 вместо 1). Это происходит из-за наличия пропусков (NaN). Стандартные целочисленные типы (int64) в NumPy не умеют хранить пустое значение NaN. Если в столбце есть хоть один пропуск, Pandas приводит весь столбец к типу float.
  3. Обработка студий: в базе есть 145 квартир без указания комнат. В контексте ЦИАН — это студии. Чтобы не терять данные, мы создаем новый бинарный признак dataset['Студия'] = np.where(pd.isna(dataset['Комнат']), 1, 0), а исходный пропуск в столбце комнат заменяем единицей. Теперь, когда пропусков в столбце «Комнат» не осталось, мы можем преобразовать его к чистому целочисленному типу: .astype(int).

3. Сложная обработка текстовых полей с помощью регулярных выражений

Признак «Площадь» в исходном виде хранит информацию в виде сложных конструкций: «41.5/20.0/10.0» (общая/жилая/кухня). Нам для обучения модели необходим единый числовой показатель общей площади.

Чтобы извлечь нужное значение, мы пишем кастомную Python-функцию, использующую регулярные выражения (библиотека re):

def area(row):
    return re.search(r'([0-9]+)’, row[‘Площадь’]).group(1)

С помощью метода apply(area, axis=1) мы построчно применяем эту логику ко всему датасету, извлекая первую встреченную группу цифр (общую площадь) и приводя столбец к целому числу.

4. Обработка пропущенных значений (Missing Values)

Пропущенные значения (NaN) — это «дыры» в выборке. Большинство моделей машинного обучения не умеют работать с ними напрямую. Подход к работе с пропусками зависит от природы их появления:

Тип пропусков Описание Стратегия обработки
MCAR (Completely at Random) Пропуски абсолютно случайны (например, технический сбой). Удаление строк (если пропусков < 5%) или импутация средним/медианой.
MAR (at Random) Пропуск зависит от других известных признаков (например, мужчины реже заполняют опросники). Заполнение с использованием взаимосвязей (например, k-NN Imputer или MICE).
MNAR (Not at Random) Пропуск зависит от самого скрытого значения (например, люди с высокими доходами их скрывают). Сложный случай, требующий экспертных оценок, добавления бинарных признаков-индикаторов пропусков.

Методы заполнения (Imputation):

  • Заполнение константой: метод fillna('Unknown') или fillna(0). Применяется в основном для категорий, сохраняя объем данных.
  • Заполнение средним, медианой или модой:
    • mean() (среднее) используется для числовых признаков с симметричным распределением без сильных выбросов.
    • median() (медиана) — стандартный выбор для числовых шкал, содержащих выраженные выбросы (медиана к ним устойчива).
    • mode() (мода) — для категориальных признаков.
  • Продвинутые методы: использование алгоритмов машинного обучения, таких как KNNImputer (поиск аналогичных объектов по методу k-ближайших соседей) или IterativeImputer (MICE-моделирование).

5. Предобработка и трансформация целевой переменной («Цена»)

Целевая переменная (наш «учитель») требует особого контроля. Ошибки на этапе ее подготовки сделают модель неработоспособной.

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

Проблема скошенности распределения

В задачах регрессии (особенно при оценке цен, доходов, населения) распределение целевой переменной практически всегда имеет правую (положительную) скошенность (right-skewed distribution). Это означает, что большинство объектов сосредоточено в низком и среднем ценовом сегменте, но присутствует длинный «хвост» из экстремально дорогих элитных вариантов (выбросов).

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

Решение: Логарифмическая трансформация

Стандартным математическим решением этой проблемы является логарифмирование целевой переменной: \(y_{\text{transformed}} = \log(y)\). Применение логарифма «сжимает» длинный правый хвост распределения, приближая его форму к симметричному нормальному распределению. Это стабилизирует работу модели и повышает итоговую точность прогнозирования.

План занятия

  1. Очистка датасета: удаление дубликатов и нерелевантных признаков
    • Поиск и удаление полных дубликатов строк с помощью drop_duplicates().
    • Исключение колонок, не влияющих на целевую переменную или перегружающих модель (ID объявления, тип квартиры, адрес, телефоны, описание, дополнительно) через drop().
  2. Переименование и модификация признаков
    • Использование метода rename() для приведения имен колонок к удобному лаконичному виду.
    • Извлечение числовых значений количества комнат из смешанных строк (например, «2, изолированные» → 2).
    • Проблема типов данных: почему наличие пропущенных значений (NaN) преобразует целочисленные столбцы к типу float. Ограничения библиотеки NumPy.
    • Проектирование логики обработки студий: создание бинарного признака «Студия» и замена пустых значений в комнатах на 1.
  3. Сложные преобразования признаков с помощью регулярных выражений и функций
    • Извлечение общей площади из неструктурированных строк с помощью регулярных выражений (библиотека re).
    • Использование метода apply() для построчного применения кастомных Python-функций к DataFrame (параметр axis=1).
  4. Классификация и обработка пропущенных значений (Missing Values)
    • Основные типы пропусков в данных: MCAR (полностью случайные), MAR (случайные, зависимые от других признаков) и MNAR (неслучайные).
    • Методы удаления (Deletion): построчное удаление (dropna()) и удаление столбцов целиком при критическом количестве пропусков.
    • Методы заполнения (Imputation): заполнение константой, средним значением, медианой или модой.
    • Продвинутые подходы: заполнение на основе k-ближайших соседей (KNNImputer) или итерационных моделей (MICE / IterativeImputer).
    • Совет «профи»: создание бинарных индикаторов пропусков (was_missing) как ценного признака для алгоритма.
  5. Очистка и трансформация целевой переменной («Цена»)
    • Очистка текстового представления цены: извлечение числовых значений и парсинг текста.
    • Анализ распределения целевой переменной: выявление и математическое описание проблемы правой (положительной) скошенности.
    • Логарифмическая трансформация: применение функции \(\log(y)\) для стабилизации градиентного спуска и повышения качества работы линейных моделей.

Не уходите просто так – не упустите возможность только здесь и сейчас получить скиду!

Индивидуальная консультация по Яндекс Директу или Google Ads со скидкой

25%

"*"обозначает обязательные поля

Это поле используется для проверочных целей, его следует оставить без изменений.