Нормализация данных: что это и зачем нужна

Нормализация данных: что это и зачем нужна
0
1

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

Что такое нормализация данных

Нормализация данных — это приведение данных к удобному и предсказуемому виду по заданным правилам. Значение термина зависит от задачи.

Где работают с даннымиЧто делают
В базе данныхРазносят сведения по связанным таблицам, чтобы сократить повторы
В машинном обученииПриводят числовые признаки к сопоставимому масштабу

Допустим, компания собирает статистику рекламных кампаний. Базе нужно правильно хранить названия кампаний, источники трафика, менеджеров и показатели. Модели нужны числа, на которых она сможет искать закономерности: расход, CTR, CPC, число лидов. Исходные данные одни, а нормализация решает две разные задачи.

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

Как нормализация работает в базе данных

Представим таблицу с ежедневной статистикой:

ДатаКампанияИсточникМенеджерПочтаРасходЛиды
01.11Осенний запускПоискАннаa@example.com60 00096
02.11Осенний запускПоискАннаa@example.com54 00083
02.11Осенний запускTelegramАннаa@example.com21 00031

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

После нормализации данные можно разделить так:

  • в таблице daily_stats хранить дату, расход, лиды и идентификаторы кампании и источника;
  • в campaigns — названия кампаний и ответственных менеджеров;
  • в sources — источники трафика;
  • в managers — имена и контакты менеджеров.

Таблицы связываются идентификаторами: например, campaign_id или manager_id. Почта Анны теперь хранится в одном месте. В ежедневной статистике остаются только показатели и ссылки на нужные записи.

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

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

Что такое 1НФ, 2НФ и 3НФ

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

Нормальная формаПростое объяснениеПример
1НФВ одной ячейке хранится одно значение, каждую строку можно отличить от остальныхИмя и почта менеджера находятся в разных полях
2НФОбычные столбцы зависят от всего составного ключаНазвание кампании выносят из статистики, потому что оно зависит только от campaign_id
3НФСведения об одном объекте не хранят среди данных другого объектаИмя и почту менеджера переносят в таблицу managers

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

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

Есть и более строгие формы — BCNF, 4НФ и 5НФ. В типовых задачах новичка они нужны реже. Сначала полезнее научиться замечать очевидные повторы и понимать, к какому объекту относится каждый столбец.

Как нормализовать таблицу

Возьмите одну большую таблицу и разберите её по шагам:

  1. Определите отдельные объекты: кампании, источники, менеджеры, статистика.
  2. Для каждого объекта создайте свою таблицу.
  3. Добавьте первичные ключи: campaign_id, source_id, manager_id.
  4. В таблице статистики замените повторяющиеся названия идентификаторами.
  5. Свяжите таблицы внешними ключами.
  6. Проверьте, где придётся менять данные, если кампания получит новое название или менеджер сменит почту.

Хороший контрольный вопрос: «Сколько строк нужно изменить, чтобы обновить один факт?» Если правильный ответ — одна, структура, скорее всего, выбрана удачно. Если править нужно десятки строк, в таблице остался повтор.

Само количество таблиц ничего не гарантирует. Базу можно разбить на десять частей и всё равно сохранить неудобные зависимости. Смотрите на смысл данных: один объект должен иметь одно понятное место хранения.

Когда таблицу оставляют широкой

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

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

Что означает нормализация в Data Science

В машинном обучении тем же словом часто называют масштабирование числовых признаков. Допустим, в датасете есть расход 90 000 рублей, CTR 1,9% и CPC 37 рублей. Для человека значения понятны, а алгоритм видит числа с очень разным диапазоном.

Это особенно важно для методов, которые считают расстояние между объектами, например kNN, а также для SVM, PCA и многих линейных моделей. Большой диапазон одного признака может заметно влиять на расчёты. После масштабирования расход, CTR и CPC становятся сопоставимее.

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

Нормализация и стандартизация: в чём разница

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

МетодЧто делаетКогда пригодится
MinMaxScalerПереносит значения в диапазон, обычно от 0 до 1Когда нужен фиксированный диапазон
StandardScalerДелает среднее близким к 0, а стандартное отклонение — к 1Частый стартовый вариант для линейных моделей, SVM, kNN и PCA
RobustScalerИспользует медиану и устойчивее реагирует на выбросыКогда встречаются отдельные очень большие или маленькие значения
NormalizerПриводит длину каждой строки-вектора к единицеДля текстовых векторов и сравнения объектов по направлению

При Min–Max-нормализации используют формулу (x − min) / (max − min). Минимальное значение становится 0, максимальное — 1, остальные располагаются между ними. При стандартизации из значения вычитают среднее и делят результат на стандартное отклонение. После неё числа могут быть меньше 0 или больше 1.

Пример масштабирования расхода и CTR в диапазон от 0 до 1
MinMaxScaler меняет шкалу каждого признака и сохраняет порядок значений внутри столбца.

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

Как масштабировать признаки в Python

Покажем базовый пример на статистике кампаний. В файле campaigns.csv есть расход, CTR, CPC и число конверсий. Модель должна предсказывать конверсии по трём числовым признакам. Если пока сложно различать массивы и таблицы Python, сначала посмотрите, чем NumPy отличается от Pandas.

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

df = pd.read_csv("campaigns.csv")

features = df[["spend", "ctr", "cpc"]]

target = df["conversions"]

X_train, X_test, y_train, y_test = train_test_split(

    features,

    target,

    test_size=0.2,

    random_state=42,

)

scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train)

X_test_scaled = scaler.transform(X_test)

Сначала данные делят на обучающую и тестовую части. fit_transform() рассчитывает среднее и разброс по X_train, а затем преобразует обучающие значения. Для X_test вызывают только transform(), чтобы применить уже найденные параметры.

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

В рабочем проекте scaler и модель часто объединяют через Pipeline. Тогда одинаковая последовательность действий используется при обучении и при прогнозе на новых данных. Это снижает риск забыть преобразование или случайно рассчитать его заново.

Как применять scaler к обучающей и тестовой выборкам без утечки данных
Параметры scaler вычисляются по X_train, а затем без повторного fit применяются к X_test и новым данным.

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

★ Где этому научиться

Курс «Data Science и Machine Learning» в Академии IT DMS

✓Python, Pandas и подготовка данных с нуля
✓Регрессия, классификация, кластеризация и нейросети на scikit-learn
✓NLP и анализ текста, визуализация, AutoML

Сертификат, диплом о переподготовке или удостоверение о повышении квалификации.

Перейти к курсу →ПромокодAFFTIMES

−5 % на первую покупку. Скидка суммируется с любыми акциями школы. Если оплачиваете через менеджера в чате, назовите ему промокод.

Частые ошибки при нормализации признаков

ОшибкаПочему это проблемаЧто сделать
Scaler обучили до разделения датасетаТестовые данные повлияли на подготовку моделиСначала сделать train_test_split, затем вызвать fit на X_train
Для X_test снова вызвали fit_transform()Обучающая и тестовая части получили разные шкалыИспользовать тот же scaler и метод transform()
Масштабировали campaign_idИдентификатор превратился в число с выдуманным порядкомУбрать служебный ID из признаков
Не проверили выбросыБольшое значение могло сжать основную часть диапазонаПосмотреть распределение и при необходимости выбрать RobustScaler
Ждали, что scaler очистит данныеПропуски, ошибки и дубли никуда не исчезлиПровести очистку отдельным этапом

Если модель работает с текстами или изображениями, она может представлять объекты в виде числовых векторов. Для них часто применяют L2-нормализацию, чтобы сравнивать направление векторов без влияния их длины. Подробнее об этом читайте в статье об эмбеддингах.

Какой способ нормализации выбрать

Сначала уточните задачу:

  • Проектируете базу. Разделите данные по объектам, добавьте ключи и проверьте 1НФ, 2НФ и 3НФ.
  • Готовите отчёт. Широкая таблица допустима, если она автоматически собирается из надёжного источника.
  • Обучаете модель. Посмотрите на диапазоны признаков и требования алгоритма.
  • Есть заметные выбросы. Сравните StandardScaler и RobustScaler.
  • Работаете с векторами. Проверьте, нужна ли нормализация каждой строки через Normalizer.

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

FAQ

Нормализация базы данных удаляет дубли?

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

Нормализация и стандартизация — одно и то же?

В широком смысле стандартизацию часто относят к методам нормализации. MinMaxScaler обычно переносит значения в диапазон от 0 до 1, а StandardScaler приводит среднее к 0 и стандартное отклонение к 1.

Нужно ли масштабировать все признаки?

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

Когда обучать scaler?

После разделения датасета scaler обучают только на X_train. К тестовым и новым данным применяют уже рассчитанные параметры через transform().

Можно ли хранить нормализованную базу и делать плоские отчёты?

Да. Основные данные можно хранить в связанных таблицах, а для аналитики автоматически собирать широкие витрины и выгрузки.

Валерия Шлегель
Валерия Шлегель
Автор
(Проголосовать за статью)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

X