Powrót do strony głównej

Wielokrotna regresja w Pythonie: scikit-learn

Artykuł omawia wielokrotną regresję liniową na zbiorze danych Advertising. Opisano matematyczną podstawę, przygotowanie danych, uczenie modelu LinearRegression, metryki jakości (R²=0.90) i diagnostykę reszt.

Zbuduj wielokrotną regresję: TV, Radio, Sales
Advertisement 728x90

Regresja liniowa wielowymiarowa: model z wieloma predyktorami w Pythonie

Regresja liniowa wielowymiarowa rozszerza prostą regresję o wiele zmiennych niezależnych. Model tworzy hiperpłaszczyznę w przestrzeni wielowymiarowej, aby przewidywać zmienną docelową Y na podstawie predyktorów X1–Xn. Współczynniki βi pokazują izolowane wpływy poszczególnych czynników przy ustalonych pozostałych. Na zbiorze danych Advertising przewidujemy sprzedaż na podstawie budżetów TV, Radio i Gazety.

Sformułowanie matematyczne

Równanie modelu:

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

Google AdInline article slot

β₀ — wyraz wolny, βi — współczynniki regresji, ε — reszty. Optymalne wartości β oblicza się metodą najmniejszych kwadratów:

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

X — rozszerzona macierz cech (z kolumną jedynkową), y — wektor wartości docelowych. Zakłada się liniową zależność oraz homoskedastyczność reszt.

Google AdInline article slot

Przygotowanie danych

Podziel dane na zestawy treningowy/testowy (80/20), aby ocenić zdolność uogólniania i zapobiec przeuczeniu. Dla cech kategorycznych zastosuj kodowanie One-Hot. Standaryzuj cechy za pomocą StandardScaler dla lepszej interpretacji współczynników.

Kluczowe kroki przygotowania:

  • Sprawdź braki danych i wartości odstające.
  • Zdekoduj zmienne kategoryczne.
  • Podziel próbkę: train_test_split(X, y, test_size=0.2, random_state=42).
  • Skaluj dane: StandardScaler().fit_transform(X_train).

Implementacja na zbiorze danych Advertising

Zbiór danych: 200 obserwacji, sprzedaż (Sales) w zależności od budżetów TV, Radio, Gazety.

Google AdInline article slot

Import i załadowanie

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"Rozmiar danych: {df.shape}")

Pierwsze wiersze:

| TV | Radio | Newspaper | Sales |

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

| 230.1 | 37.8 | 69.2 | 22.1 |

| 44.5 | 39.3 | 45.1 | 10.4 |

EDA i korelacje

Statystyka:

| | TV | Radio | Newspaper | Sales |

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

| mean | 147.04 | 23.26 | 30.55 | 14.02 |

| std | 85.85 | 14.85 | 21.78 | 5.22 |

Korelacje z Sales: TV (0.78), Radio (0.58), Newspaper (0.23).

Wykresy rozproszenia pokazują silną zależność liniową między TV a Sales oraz Radio a Sales, słabszą dla Newspaper.

Szkolenie modelu

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"Intercept: {model.intercept_:.4f}")
for name, coef in zip(X.columns, model.coef_):
    print(f"{name}: {coef:.4f}")

Wynik:

  • Intercept: 2.9791
  • TV: 0.0447
  • Radio: 0.1892
  • Newspaper: 0.0028

Interpretacja: +1 tys. $ na TV daje +44.7 sprzedaży, na Radio — +189.2, gazeta jest nieistotna.

Ocena modelu

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}")

Metryki:

  • MSE: 3.17
  • RMSE: 1.78
  • MAE: 1.46
  • R²: 0.8994

R²=0.90 oznacza, że model wyjaśnia 90% wariancji. RMSE/MAE podają skalę błędu w jednostkach sprzedaży.

Diagnostyka reszt

  • Histogram reszt: symetryczny wokół zera.
  • Reszty vs przewidywania: brak wzorców (homoskedastyczność).
  • Punkty na wykresie y_test vs y_pred leżą blisko przekątnej.

Co warto wiedzieć

  • Regresja wielowymiarowa izoluje wpływ predyktorów, kontrolując skryte czynniki.
  • Współczynnik Newspaper≈0 wskazuje na jego nieistotność w modelu.
  • R²=0.90 — wysoka siła wyjaśniająca, ale sprawdź wielokolinearność (VIF).
  • Zawsze analizuj reszty do weryfikacji założeń liniowości i normalności.
  • Standaryzacja nie jest konieczna dla OLS, ale pomaga w interpretacji.

— Editorial Team

Advertisement 728x90

Czytaj dalej