Machine Learning

Пошаговая регрессия в Python: Полное руководство

Spread the love

Пошаговая регрессия — мощный метод отбора наиболее релевантных предикторных переменных в регрессионной модели. Путем итеративного добавления или удаления переменных на основе статистической значимости, он помогает строить экономные модели, которые легче интерпретировать и которые менее подвержены переобучению. В этой статье рассматриваются различные методы выполнения пошаговой регрессии в Python, используя популярные библиотеки, такие как statsmodels, scikit-learn (sklearn) и mlxtend.

Оглавление

Прямой отбор

Прямой отбор начинается с пустой модели и итеративно добавляет предикторную переменную, которая наиболее значительно улучшает качество подгонки модели. Это улучшение обычно оценивается с помощью таких метрик, как F-статистика, AIC (информационный критерий Акаике) или BIC (байесовский информационный критерий). Процесс продолжается до тех пор, пока добавление другой переменной не обеспечит статистически значимого улучшения.

Обратное исключение

Обратное исключение использует противоположный подход. Оно начинается с модели, включающей все предикторные переменные, и итеративно удаляет наименее значимую переменную. Переменная с наибольшим p-значением (или наименьшей F-статистикой) удаляется на каждом шаге, при условии, что ее удаление не ухудшает качество подгонки модели. Это продолжается до тех пор, пока удаление любой оставшейся переменной не приведет к значительному ухудшению производительности модели.

Пошаговый отбор (двунаправленный)

Пошаговый отбор сочетает в себе преимущества прямого и обратного отбора. Он начинается либо с пустой модели (как прямой отбор), либо с полной модели (как обратное исключение) и итеративно добавляет или удаляет переменные в зависимости от их значимости. Это позволяет получить более гибкий и потенциально оптимальный поднабор предикторов.

Пошаговая регрессия с statsmodels

statsmodels не имеет встроенной функции пошаговой регрессии, но мы можем вручную реализовать прямой отбор, используя его модель OLS (обыкновенные наименьшие квадраты):


import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols

# Пример данных
data = {'y': [10, 12, 15, 18, 20, 22, 25, 28, 30, 32],
        'x1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        'x2': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20],
        'x3': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]}
df = pd.DataFrame(data)

def forward_selection(data, target, significance_level=0.05):
    included = []
    while True:
        changed=False
        excluded = list(set(data.columns)-set(included)-{target})
        best_pvalue = 1.0
        best_feature = None
        for new_column in excluded:
            model = sm.OLS(target, sm.add_constant(data[included+[new_column]])).fit()
            pvalue = model.pvalues[new_column]
            if pvalue < best_pvalue:
                best_pvalue = pvalue
                best_feature = new_column
        if best_pvalue < significance_level:
            included.append(best_feature)
            changed=True
        if not changed: break
    return included

selected_features = forward_selection(df, df['y'])
print(f"Выбранные признаки: {selected_features}")
final_model = sm.OLS(df['y'], sm.add_constant(df[selected_features])).fit()
print(final_model.summary())

Пошаговая регрессия с sklearn

sklearn использует рекурсивное исключение признаков (RFE) для отбора признаков. RFE итеративно удаляет признаки на основе их оценок важности из базовой модели (например, линейной регрессии):


from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFE
from sklearn.model_selection import train_test_split

X = df.drop('y', axis=1)
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
rfe = RFE(model, n_features_to_select=2) # Настроить по необходимости
rfe = rfe.fit(X_train, y_train)

print(f"Выбранные признаки: {X.columns[rfe.support_]}")

final_model = LinearRegression().fit(X_train[X.columns[rfe.support_]], y_train)
print(f"R-квадрат на тестовом наборе: {final_model.score(X_test[X.columns[rfe.support_]], y_test)}")

Пошаговая регрессия с mlxtend

SequentialFeatureSelector из библиотеки mlxtend предоставляет удобный способ выполнения прямого, обратного или пошагового отбора:


from mlxtend.feature_selection import SequentialFeatureSelector as SFS
from sklearn.linear_model import LinearRegression

model = LinearRegression()
sfs = SFS(model, k_features='best', forward=True, floating=False, scoring='r2', cv=5) #прямой отбор

sfs = sfs.fit(X, y)

print(f"Выбранные признаки: {list(sfs.k_feature_idx_)}")

final_model = LinearRegression().fit(X[X.columns[list(sfs.k_feature_idx_)]], y)

Выбор правильного метода и соображения

Выбор метода пошаговой регрессии (прямой, обратный или пошаговый) и используемой библиотеки зависит от конкретного набора данных и целей. Необходимо учитывать:

  • Размер данных: Обратное исключение может быть вычислительно дорогостоящим при большом количестве предикторов.
  • Мультиколлинеарность: Пошаговые методы могут испытывать трудности с сильно коррелированными предикторами.
  • Интерпретируемость против предсказательной точности: Более простая модель (меньше переменных) может быть легче интерпретировать, даже если она немного менее точна.
  • Кросс-валидация: Всегда проверяйте свою модель с помощью таких методов, как k-кратная кросс-валидация, чтобы обеспечить обобщаемость.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *