Откройте для себя внутреннюю работу VIF, IFE, FFS, LASSO, MRMR и Boruta для оптимального выбора функций

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

«Все должно быть сделано как можно проще, но не проще».

- Альберт Эйнштейн

В этом блоге мы рассмотрим несколько эффективных методов выбора признаков, в том числе фактор увеличения дисперсии (VIF), итеративное исключение признаков (IFE), прямой выбор признаков (FFS), LASSO (оператор наименьшего абсолютного сокращения и выбора), MRMR (минимальная избыточность, максимальная релевантность) и Boruta. Мы изучим базовую математику и процессы для каждого метода и предоставим иллюстрации кода Python, чтобы продемонстрировать их реализацию.

Коэффициент инфляции дисперсии (VIF)

VIF — это статистическая мера, используемая для выявления мультиколлинеарности в регрессионном анализе. Мультиколлинеарность возникает, когда две или более независимые переменные сильно коррелированы, что затрудняет для модели различение их индивидуальных эффектов. VIF помогает оценить, насколько увеличивается дисперсия расчетного коэффициента регрессии из-за мультиколлинеарности.

Математика и процесс

  1. Для каждой функции в наборе данных подберите отдельную модель линейной регрессии по отношению ко всем другим функциям.
  2. Рассчитайте VIF для каждой функции по формуле:

где R²_i — коэффициент детерминации регрессионной модели i-го признака.

3. Удалите объекты с высокими значениями VIF (обычно выше 5 или 10), поскольку они указывают на значительную мультиколлинеарность.

Реализация Python

from statsmodels.stats.outliers_influence import variance_inflation_factor

def calculate_vif(df):
    vif_data = pd.DataFrame()
    vif_data["Feature"] = df.columns
    vif_data["VIF"] = [variance_inflation_factor(df.values, i) for i in range(df.shape[1])]
    return vif_data

VIF = calculate_vif(X)
print(VIF[VIF.VIF < 5].Feature.to_list())

Итеративное устранение признаков (IFE)

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

Математика и процесс:

  1. Выберите модель и определите показатель производительности (например, точность, показатель F1 и т. д.).
  2. Обучите модель, используя все функции, и оцените ее производительность.
  3. Определите наименее важную функцию на основе определенного критерия (например, функцию с самым низким значением коэффициента в линейной регрессии).
  4. Удалите идентифицированный объект из набора данных.
  5. Повторно обучите модель с уменьшенным набором функций и повторите шаги 3–4, пока не будет достигнуто желаемое количество функций.

Реализация Python

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

def iterative_feature_elimination(X, y, model=LinearRegression(), metric=mean_squared_error, num_features=15):
    selected_features = list(X.columns)
    while len(selected_features) > num_features:
        model.fit(X[selected_features], y)
        score = metric(y, model.predict(X[selected_features]))
        importance = pd.Series(model.coef_, index=selected_features)
        least_important = importance.idxmin()
        selected_features.remove(least_important)
        print(f"Removed '{least_important}' - Current Score: {score:.4f}")
    return selected_features

iterative_feature_elimination(X, y)

Прямой выбор функций (FFS)

FFS — это жадный алгоритм поиска, который начинается с пустого набора функций и итеративно добавляет наиболее релевантную функцию на каждом этапе.

Математика и процесс

  1. Определите модель и показатель производительности.
  2. Инициализировать пустой набор для выбранных функций.
  3. Для каждой функции, не входящей в выбранный набор, обучите модель с выбранными функциями и одной дополнительной функцией.
  4. Выберите функцию, обеспечивающую наилучшую производительность модели, и добавьте ее в выбранный набор.
  5. Повторяйте шаги 3–4, пока не будет достигнуто желаемое количество функций.

Реализация Python

from sklearn.feature_selection import SequentialFeatureSelector

def forward_feature_selection(X, y, model=LinearRegression(), metric=mean_squared_error, 
                              num_features=10, direction = 'forward'):

    sfs = SequentialFeatureSelector(model, n_features_to_select=10)
    sfs.fit(X, y)
    print(X.columns[sfs.get_support()])
    return pd.DataFrame(sfs.transform(X), columns = X.columns[sfs.get_support()])

forward_feature_selection(X, y)

LASSO (оператор наименьшего абсолютного сжатия и выбора)

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

Математика и процесс

  1. Определите модель с регуляризацией LASSO и установите гиперпараметр силы регуляризации (лямбда).
  2. Обучите модель LASSO на наборе данных.
  3. Проанализируйте коэффициенты модели, чтобы идентифицировать функции с ненулевыми коэффициентами.

Реализация Python

from sklearn.linear_model import LassoCV

def lasso_feature_selection(X, y, alpha_values=None):
    if alpha_values is None:
        alpha_values = [0.001, 0.01, 0.1, 1.0, 10, 100]
    lasso_model = LassoCV(alphas=alpha_values)
    lasso_model.fit(X, y)
    selected_features = X.columns[lasso_model.coef_ != 0]
    return selected_features

lasso_feature_selection(X, y)

MRMR (минимальная избыточность, максимальная релевантность)

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

Математика и процесс:

  1. Рассчитайте релевантность между каждой функцией и целевой переменной (например, взаимной информацией).
  2. Рассчитайте избыточность между каждой парой признаков (например, корреляцию).
  3. Объедините меры релевантности и избыточности в единую оценку для каждой функции.
  4. Выберите функции с наивысшими оценками, чтобы сформировать окончательное подмножество.

Реализация Python

from sklearn.feature_selection import mutual_info_regression

def mrmr_feature_selection(X, y, num_features=5):
    relevance_scores = pd.Series(mutual_info_regression(X, y), index=X.columns)
    redundancy_scores = X.corr().abs().sum() - 1
    mrmr_scores = relevance_scores / redundancy_scores
    selected_features = mrmr_scores.nlargest(num_features).index
    return selected_features

Борута

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

Математика и процесс

  1. Создайте набор теневых функций, случайным образом переставляя значения каждой функции.
  2. Обучите модель (например, Random Forest) на исходных функциях и соответствующих им теневых функциях.
  3. Подсчитайте важность каждого признака и сравните его с важностью теневых признаков.
  4. Выберите объекты со значительно большей важностью, чем теневые объекты.

Реализация Python

from boruta import BorutaPy
from sklearn.ensemble import RandomForestRegressor

def boruta_feature_selection(X, y, num_features=10):
    rf_model = RandomForestRegressor(n_jobs=-1)
    boruta_selector = BorutaPy(rf_model, n_estimators='auto', verbose=0)
    boruta_selector.fit(X.values, y.values)
    selected_features = X.columns[boruta_selector.support_].tolist()
    return selected_features

boruta_feature_selection(X, y)

Заключение

Выбор признаков — это фундаментальный шаг в предварительной обработке данных, который позволяет повысить производительность модели, сократить время вычислений и получить представление об анализе данных. В этом блоге мы рассмотрели несколько мощных методов выбора признаков, каждый из которых имеет свой уникальный подход и математическую основу. Надеемся, что, поняв эти методы и применив их с помощью кода Python, вы сможете использовать их потенциал для оптимизации своих прогностических моделей и рационализации рабочих процессов анализа данных.

Рекомендации







«MRMR объяснил именно так, как вы хотели, чтобы вам объяснили
Хотите улучшить выбор функций? Максимальная релевантность — минимальная избыточность (также известная как MRMR) — это простой, быстрый и…towardsdatascience.com»







Если вы дочитали до сих пор, большое спасибо за чтение! Надеюсь, эта статья окажется для вас полезной.Если хотите, добавьте меня в LinkedIn!

Удачи на этой неделе,
Пратюш