Regresja wielomianowa z wykorzystanem biblioteki Sklearn.
Analiza z wykorzytaniem regresji wielomianowej.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
# Tworzymy dane syntetyczne: ceny (y) rosną nieliniowo względem wielkości (x)
np.random.seed(42)
X = np.linspace(0, 10, 100)
y = 2 + 3 * X - 0.5 * X ** 2 + np.random.normal(0, 2, size=X.shape) # nieliniowa zależność
X = X.reshape(-1, 1)
# Dzielimy dane na uczące i testowe
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# Testujemy różne stopnie wielomianu
for degree in [1, 2, 3, 9]:
# Tworzymy cechy wielomianowe
poly = PolynomialFeatures(degree=degree)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
# Trenujemy model
model = LinearRegression()
model.fit(X_train_poly, y_train)
# Predykcja
y_pred_train = model.predict(X_train_poly)
y_pred_test = model.predict(X_test_poly)
# Błędy
train_error = mean_absolute_error(y_train, y_pred_train)
test_error = mean_absolute_error(y_test, y_pred_test)
# Wydruk błędów
print(f"\nStopień wielomianu: {degree}")
print(f" Błąd MAE (train): {train_error:.2f}")
print(f" Błąd MAE (test): {test_error:.2f}")
# Wykres
plt.figure(figsize=(8, 4))
plt.scatter(X, y, color='blue', s=10, label='Dane rzeczywiste')
# Krzywa predykcji
X_range = np.linspace(0, 10, 300).reshape(-1, 1)
X_range_poly = poly.transform(X_range)
y_range_pred = model.predict(X_range_poly)
plt.plot(X_range, y_range_pred, color='red', linewidth=2, label=f'Dopasowanie (deg {degree})')
plt.title(f"Regresja wielomianowa (stopień {degree})")
plt.xlabel("X (np. wiek, rozmiar)")
plt.ylabel("Y (np. cena, koszty)")
plt.legend()
plt.grid(True)
plt.show()
Wyjaśnienie zjawiska overfittingu. Jeżeli podążymy w wielomian zbyt wysokiego stopnia, mode będzie odwzorowywał dane uczące, ale słabo będzie przewidywał.
Wielomian 1 stopnia.
Wielomian 2 stopnia.
Wielomian 3 stopnia. Wartość "le13" w lewej górnej części wykresu oznacza potęgę do której podniesione są wartości osi y.
Wielomian 4 stopnia.