ColumnTransformer: числа и категории в одном Pipeline

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

Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».

Сборка ColumnTransformer для смешанных признаков

Что уже дано

Проверяющая система выполняет решение в среде Python 3.12 с предустановленными библиотеками numpy, pandas и scikit-learn. Никаких глобальных переменных или файлов в окружении заранее не создаётся. Проверяющие тесты напрямую вызывают функцию transform_mixed_features с аргументами.

Что нужно сделать

Реализуйте функцию transform_mixed_features(train_df, query_df, num_cols, cat_cols).

Функция принимает:

  • train_df: pd.DataFrame — обучающая выборка со смешанными признаками;
  • query_df: pd.DataFrame — отложенная выборка (порядок столбцов в ней может отличаться от train_df, в числовых столбцах могут присутствовать пропуски, а в категориальных — ранее не встречавшиеся значения);
  • num_cols: список строковых названий числовых столбцов (могут содержать NaN);
  • cat_cols: список строковых названий категориальных столбцов (строковые значения без пропусков).

Требования к обработке:

  1. Предобработка числовых колонок должна заполнять пропущенные значения медианой из train_df и приводить признаки к нулевому среднему и единичной дисперсии.
  2. Предобработка категориальных колонок должна формировать one-hot представление с игнорированием неизвестных на обучении значений (новые категории заполняются нулями) в виде плотного массива.
  3. Объедините ветки через составной трансформер: ветка для числовых признаков num_cols получает имя "num", ветка для категориальных cat_cols — имя "cat". Все остальные столбцы (идентификаторы, целевые переменные) должны исключаться (remainder="drop").
  4. Обучение всех параметров и вычисление статистик должно производиться строго на train_df. Применение трансформера к query_df должно опираться исключительно на зафиксированные на обучении статистики и категории.
  5. Функция должна возвращать словарь со следующими ключами:
  • "query_transformed": двумерный массив np.ndarray типа float64 — результат преобразования query_df;
  • "feature_names": одномерный массив строк np.ndarray с названиями итоговых признаков;
  • "categories": список массивов категорий, зафиксированных энкодером при обучении.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно.

Аргументы передаются проверяющей системой при вызове функции transform_mixed_features:

  • train_df: pd.DataFrame;
  • query_df: pd.DataFrame;
  • num_cols: list[str];
  • cat_cols: list[str].

Функция возвращает dict с тремя ключами: "query_transformed" (np.ndarray), "feature_names" (np.ndarray) и "categories" (list[np.ndarray]).

Пример использования

import pandas as pd

train = pd.DataFrame({
    "distance_km": [10.0, float("nan"), 30.0],
    "stops_count": [1.0, 2.0, 3.0],
    "zone": ["north", "south", "north"],
    "service": ["standard", "express", "standard"]
})

query = pd.DataFrame({
    "service": ["standard", "express"],
    "zone": ["island", "south"],
    "stops_count": [float("nan"), 1.0],
    "distance_km": [float("nan"), 10.0]
})

res = transform_mixed_features(
    train,
    query,
    ["distance_km", "stops_count"],
    ["zone", "service"]
)

print(res["feature_names"].tolist())
print(res["query_transformed"].shape)

Результат:

['num__distance_km', 'num__stops_count', 'cat__zone_north', 'cat__zone_south', 'cat__service_express', 'cat__service_standard']
(2, 6)
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи