Пример 1. Обработка пропущенных значений

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

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

Рассмотрим данные о площади квартир:

45, 52, пропуск, 60, 150.

Медиана известных значений равна 56. Поэтому пропущенную площадь можно заменить значением 56.

Реализация на Python:

import numpy as np

from sklearn.impute import SimpleImputer

 

X = np.array([

    [45],

    [52],

    [np.nan],

    [60],

    [150]

])

 

imputer = SimpleImputer(strategy="median")

X_filled = imputer.fit_transform(X)

 

print(X_filled)

Результат:

45, 52, 56, 60, 150.

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

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

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

Рассмотрим признак «Тип недвижимости», принимающий значения «Квартира», «Дом» и «Таунхаус».

Применим One-Hot Encoding. Каждая категория будет представлена отдельным бинарным столбцом.

Реализация на Python:

import numpy as np

from sklearn.preprocessing import OneHotEncoder

 

X = np.array([

    ["Квартира"],

    ["Дом"],

    ["Таунхаус"],

    ["Квартира"]

])

 

encoder = OneHotEncoder(

    sparse_output=False,

    handle_unknown="ignore"

)

 

X_encoded = encoder.fit_transform(X)

 

print(encoder.get_feature_names_out())

print(X_encoded)

Результат:

Для каждой категории создаётся отдельный признак, принимающий значение 0 или 1.

Например, объект категории «Дом» получает единицу в столбце, соответствующем этой категории, и нули в остальных столбцах.

Параметр handle_unknown="ignore" позволяет обрабатывать новые категории, отсутствовавшие при обучении кодировщика, без возникновения ошибки. Неизвестная категория будет представлена нулевыми значениями во всех созданных столбцах.

Пример 3. Масштабирование признаков и предотвращение утечки данных

Предположим, что модель использует два признака: площадь квартиры и её возраст.

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

Для стандартизации используется формула:

z = (x − μ) / σ,

где μ — среднее значение признака, σ — стандартное отклонение.

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

Реализация на Python:

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.pipeline import make_pipeline

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import Ridge

from sklearn.metrics import mean_absolute_error

 

X = np.array([

    [40, 25],

    [50, 20],

    [60, 15],

    [70, 10],

    [80, 8],

    [90, 5],

    [100, 3],

    [110, 2]

])

 

y = np.array([18, 22, 27, 32, 37, 43, 48, 54])

 

X_train, X_test, y_train, y_test = train_test_split(

    X, y,

    test_size=0.25,

    random_state=42

)

 

model = make_pipeline(

    StandardScaler(),

    Ridge(alpha=1.0)

)

 

model.fit(X_train, y_train)

 

predictions = model.predict(X_test)

 

print("MAE:", mean_absolute_error(y_test, predictions))

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

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

Такой подход предотвращает утечку статистической информации из тестовой выборки в процесс обучения.