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

Конфигурация отбора признаков

SelectionConfig задаёт метрику и пороги отбора для конвейеров one_to_many_pipeline() и one_to_all_pipeline().

Доступны шесть метрик связи признака с целевой переменной:

  • AUC;
  • абсолютная корреляция Пирсона;
  • абсолютная ранговая корреляция Kendall tau-b;
  • абсолютная ранговая корреляция Спирмена;
  • Information Value (IV);
  • взаимная информация (Mutual Information).

Отбор по AUC

AUC используется по умолчанию и предпочтителен для задач бинарной классификации. Если аргумент selection не указан, конвейер автоматически применяет SelectionConfig.auc().

minimum задаёт минимальный AUC отдельного признака.

Отбор по корреляции Пирсона

Для задач регрессии вместо AUC следует использовать абсолютную корреляцию Пирсона с целевой переменной.

minimum задаёт минимальную абсолютную корреляцию кандидата с target. Поэтому значения -0.3 и +0.3 имеют одинаковую силу 0.3.

Отбор по корреляции Kendall tau-b

Kendall tau-b оценивает согласованность порядка значений признака и target. Метрика подходит для монотонных зависимостей и корректирует результат при совпадающих значениях признака или target.

Для каждой пары наблюдений проверяется, одинаково ли упорядочены значения признака и target. Согласованные пары увеличивают коэффициент, несогласованные уменьшают его, а поправка tau-b учитывает совпадающие ранги. При отборе используется модуль коэффициента, поэтому возрастающая и убывающая монотонные зависимости равной силы получают одинаковую оценку.

Отбор по корреляции Спирмена

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

Совпадающим значениям назначаются усреднённые ранги. Как и для Kendall, сравнение с minimum выполняется по модулю коэффициента.

Для Пирсона, Kendall и Спирмена нечисловые значения преобразуются в пропуски, а пропуски и бесконечности исключаются попарно. Если после очистки данных недостаточно либо признак или target постоянны, метрика не вычисляется и кандидат не проходит соответствующий фильтр.

Отбор по Information Value

Information Value измеряет, насколько по распределению признака различаются два класса бинарного target. Если у числового признака не больше 10 уникальных значений, каждое значение образует отдельный bin; иначе используются 10 квантильных bins. Для каждого bin вычисляется Weight of Evidence:

  • WoEᵢ = ln(pᵢ(event) / pᵢ(non-event));
  • IV = Σᵢ (pᵢ(event) − pᵢ(non-event)) × WoEᵢ.

К частотам каждого класса добавляется сглаживание 0.5, поэтому отсутствие одного из классов в отдельном bin не приводит к бесконечному результату. Пропуски и бесконечности исключаются. IV не ограничен сверху, поэтому minimum может быть больше 1. Если target не бинарный либо признак постоянный, метрика не вычисляется.

Отбор по взаимной информации

Взаимная информация измеряет статистическую зависимость числового признака и дискретного target, включая нелинейные и немонотонные связи. Если у признака не больше 10 уникальных значений, каждое значение образует отдельный bin; иначе используются 10 квантильных bins. Затем метрика вычисляется по совместному распределению bins и классов target:

  • MI(X, Y) = Σₓ,ᵧ p(x, y) × ln(p(x, y) / (p(x) × p(y))).

Результат выражается в nats, всегда неотрицателен и не нормирован к диапазону [0, 1]: 0 означает отсутствие обнаруженной зависимости, а более высокие значения — более сильную зависимость. Поэтому minimum может быть больше 1, например для target с большим числом классов. Пропуски и бесконечности исключаются. Если признак или target постоянны, метрика не вычисляется.

Как передать конфигурацию в pipeline

Создайте конфигурацию нужной метрики и передайте её в аргумент selection. Доступные варианты:

from featminer import SelectionConfig, one_to_many_pipeline

auc_selection = SelectionConfig.auc(minimum=0.50)
pearson_selection = SelectionConfig.pearson(minimum=0.10)
kendall_selection = SelectionConfig.kendall(minimum=0.10)
spearman_selection = SelectionConfig.spearman(minimum=0.10)
iv_selection = SelectionConfig.information_value(minimum=0.10)
mi_selection = SelectionConfig.mutual_information(minimum=0.10)

features = one_to_many_pipeline(
    df=events,
    aggregation_key="client_id",
    target_col="target",
    selection=pearson_selection,
)

В этом примере pipeline отбирает признаки по абсолютной корреляции Пирсона. Чтобы использовать другую метрику, передайте в selection одну из остальных конфигураций. Если аргумент selection не указывать, применяется AUC с параметрами по умолчанию.

Одномерная сила и дублирование признаков

Не путайте параметры конфигурации:

  • minimum определяет минимальную предсказательную силу отдельного признака;
  • feature_correlation_threshold определяет, когда два признака считаются дублирующими друг друга.
  • max_null_fraction задаёт максимально допустимую долю пропусков;
  • max_mode_fraction задаёт максимально допустимую долю самого частого непустого значения.

Политика устранения дубликатов

NullsFirstRedundancy используется по умолчанию. Для явного эксперимента с приоритетом предсказательной силы перед покрытием доступна QualityFirstRedundancy. Практическое описание и пример приведены в разделе Отбор признаков.

Программный интерфейс

featminer.selection.config.SelectionConfig

Bases: BaseModel

auc classmethod

auc(
    *,
    minimum: float = 0.5,
    feature_correlation_threshold: float = 0.7,
    max_null_fraction: float = 0.5,
    max_mode_fraction: float = 0.95,
    comparison_population: ComparisonPopulation = ComparisonPopulation.INDIVIDUAL_VALID,
    redundancy: RedundancyPolicy | None = None,
) -> SelectionConfig

pearson classmethod

pearson(
    *,
    minimum: float,
    feature_correlation_threshold: float = 0.7,
    max_null_fraction: float = 0.5,
    max_mode_fraction: float = 0.95,
    comparison_population: ComparisonPopulation = ComparisonPopulation.INDIVIDUAL_VALID,
    redundancy: RedundancyPolicy | None = None,
) -> SelectionConfig

kendall classmethod

kendall(
    *,
    minimum: float,
    feature_correlation_threshold: float = 0.7,
    max_null_fraction: float = 0.5,
    max_mode_fraction: float = 0.95,
    comparison_population: ComparisonPopulation = ComparisonPopulation.INDIVIDUAL_VALID,
    redundancy: RedundancyPolicy | None = None,
) -> SelectionConfig

spearman classmethod

spearman(
    *,
    minimum: float,
    feature_correlation_threshold: float = 0.7,
    max_null_fraction: float = 0.5,
    max_mode_fraction: float = 0.95,
    comparison_population: ComparisonPopulation = ComparisonPopulation.INDIVIDUAL_VALID,
    redundancy: RedundancyPolicy | None = None,
) -> SelectionConfig

information_value classmethod

information_value(
    *,
    minimum: float,
    feature_correlation_threshold: float = 0.7,
    max_null_fraction: float = 0.5,
    max_mode_fraction: float = 0.95,
    comparison_population: ComparisonPopulation = ComparisonPopulation.INDIVIDUAL_VALID,
    redundancy: RedundancyPolicy | None = None,
) -> SelectionConfig

mutual_information classmethod

mutual_information(
    *,
    minimum: float = 1.3,
    feature_correlation_threshold: float = 0.7,
    max_null_fraction: float = 0.5,
    max_mode_fraction: float = 0.95,
    comparison_population: ComparisonPopulation = ComparisonPopulation.INDIVIDUAL_VALID,
    redundancy: RedundancyPolicy | None = None,
) -> SelectionConfig