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ₙ + ε
β₀ — 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.
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.
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
Brak komentarzy.