Перейти к содержанию

Сценарии использования

В featminer есть три основных pipeline. Pipeline определяет правило выбора данных для вычисления признака: взять все записи исторической таблицы, связанные с объектом по ID, все строки, предшествующие текущей по времени, или значения текущей строки. Это позволяет использовать всю информацию, доступную на момент прогноза, не заглядывая в будущее и не допуская утечки данных.

  • one_to_many_pipeline() — признаки, рассчитанные по всем записям исторической таблицы, относящимся к объекту по его ID. Например, сумма всех кредитов клиента — строки группируются по client_id и вычисляется сумма кредитов;
  • one_to_all_pipeline() — признаки, рассчитанные для каждой строки по всем строкам таблицы, которые предшествуют ей по времени. Например, сколько раз IP-адрес текущей операции встречался ранее во всей таблице, в том числе у других клиентов;
  • one_to_one_pipeline() — признаки, рассчитанные из сочетаний значений внутри одной строки, соответствующей одному объекту. Например, отношение суммы кредита к доходу клиента. Этот pipeline рекомендуется использовать только для уже плоских таблиц.

Агрегационный датасет: one-to-many

Используйте one_to_many_pipeline(), когда одному объекту соответствует много связанных строк: транзакции клиента, платежи по займу, заявки пользователя.

Выбор строк и расчёт признака в one-to-many

from featminer import one_to_many_pipeline

features = one_to_many_pipeline(
    df=transactions,
    aggregation_key="client_id",
    target_col="is_bad",
    cat_features=["product_code"],
)

Транзакционный датасет: one-to-all

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

Выбор предшествующих строк для one-to-all по времени

from featminer.pipelines.one_to_all import one_to_all_pipeline

features = one_to_all_pipeline(
    df=transactions,
    target_col="is_bad",
    event_datetime="transaction_dttm",
    id_col="transaction_id",
    cat_features=["merchant_category"],
)

Плоский датасет: one-to-one

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

Если исходная таблица имеет структуру one-to-many, не передавайте её в one_to_one_pipeline(). Производные колонки для такой таблицы создаются самим one_to_many_pipeline() и управляются через DerivedColumnsConfig. Например, DerivedColumnsConfig(differences=True, ratios=True) включает попарные разности (differences) и безопасные отношения (ratios) совместимых исходных колонок до агрегации.

Расчёт признака внутри строки в one-to-one

from featminer.pipelines.one_to_one import one_to_one_pipeline

target_series = one_to_one_df.pop("target")
one_to_one_df.pop("client_id")

features = one_to_one_pipeline(
    features=one_to_one_df,
    target_series=target_series,
    operators=("+", "-", "*", "/", "max", "min"),
)

Инкрементальный режим

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

import pandas as pd
from featminer import one_to_many_pipeline

manual_features = pd.DataFrame({
    "manual_avg_amount": [120.5, 80.0, 310.2],
    "manual_overdue_flag": [0, 1, 0],
}, index=[101, 102, 103])

features = one_to_many_pipeline(
    df=transactions,
    aggregation_key="client_id",
    target_col="target",
    cat_features=["product_code"],
    baseline_features=manual_features,
)