Zurück zur Startseite

Mehrfache Regression in Python: scikit-learn

Der Artikel behandelt mehrfache lineare Regression am Advertising-Datensatz. Beschreibt mathematische Grundlage, Datenaufbereitung, Training des LinearRegression-Modells, Qualitätsmetriken (R²=0.90) und Residuen-Diagnostik.

Mehrfache Regression erstellen: TV, Radio, Sales
Advertisement 728x90

Mehrfachlineare Regression in Python: Modellierung mit mehreren Prädiktoren

Die mehrfachlineare Regression erweitert die einfache Regression, indem sie mehrere unabhängige Variablen einbezieht. Das Modell passt eine Hyperebene im mehrdimensionalen Raum an, um die Zielvariable Y basierend auf den Prädiktoren X₁ bis Xₙ vorherzusagen. Jeder Koeffizient βᵢ spiegelt den isolierten Einfluss seiner jeweiligen Variable wider, während alle anderen Variablen konstant gehalten werden. Anhand des Advertising-Datensatzes prognostizieren wir den Umsatz anhand der Budgets für TV-, Radio- und Zeitungsanzeigen.

Mathematische Formulierung

Die Modellgleichung lautet:

Y = β₀ + β₁X₁ + β₂X₂ + ⋯ + βₙXₙ + ε

Google AdInline article slot

β₀ ist der Achsenabschnitt, βᵢ sind die Regressionskoeffizienten und ε steht für die Residuen. Die optimalen β-Werte werden mittels der Methode der kleinsten Quadrate (OLS) berechnet:

β̂ = (XᵀX)⁻¹Xᵀy

Hierbei ist X die erweiterte Merkmalsmatrix (mit einer Spalte aus Einsen) und y der Zielvektor. Zu den zentralen Annahmen gehören lineare Beziehungen sowie Homoskedastizität der Residuen.

Google AdInline article slot

Datenvorbereitung

Teilen Sie die Daten in Trainings- und Testsets (80/20), um die Generalisierungsfähigkeit zu bewerten und Überanpassung zu vermeiden. Wenden Sie One-Hot-Encoding für kategoriale Merkmale an und verwenden Sie StandardScaler zur Standardisierung numerischer Features – dies verbessert die Interpretierbarkeit der Koeffizienten.

Wichtige Schritte der Vorbereitung:

  • Überprüfung auf fehlende Werte und Ausreißer.
  • Kodierung kategorialer Variablen.
  • Aufteilung des Datensatzes: train_test_split(X, y, test_size=0.2, random_state=42).
  • Skalierung der Merkmale: StandardScaler().fit_transform(X_train).

Implementierung am Advertising-Datensatz

Daten: 200 Beobachtungen, Vorhersage von Sales basierend auf TV-, Radio- und Zeitungsanzeigenbudgets.

Google AdInline article slot

Import und Datenladen

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error

plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")

df = pd.read_csv("Advertising.csv")
if 'Unnamed: 0' in df.columns:
    df = df.drop('Unnamed: 0', axis=1)
df.columns = ['TV', 'Radio', 'Newspaper', 'Sales']
print(df.head())
print(f"Datenmenge: {df.shape}")

Erste Zeilen:

| TV | Radio | Newspaper | Sales |

|-------|-------|-----------|-------|

| 230.1 | 37.8 | 69.2 | 22.1 |

| 44.5 | 39.3 | 45.1 | 10.4 |

EDA und Korrelationen

Zusammenfassende Statistiken:

| | TV | Radio | Newspaper | Sales |

|-------|--------|-------|-----------|-------|

| mean | 147.04 | 23.26 | 30.55 | 14.02 |

| std | 85.85 | 14.85 | 21.78 | 5.22 |

Korrelation mit Sales: TV (0,78), Radio (0,58), Newspaper (0,23).

Streuplott-Diagramme zeigen starke lineare Beziehungen zwischen TV-Sales und Radio-Sales, aber nur eine schwache Verbindung für Newspaper.

Modelltraining

X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

print(f"Achsenabschnitt: {model.intercept_:.4f}")
for name, coef in zip(X.columns, model.coef_):
    print(f"{name}: {coef:.4f}")

Ergebnisse:

  • Achsenabschnitt: 2,9791
  • TV: 0,0447
  • Radio: 0,1892
  • Newspaper: 0,0028

Interpretation: Bei jeder Erhöhung der TV-Anzeigen um 1.000 € steigt der Umsatz um etwa 44,7 Einheiten; Radio bringt etwa 189,2 zusätzliche Einheiten. Newspaper hat praktisch keinen Einfluss.

Modellbewertung

y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse:.2f}, RMSE: {rmse:.2f}, MAE: {mae:.2f}, R²: {r2:.4f}")

Metriken:

  • MSE: 3,17
  • RMSE: 1,78
  • MAE: 1,46
  • R²: 0,8994

Ein R² von 0,90 bedeutet, dass das Modell 90 % der Varianz im Umsatz erklärt. RMSE und MAE geben die Fehlergröße in realen Umsatz-Einheiten an.

Residuenanalyse

  • Histogramm der Residuen: symmetrisch um null.
  • Residuen vs. Vorhersagen: keine erkennbaren Muster (Homoskedastizität).
  • Streudiagramm aus tatsächlichen vs. vorhergesagten Werten zeigt Punkte dicht entlang der Diagonalen.

Wichtige Erkenntnisse

  • Die mehrfache Regression isoliert die Effekte einzelner Prädiktoren, während Konfundierer kontrolliert werden.
  • Der nahezu Null-Koeffizient für Newspaper deutet darauf hin, dass es wenig prognostische Wert beisteuert.
  • R² = 0,90 zeigt starke erklärende Kraft, doch immer VIF zur Prüfung von Multikollinearität prüfen.
  • Residuen immer analysieren, um Annahmen der Linearität und Normalverteilung zu validieren.
  • Skalierung ist für OLS nicht zwingend erforderlich, verbessert aber die Interpretierbarkeit der Koeffizienten.

— Editorial Team

Advertisement 728x90

Weiterlesen