Regresja#
Autor sekcji: dr Filip Wójcik.
W polskiej literaturze termin „regresja” często bywa utożsamiany z (prostą) regresją liniową, podczas gdy w anglojęzycznym piśmiennictwie termin ten odnosi się do szerszego zagadnienia przewidywania wartości numerycznych (ciągłych). Regresja to fundamentalne zadanie w uczeniu maszynowym, które polega na przewidywaniu wartości liczbowych na podstawie dostępnych danych wejściowych. Jakość modelu regresyjnego ocenia się za pomocą różnych metryk, które mierzą różnice między przewidywanymi a rzeczywistymi wartościami.
Formalnie:
- Regresja#
(ang. regression), w szerokim rozumieniu tego terminu, jest zadaniem w uczeniu maszynowym polegającym na przewidywaniu wartości numerycznych (ciągłych) na podstawie dostępnych danych wejściowych.
Dany jest zbiór wejściowy \(\mathcal{X}\) oraz zbiór wartości docelowych \(\mathcal{Y} \subseteq \mathbb{R}\). Próbka ucząca \(S = \left\{ (\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), \dots, (\mathbf{x}_m, y_m) \right\} \subseteq \mathcal{X} \times \mathcal{Y}\) składa się z \(m\) par, gdzie każdy wektor wejściowy \(\mathbf{x}_i \in \mathcal{X}\) jest losowany zgodnie z (nieznanym) rozkładem prawdopodobieństwa \(D\), a odpowiadające mu etykiety \(y_i \in \mathcal{Y}\) są generowane zgodnie z funkcją docelową \(y = f(\mathbf{x}) + \epsilon\), gdzie \(f: \mathcal{X} \to \mathbb{R}\) jest nieznaną funkcją, a \(\epsilon\) jest nieredukowalnym błędem losowym, \(\epsilon \sim \mathcal{N}(0, \sigma^2)\).
Celem regresji jest znalezienie modelu (zwanego również estymatorem) funkcji \(f\), który przybliży ją na podstawie próbki uczącej \(S\).
Ponieważ wartości docelowe należą do zbioru liczb rzeczywistych, stworzenie modelu, który przewiduje te wartości bezbłędnie, jest mało realistyczne. Dlatego w zadaniu regresji oczekuje się, aby model przewidywał wartości możliwie jak najbliższe rzeczywistym wartościom docelowym. Poziom spełnienia tego zadania oceniany jest za pomocą dedykowanych metryk.
Poniżej omówione zostaną najważniejsze metryki regresji, takie jak błąd średniokwadratowy/ ang. Mean Square Error (MSE), pierwiastek błędu średniokwadratowego/ ang. Root Mean Square Error (RMSE), średni błąd bezwzględny / ang. Mean Absolute Error (MAE) oraz średni bezwzględny błąd procentowy/ang. Mean Absolute Percentage Error (MAPE). Dla każdej metryki podane będą wzory oraz przykłady kodu w Pythonie, wykorzystujące wbudowane zbiory danych z biblioteki Scikit-learn
.
Błąd średniokwadratowy / ang. Mean Square Error (MSE)#
- Błąd średniokwadratowy#
ang. Mean Square Error (MSE), to jedna z najczęściej używanych metryk do oceny modeli regresyjnych. MSE mierzy średnią kwadratową różnicę między przewidywanymi a rzeczywistymi wartościami. Podnoszenie błędów do kwadratu ma na celu podkreślenie większych odchyleń, co sprawia, że MSE jest szczególnie czuła na duże błędy.
Z drugiej strony - forma równania umozliwia łatwe przekształcenia, które ułatwiają skracanie niektórych wyrażeń podczas liczenia np. gradientów błędów.
Formalnie:
\[ \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 \]gdzie:
\(y_i\) to rzeczywista wartość,
\(\hat{y}_i\) to przewidywana wartość,
\(N\) to liczba obserwacji.
Przykład kodu w Pythonie:
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# Ładowanie danych Boston Housing
data = fetch_california_housing()
X, y = data.data, data.target
# Podział na zbiór treningowy i testowy
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Trenowanie modelu regresji liniowej
model = LinearRegression()
model.fit(X_train, y_train)
# Przewidywanie wartości na zbiorze testowym
y_pred = model.predict(X_test)
# Obliczanie MSE
mse = mean_squared_error(y_test, y_pred)
print(f'Błąd średniokwadratowy (MSE): {mse:.4f}')
Błąd średniokwadratowy (MSE): 0.5306
Pierwiastek błędu średniokwadratowego / ang. Root Mean Square Error (RMSE)#
- Pierwiastek błędu średniokwadratowego#
ang. Root Mean Square Error (RMSE), jest metryką będącą pierwiastkiem kwadratowym z MSE. RMSE, podobnie jak MSE, karze większe błędy, ale ma tę zaletę, że jest wyrażona w tych samych jednostkach co przewidywane wartości, co ułatwia interpretację.
Wzór na RMSE:
\[ \text{RMSE} = \sqrt{\text{MSE}} = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2} \]
Przykład kodu w Pythonie:
import numpy as np
# Obliczanie RMSE
rmse = np.sqrt(mse)
print(f'Pierwiastek błędu średniokwadratowego (RMSE): {rmse:.4f}')
Pierwiastek błędu średniokwadratowego (RMSE): 0.7284
Średni błąd bezwzględny / ang. Mean Absolute Error (MAE)#
- Średni błąd bezwzględny#
ang. Mean Absolute Error (MAE) mierzy średnią wartość bezwzględnej różnicy między przewidywaniami a rzeczywistymi wartościami. MAE jest mniej czuła na duże błędy w porównaniu do MSE i RMSE, ponieważ nie wykonuje operacji potęgowania. Z drugiej strony - ze względu na użycie wartości bezwzględnej, nie wskazuje na to, czy model przeszacowuje czy niedoszacowuje wartości.
Wzór na MAE:
\[ \text{MAE} = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i| \]
Przykład kodu w Pythonie:
from sklearn.metrics import mean_absolute_error
# Obliczanie MAE
mae = mean_absolute_error(y_test, y_pred)
print(f'Średni błąd bezwzględny (MAE): {mae:.4f}')
Średni błąd bezwzględny (MAE): 0.5272
Średni bezwzględny błąd procentowy / ang. Mean Absolute Percentage Error (MAPE)#
- Średni bezwzględny błąd procentowy#
ang. Mean Absolute Percentage Error (MAPE) mierzy średni procentowy błąd przewidywań w stosunku do rzeczywistych wartości. MAPE jest szczególnie przydatna, gdy chcemy ocenić dokładność przewidywań w kategoriach procentowych, a zatem relatywnie łatwo interpretowalna. Jednakże, ze względu na użycie wartości bezwzględnej, nie wskazuje na to, czy model przeszacowuje czy niedoszacowuje wartości.
Wzór na MAPE:
\[ \text{MAPE} = \frac{100\%}{N} \sum_{i=1}^{N} \left|\frac{y_i - \hat{y}_i}{y_i}\right| \]
Mylące wartości MAPE
Warto zwrócić uwagę, że metryka MAPE może być myląca, w dwóch sytuacjach.
Gdy wartości rzeczywiste są bliskie zeru, ponieważ wtedy wartość mianownika jest bardzo mała, co może prowadzić do niestabilnych wyników.
MAPE może wykazać jednakową różnicę procentową dla kompletnie różnych skal wartości. Przykładowo:
Model 1: rzeczywista wartość = 100, przewidywana wartość = 110, MAPE = 10%,
Model 2: rzeczywista wartość = 1000, przewidywana wartość = 1100, MAPE = 10%.
W niektórych zastosowaniach biznesowych (np. finansach), różnica 10% dla wartości 100 i 1000 może mieć zupełnie różne konsekwencje.
Przykład kodu w Pythonie:
def mean_absolute_percentage_error(y_true, y_pred):
y_true, y_pred = np.array(y_true), np.array(y_pred)
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
# Obliczanie MAPE
mape = mean_absolute_percentage_error(y_test, y_pred)
print(f'Średni bezwzględny błąd procentowy (MAPE): {mape:.2f}%')
Średni bezwzględny błąd procentowy (MAPE): 31.75%