Ответ
Отбор признаков (feature selection) — это критический этап для повышения производительности модели, сокращения времени обучения и предотвращения переобучения. Я обычно применяю комбинацию методов, начиная с быстрых фильтров и заканчивая более точными встроенными или обёрточными подходами.
Основные методы, которые я использую:
-
Фильтрационные методы (Filter Methods): Быстрая предварительная оценка.
- Удаление константных и квази-константных признаков.
- Удаление сильно коррелирующих признаков: Я удаляю один из пары признаков с корреляцией выше 0.85-0.9, чтобы снизить мультиколлинеарность.
import numpy as np import pandas as pd
corr_matrix = df.corr().abs() upper_triangle = corr_matrix.where(np.triu(np.ones_like(corr_matrix), k=1).astype(bool)) to_drop = [col for col in upper_triangle.columns if any(upper_triangle[col] > 0.9)] df_reduced = df.drop(to_drop, axis=1)
* **Статистические тесты:** `SelectKBest` с `f_classif` (ANOVA) для классификации или `f_regression` для регрессии. -
Встроенные методы (Embedded Methods): Признаки отбираются в процессе обучения модели.
- Важность признаков из деревьев: Использую
feature_importances_уRandomForestClassifierилиGradientBoostingClassifier. Это даёт понимание, какие признаки модель считает ключевыми. - L1-регуляризация (Lasso): В линейных моделях L1-регуляризация обнуляет веса неинформативных признаков. Это эффективный способ автоматического отбора.
- Важность признаков из деревьев: Использую
-
Методы-обёртки (Wrapper Methods): Точные, но вычислительно дорогие. Использую для финальной тонкой настройки набора признаков.
- Recursive Feature Elimination (RFE): Итеративно удаляет наименее важные признаки, используя оценку важности от модели (например, SVM или того же RandomForest).
from sklearn.feature_selection import RFE from sklearn.ensemble import RandomForestClassifier
estimator = RandomForestClassifier(n_estimators=50) selector = RFE(estimator, n_features_to_select=15, step=1) selector = selector.fit(X_train, y_train) X_train_selected = selector.transform(X_train)
- Recursive Feature Elimination (RFE): Итеративно удаляет наименее важные признаки, используя оценку важности от модели (например, SVM или того же RandomForest).
Мой типичный рабочий процесс:
- Удаляю константы и дубликаты.
- Анализирую и удаляю высокие корреляции.
- Применяю
SelectKBestдля быстрого сужения круга. - Обучаю модель с L1-регуляризацией или смотрю важность признаков из RandomForest.
- Для наиболее важных задач финализирую набор с помощью RFE.
Ключевой принцип — всегда проверять качество модели на отложенной выборке (validation set) после каждого этапа отбора, чтобы убедиться, что мы не выбросили что-то важное.
Ответ 18+ 🔞
Слушай, ну вот объясняю как есть. Отбор признаков — это такая штука, без которой твоя модель будет жрать ресурсы как не в себя и в итоге наделает таких делов, что потом разгребай овердохуища ошибок. Это как перед дальнобоем машину проверить: масло, шины, чтоб не отвалилось ничего по дороге. Я обычно действую по нарастающей: от простого и быстрого к сложному и точному.
Вот на чём я руки пачкаю:
-
Методы-фильтры (Filter Methods): Быстро, дёшево, сердито. Для первоначального отсева.
- Выкинуть признаки-константы и квази-константы. Ну это же ебушки-воробушки, если признак у всех одинаковый — какой от него толк? Манда с ушами, а не фича.
- Убрать сильно скоррелированные признаки. Если два признака как сиамские близнецы, рассказывают одну и ту же историю, зачем нам оба? Оставляю одного, второго — в пизду. Обычно режу, когда корреляция за 0.85-0.9 переваливает.
import numpy as np import pandas as pd
corr_matrix = df.corr().abs() upper_triangle = corr_matrix.where(np.triu(np.ones_like(corr_matrix), k=1).astype(bool)) to_drop = [col for col in upper_triangle.columns if any(upper_triangle[col] > 0.9)] df_reduced = df.drop(to_drop, axis=1)
* **Статистические тесты:** `SelectKBest` с `f_classif` или `f_regression`. По сути, он смотрит, насколько признак сам по себе отбивается от общей массы. Быстро и понятно. -
Встроенные методы (Embedded Methods): Умные штуки, где отбор идёт прямо внутри обучения модели. Люблю их.
- Важность признаков из деревьев (RandomForest, GradientBoosting). Обучаешь лес, а потом смотришь,
feature_importances_. Модель тебе сама, как на ладони, раскладывает, что она там считает важным, а что — хуй с горы. Доверия к этому, конечно, не ноль, но очень высокое. - L1-регуляризация (Lasso). Вот это вообще магия. Ставишь в линейной модели — и она сама, хитрая жопа, обнуляет веса у бесполезных признаков. Автоматический отбор, ёпта! Красота.
- Важность признаков из деревьев (RandomForest, GradientBoosting). Обучаешь лес, а потом смотришь,
-
Методы-обёртки (Wrapper Methods): Точные, но жрут время и мощность, как печь дрова. Пускаю в ход, когда уже почти всё готово, для финальной полировки.
- Recursive Feature Elimination (RFE). Он как упрямый сапёр: итеративно выкидывает самый херовый признак, переучивает модель, смотрит — и так по кругу, пока не останется заданное число самых ценных кадров.
from sklearn.feature_selection import RFE from sklearn.ensemble import RandomForestClassifier
estimator = RandomForestClassifier(n_estimators=50) selector = RFE(estimator, n_features_to_select=15, step=1) selector = selector.fit(X_train, y_train) X_train_selected = selector.transform(X_train)
- Recursive Feature Elimination (RFE). Он как упрямый сапёр: итеративно выкидывает самый херовый признак, переучивает модель, смотрит — и так по кругу, пока не останется заданное число самых ценных кадров.
Как я обычно работаю, чтобы не облажаться:
- Первым делом — константы и дубликаты за борт. Мусор.
- Потом гоняю корреляцию, убираю близнецов. Чтоб мультиколлинеарности не было.
- Быстренько прогоняю через
SelectKBest, чтобы круг подозреваемых сузить. - Запускаю серьёзную артиллерию: RandomForest с важностью или Lasso. Смотрю, что модель сама считает крутым.
- Если задача прям важная и хочется выжать всё, финализирую набор через RFE. Это уже ювелирная работа.
И главное, чувак, золотое правило: после каждого такого шага — обязательно гоняй проверку на отложенной выборке! А то так увлечёшься отбором, выкинешь что-то нечаянно важное, а модель потом нихуя не предсказывает. Волнение ебать, когда такую ошибку находишь. Поэтому проверяй, перепроверяй, и будет тебе счастье.