Откройте для себя внутреннюю работу VIF, IFE, FFS, LASSO, MRMR и Boruta для оптимального выбора функций
Выбор признаков — важный шаг в процессе построения прогностических моделей и анализа данных. Он включает в себя выбор наиболее релевантных и информативных функций из набора данных для повышения производительности модели, снижения вычислительной сложности и предотвращения переобучения.
«Все должно быть сделано как можно проще, но не проще».
- Альберт Эйнштейн
В этом блоге мы рассмотрим несколько эффективных методов выбора признаков, в том числе фактор увеличения дисперсии (VIF), итеративное исключение признаков (IFE), прямой выбор признаков (FFS), LASSO (оператор наименьшего абсолютного сокращения и выбора), MRMR (минимальная избыточность, максимальная релевантность) и Boruta. Мы изучим базовую математику и процессы для каждого метода и предоставим иллюстрации кода Python, чтобы продемонстрировать их реализацию.
Коэффициент инфляции дисперсии (VIF)
VIF — это статистическая мера, используемая для выявления мультиколлинеарности в регрессионном анализе. Мультиколлинеарность возникает, когда две или более независимые переменные сильно коррелированы, что затрудняет для модели различение их индивидуальных эффектов. VIF помогает оценить, насколько увеличивается дисперсия расчетного коэффициента регрессии из-за мультиколлинеарности.
Математика и процесс
- Для каждой функции в наборе данных подберите отдельную модель линейной регрессии по отношению ко всем другим функциям.
- Рассчитайте 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 — это итеративный метод, который включает в себя многократную подгонку модели с постепенным удалением менее важных функций. Это помогает определить подмножество функций, обеспечивающих наилучшую производительность модели.
Математика и процесс:
- Выберите модель и определите показатель производительности (например, точность, показатель F1 и т. д.).
- Обучите модель, используя все функции, и оцените ее производительность.
- Определите наименее важную функцию на основе определенного критерия (например, функцию с самым низким значением коэффициента в линейной регрессии).
- Удалите идентифицированный объект из набора данных.
- Повторно обучите модель с уменьшенным набором функций и повторите шаги 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 — это жадный алгоритм поиска, который начинается с пустого набора функций и итеративно добавляет наиболее релевантную функцию на каждом этапе.
Математика и процесс
- Определите модель и показатель производительности.
- Инициализировать пустой набор для выбранных функций.
- Для каждой функции, не входящей в выбранный набор, обучите модель с выбранными функциями и одной дополнительной функцией.
- Выберите функцию, обеспечивающую наилучшую производительность модели, и добавьте ее в выбранный набор.
- Повторяйте шаги 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 — это метод регуляризации, который добавляет штрафной член к целевой функции регрессии, сводя некоторые коэффициенты признаков к нулю. Это обеспечивает выбор функций, эффективно исключая менее важные функции.
Математика и процесс
- Определите модель с регуляризацией LASSO и установите гиперпараметр силы регуляризации (лямбда).
- Обучите модель LASSO на наборе данных.
- Проанализируйте коэффициенты модели, чтобы идентифицировать функции с ненулевыми коэффициентами.
Реализация 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 — это метод выбора признаков, целью которого является поиск подмножества признаков, максимально релевантных целевой переменной и сводящих к минимуму избыточность среди выбранных признаков.
Математика и процесс:
- Рассчитайте релевантность между каждой функцией и целевой переменной (например, взаимной информацией).
- Рассчитайте избыточность между каждой парой признаков (например, корреляцию).
- Объедините меры релевантности и избыточности в единую оценку для каждой функции.
- Выберите функции с наивысшими оценками, чтобы сформировать окончательное подмножество.
Реализация 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 — это алгоритм выбора объектов, который работает путем сравнения важности каждого объекта с важностью случайно созданных теневых объектов. Он идентифицирует объекты, которые имеют значительно более высокое значение, чем соответствующие им теневые объекты.
Математика и процесс
- Создайте набор теневых функций, случайным образом переставляя значения каждой функции.
- Обучите модель (например, Random Forest) на исходных функциях и соответствующих им теневых функциях.
- Подсчитайте важность каждого признака и сравните его с важностью теневых признаков.
- Выберите объекты со значительно большей важностью, чем теневые объекты.
Реализация 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!
Удачи на этой неделе,
Пратюш