Schrittweise Regression ist eine leistungsstarke Technik zur Auswahl der relevantesten Prädiktorvariablen in einem Regressionsmodell. Durch iteratives Hinzufügen oder Entfernen von Variablen basierend auf statistischer Signifikanz hilft sie, sparsame Modelle zu erstellen, die leichter zu interpretieren sind und weniger anfällig für Overfitting sind. Dieser Artikel untersucht verschiedene Methoden zur Durchführung schrittweiser Regression in Python, unter Verwendung beliebter Bibliotheken wie statsmodels
, scikit-learn
(sklearn
) und mlxtend
.
Inhaltsverzeichnis
- Vorwärtsselektion
- Rückwärtsselektion
- Schrittweise Selektion (bidirektional)
- Schrittweise Regression mit
statsmodels
- Schrittweise Regression mit
sklearn
- Schrittweise Regression mit
mlxtend
- Wahl der richtigen Methode und Überlegungen
Vorwärtsselektion
Die Vorwärtsselektion beginnt mit einem leeren Modell und fügt iterativ die Prädiktorvariable hinzu, die die Modellgüte am signifikantesten verbessert. Diese Verbesserung wird typischerweise anhand von Metriken wie der F-Statistik, AIC (Akaike Information Criterion) oder BIC (Bayesian Information Criterion) bewertet. Der Prozess wird fortgesetzt, bis das Hinzufügen einer weiteren Variablen keine statistisch signifikante Verbesserung mehr liefert.
Rückwärtsselektion
Die Rückwärtsselektion verfolgt den umgekehrten Ansatz. Sie beginnt mit einem Modell, das alle Prädiktorvariablen enthält, und entfernt iterativ die am wenigsten signifikante Variable. Die Variable mit dem höchsten p-Wert (oder der niedrigsten F-Statistik) wird in jedem Schritt entfernt, vorausgesetzt, ihre Entfernung verschlechtert die Modellgüte nicht signifikant. Dies wird fortgesetzt, bis das Entfernen einer verbleibenden Variablen die Leistung des Modells signifikant verschlechtert.
Schrittweise Selektion (bidirektional)
Die schrittweise Selektion kombiniert die Stärken der Vorwärts- und Rückwärtsselektion. Sie beginnt entweder mit einem leeren Modell (wie die Vorwärtsselektion) oder einem vollständigen Modell (wie die Rückwärtsselektion) und fügt iterativ Variablen hinzu oder entfernt sie basierend auf ihrer Signifikanz. Dies ermöglicht eine flexiblere und potenziell optimale Teilmenge von Prädiktoren.
Schrittweise Regression mit statsmodels
statsmodels
verfügt nicht über eine eingebaute Funktion für schrittweise Regression, aber wir können die Vorwärtsselektion manuell unter Verwendung des OLS
-Modells (Ordinary Least Squares) implementieren:
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols
# Beispieldaten
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"Ausgewählte Merkmale: {selected_features}")
final_model = sm.OLS(df['y'], sm.add_constant(df[selected_features])).fit()
print(final_model.summary())
Schrittweise Regression mit sklearn
sklearn
verwendet Recursive Feature Elimination (RFE) zur Merkmalsauswahl. RFE entfernt iterativ Merkmale basierend auf ihren Wichtigkeitswerten aus einem Basismodell (wie lineare Regression):
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) # Nach Bedarf anpassen
rfe = rfe.fit(X_train, y_train)
print(f"Ausgewählte Merkmale: {X.columns[rfe.support_]}")
final_model = LinearRegression().fit(X_train[X.columns[rfe.support_]], y_train)
print(f"R-Quadrat auf Testdatensatz: {final_model.score(X_test[X.columns[rfe.support_]], y_test)}")
Schrittweise Regression mit mlxtend
mlxtend
’s SequentialFeatureSelector
bietet eine bequeme Möglichkeit, Vorwärts-, Rückwärts- oder schrittweise Selektion durchzuführen:
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) #Vorwärtsselektion
sfs = sfs.fit(X, y)
print(f"Ausgewählte Merkmale: {list(sfs.k_feature_idx_)}")
final_model = LinearRegression().fit(X[X.columns[list(sfs.k_feature_idx_)]], y)
Wahl der richtigen Methode und Überlegungen
Die Wahl der schrittweisen Regressionsmethode (Vorwärts, Rückwärts oder schrittweise) und der verwendeten Bibliothek hängt von den spezifischen Daten und Zielen ab. Berücksichtigen Sie Folgendes:
- Datengröße: Rückwärtsselektion kann bei einer großen Anzahl von Prädiktoren rechenintensiv sein.
- Multikollinearität: Schrittweise Methoden können mit hoch korrelierten Prädiktoren zu kämpfen haben.
- Interpretierbarkeit vs. Vorhersagegenauigkeit: Ein einfacheres Modell (weniger Variablen) ist möglicherweise leichter zu interpretieren, auch wenn es etwas weniger genau ist.
- Kreuzvalidierung: Validieren Sie Ihr Modell immer mit Techniken wie der k-fachen Kreuzvalidierung, um die Generalisierbarkeit sicherzustellen.
Schrittweise Regression sollte mit Vorsicht angewendet werden. Sie kann zu instabilen Modellen führen, die sich nicht gut auf neue Daten verallgemeinern lassen. Ziehen Sie in Betracht, andere Merkmalsauswahlmethoden wie LASSO oder Ridge-Regression zu untersuchen, die Regularisierung verwenden, um Overfitting zu behandeln.