← Назад к вопросам

Какие знаешь методы отбора признаков?

2.3 Middle🔥 161 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы отбора признаков в машинном обучении

Отбор признаков (Feature Selection) — это критически важный этап при подготовке данных. Правильный выбор признаков улучшает качество модели, снижает переобучение и ускоряет обучение. Существует несколько основных категорий методов.

1. Фильтровые методы (Filter methods)

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

Статистические тесты:

from sklearn.feature_selection import SelectKBest, f_classif, chi2
from scipy.stats import pearsonr, spearmanr

# f_classif — f-статистика для классификации
# f_regression — для регрессии
selector = SelectKBest(f_classif, k=10)
X_new = selector.fit_transform(X, y)

# Корреляция Пирсона
correlations = [pearsonr(X[:, i], y)[0] for i in range(X.shape[1])]

# Chi-square для категориальных признаков
selector = SelectKBest(chi2, k=10)

Mutual Information:

from sklearn.feature_selection import mutual_info_classif

scores = mutual_info_classif(X, y, random_state=42)

2. Встроенные методы (Embedded methods)

Методы, встроенные в сам алгоритм обучения, которые выбирают признаки во время обучения.

Коэффициенты линейных моделей:

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

model = LogisticRegression(max_iter=1000)
model.fit(X_scaled, y)

# Получить важность признаков из коэффициентов
feature_importance = abs(model.coef_[0])
important_features = feature_importance.argsort()[-10:]

Tree-based методы (Gini, Information Gain):

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X, y)

# feature_importances_ основаны на Information Gain/Gini
importances = rf.feature_importances_
top_features = importances.argsort()[-10:]

3. Методы оболочки (Wrapper methods)

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

Recursive Feature Elimination (RFE):

from sklearn.feature_selection import RFE
from sklearn.svm import SVC

rfe = RFE(estimator=SVC(kernel=linear), n_features_to_select=10)
X_rfe = rfe.fit_transform(X, y)

# Посмотреть какие признаки выбраны
print(rfe.support_)

Sequential Feature Selection:

from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.linear_model import LogisticRegression

model = LogisticRegression(max_iter=1000)
sfs = SequentialFeatureSelector(model, n_features_to_select=10, direction=forward)
X_sfs = sfs.fit_transform(X, y)

4. Гибридные методы

Комбинируют несколько подходов для более надёжного отбора.

# Combiner approach: сначала фильтр, потом wrapper
selector = SelectKBest(f_classif, k=50)  # Отсечь очевидно плохие признаки
X_filtered = selector.fit_transform(X, y)

# Потом RFE для окончательного выбора
rfe = RFE(estimator=LogisticRegression(max_iter=1000), n_features_to_select=10)
X_final = rfe.fit_transform(X_filtered, y)

5. Методы на основе стабильности

Permutation Feature Importance:

from sklearn.inspection import permutation_importance

model.fit(X_train, y_train)
perm_importance = permutation_importance(model, X_test, y_test, n_repeats=10)

6. Современные подходы

SHAP (SHapley Additive exPlanations):

import shap

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)

# Общая важность признаков
importance = np.abs(shap_values).mean(axis=0)

Выбор метода

МетодПреимуществаНедостатки
ФильтрБыстро, независимо от моделиНе учитывает взаимодействия
WrapperУчитывает взаимодействия, точноМедленно, риск переобучения
ВстроенныйБаланс скорости и точностиЗависит от модели

На практике я часто начинаю с фильтровых методов для быстрого отсечения, потом использую tree-based importance или RFE для окончательного выбора.

Какие знаешь методы отбора признаков? | PrepBro