Machine Learning

Schrittweise Regression in Python meistern: Ein umfassender Leitfaden

Spread the love

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

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert