Пример 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 тестовые данные преобразуются с
использованием уже найденных параметров.
Такой подход предотвращает утечку статистической информации
из тестовой выборки в процесс обучения.