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

Интерпретируемость признаков

FeatMiner возвращает не скрытые представления и не анонимные числовые векторы, а воспроизводимые формулы, построенные из колонок исходных данных. Для каждого признака можно определить:

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

Это позволяет проверить бизнес-смысл найденной закономерности, исключить нежелательные источники данных и воспроизвести расчёт вне FeatMiner.

Как читать имя признака

Имя признака последовательно описывает его формулу. Части имени разделяются двойным подчёркиванием __.

Например:

amount__status__overdue__event_date__sum_30d

означает:

  1. взять колонку amount;
  2. оставить события, для которых status = "overdue";
  3. использовать временную ось event_date;
  4. рассматривать последние 30 дней;
  5. вычислить сумму.

Другой пример:

status__overdue__event_date__interval_max

Это максимальный интервал между соседними событиями со статусом overdue. Сначала FeatMiner применяет условие, затем сортирует выбранные события по event_date и рассчитывает интервалы.

Имена позволяют быстро просматривать признаки, но полное и однозначное описание всегда доступно в колонках formula и python_code отчёта.

Формула и исполняемый код

Для каждого выбранного признака FeatMiner сохраняет два представления.

formula — компактное описание для человека:

WindowSum(30d, amount, event_date, prediction_date, where status = 'overdue')

python_code — воспроизводимый код расчёта на pandas. Его можно проверить, изменить, встроить в production-процесс или реализовать на другом технологическом стеке.

Таким образом, результат поиска не зависит от внутреннего состояния FeatMiner: логика каждого признака остаётся доступной после завершения запуска.

Что показывает отчёт

HTML-отчёт связывает техническое описание признака с его статистическими характеристиками:

  • name — имя итоговой колонки;
  • formula — человекочитаемая формула;
  • python_code — код воспроизведения;
  • target_score — одномерная связь признака с target по выбранной метрике;
  • percent_missing — доля пропущенных значений;
  • psi — оценка изменения распределения между выборками.

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

Высокий target_score показывает предиктивную связь, но не доказывает причинно-следственную зависимость. Неожиданно сильные признаки необходимо проверять на утечку target и доступность данных в момент построения прогноза.

Условия и временные горизонты

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

Mean(amount where product = 'credit_card')
Count(where status = 'overdue')

Временные формулы дополнительно фиксируют временную ось и горизонт:

WindowCount(7d, event_date)
Ewa(30d, balance, event_date, prediction_date)

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

Для корректной интерпретации временных признаков важно правильно указать event_times, prediction_time и cutoff_by. Подробнее: Защита от утечки из будущего.

Отношения показателей

Формулы отношений используются для поиска изменений структуры и динамики.

Например:

WindowSum(7d, amount) / WindowSum(30d, amount)

показывает, какая часть месячного объёма пришлась на последнюю неделю.

Sum(overdue_amount) / Sum(total_amount)

характеризует долю просроченной суммы в общем объёме.

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

Как повысить интерпретируемость

Укажите категориальные колонки

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

Передайте такие колонки через cat_features:

features = one_to_many_pipeline(
    ...,
    cat_features=(
        "product_code",
        "region_code",
        "application_status",
    ),
)

Тогда FeatMiner будет использовать их как категории и условия, например:

Count(where product_code = 17)
Fraction(where application_status = 'approved')

Опишите временную семантику

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

Используйте предметные названия

Названия вроде payment_amount и days_overdue делают найденные формулы понятнее, чем var_17 и field_42. Если переименование исходных колонок невозможно, полезно хранить рядом словарь их бизнес-значений.

Ограничьте пространство формул

Если отдельные преобразования не имеют смысла для предметной области, передайте собственный набор formulas. Это не только сокращает вычисления, но и не позволяет алгоритму возвращать формально сильные, однако трудно объяснимые конструкции.

Интерпретируемость не заменяет проверку

Перед использованием найденного признака рекомендуется ответить на четыре вопроса:

  1. Доступны ли все его исходные колонки в момент прогноза?
  2. Имеет ли операция над ними бизнес-смысл?
  3. Стабильна ли закономерность на отложенной и более поздней выборке?
  4. Можно ли воспроизвести расчёт тем же способом в production?

FeatMiner автоматизирует поиск сильных закономерностей и предоставляет все необходимые детали для их проверки. Окончательная бизнес- и причинная интерпретация остаётся частью валидации модели.