Projekt: Przewidywanie cen domów (House Prices Regression)¶

W tym projekcie wykorzystamy PyCaret do przewidywania cen sprzedaży domów.

Regresja to metoda przewidywania wartości liczbowych (w tym przypadku cen domów) na podstawie różnych cech (np. powierzchnia, liczba pokoi, lokalizacja).

Krok 1: Import bibliotek¶

Najpierw importujemy narzędzia potrzebne do pracy z danymi i uczenia maszynowego.

In [1]:
# pandas - narzędzie do pracy z tabelami danych (jak Excel w Pythonie)
import pandas as pd

# pycaret.regression - moduł do regresji (przewidywania wartości liczbowych)
from pycaret.regression import *

Krok 2: Wczytanie danych z pliku CSV¶

Wczytujemy dane o domach - ich cechy (powierzchnia, liczba pokoi, etc.) i ceny sprzedaży.

In [2]:
# Wczytujemy dane z pliku CSV do zmiennej 'data'
# read_csv() - funkcja która czyta plik CSV i tworzy z niego tabelę
data = pd.read_csv('data/house_prices.csv')

# Wyświetlamy pierwsze 5 wierszy, żeby zobaczyć jak wyglądają dane
# head() - pokazuje początek tabeli
print("Pierwsze wiersze danych:")
data.head()
Pierwsze wiersze danych:
Out[2]:
Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape LandContour Utilities ... PoolArea PoolQC Fence MiscFeature MiscVal MoSold YrSold SaleType SaleCondition SalePrice
0 1 60 RL 65.0 8450 Pave NaN Reg Lvl AllPub ... 0 NaN NaN NaN 0 2 2008 WD Normal 208500
1 2 20 RL 80.0 9600 Pave NaN Reg Lvl AllPub ... 0 NaN NaN NaN 0 5 2007 WD Normal 181500
2 3 60 RL 68.0 11250 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 9 2008 WD Normal 223500
3 4 70 RL 60.0 9550 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 2 2006 WD Abnorml 140000
4 5 60 RL 84.0 14260 Pave NaN IR1 Lvl AllPub ... 0 NaN NaN NaN 0 12 2008 WD Normal 250000

5 rows × 81 columns

Krok 3: Przygotowanie danych do uczenia maszynowego¶

PyCaret automatycznie przygotuje dane - podzieli je na część treningową (do nauki) i testową (do sprawdzenia). Powiemy mu, że chcemy przewidywać kolumnę "SalePrice" (cenę sprzedaży domu).

In [3]:
# setup() - funkcja która przygotowuje dane do uczenia maszynowego
# data=data - nasze dane o domach
# target='SalePrice' - mówimy PyCaret, że chcemy przewidywać kolumnę 'SalePrice' (cena sprzedaży)
# session_id=123 - liczba dla powtarzalności wyników (żeby za każdym razem dostać takie same wyniki)

reg = setup(data=data, target='SalePrice', session_id=123)
  Description Value
0 Session id 123
1 Target SalePrice
2 Target type Regression
3 Original data shape (1460, 81)
4 Transformed data shape (1460, 279)
5 Transformed train set shape (1021, 279)
6 Transformed test set shape (439, 279)
7 Numeric features 37
8 Categorical features 43
9 Rows with missing values 100.0%
10 Preprocess True
11 Imputation type simple
12 Numeric imputation mean
13 Categorical imputation mode
14 Maximum one-hot encoding 25
15 Encoding method None
16 Fold Generator KFold
17 Fold Number 10
18 CPU Jobs -1
19 Use GPU False
20 Log Experiment False
21 Experiment Name reg-default-name
22 USI faea

Krok 4: Porównanie wszystkich modeli regresyjnych¶

Teraz PyCaret przetestuje wiele różnych algorytmów regresji i pokaże, który najlepiej przewiduje ceny. To zajmie chwilę - komputer uczy różne modele i porównuje ich dokładność.

In [4]:
# compare_models() - testuje wszystkie dostępne modele regresji
# Zwraca tabelę z wynikami, gdzie każdy wiersz to inny algorytm
# Modele są posortowane od najlepszego do najgorszego
# MAE (Mean Absolute Error) - średni błąd przewidywania (im niższy, tym lepiej)
# RMSE (Root Mean Squared Error) - pierwiastek ze średniego kwadratu błędów (im niższy, tym lepiej)

best_model = compare_models()
  Model MAE MSE RMSE R2 RMSLE MAPE TT (Sec)
gbr Gradient Boosting Regressor 17276.3461 847357928.1180 28313.9245 0.8723 0.1377 0.1000 0.2820
lightgbm Light Gradient Boosting Machine 17701.1514 1019922835.2337 31002.5633 0.8484 0.1449 0.1020 0.3470
rf Random Forest Regressor 19042.9144 1117550843.2233 32426.1601 0.8345 0.1545 0.1114 0.4240
et Extra Trees Regressor 18873.1767 1163678875.5551 32786.9480 0.8327 0.1513 0.1095 0.4350
ada AdaBoost Regressor 25963.6459 1417400709.1888 37051.1993 0.7868 0.2056 0.1679 0.2340
llar Lasso Least Angle Regression 18774.5227 1406152263.2702 34868.7879 0.7845 0.1670 0.1124 0.1660
ridge Ridge Regression 20081.3998 1526032661.7945 36561.0633 0.7668 0.2087 0.1213 0.1580
en Elastic Net 21115.3002 1782962549.6151 38958.8760 0.7382 0.1739 0.1218 0.1920
omp Orthogonal Matching Pursuit 22617.0267 1808808421.5105 39503.1460 0.7344 0.1856 0.1343 0.1560
lasso Lasso Regression 20570.3408 1877626177.9343 40440.0086 0.6892 0.1946 0.1249 0.5510
br Bayesian Ridge 25714.2716 2249752076.5234 44691.0009 0.6654 0.2089 0.1499 0.1590
huber Huber Regressor 28104.0526 2263461839.4656 45545.7634 0.6556 0.2235 0.1703 0.2120
dt Decision Tree Regressor 28297.5840 2270977787.3423 46416.3614 0.6555 0.2233 0.1623 0.1690
knn K Neighbors Regressor 30748.5216 2304210126.1128 47356.9977 0.6490 0.2339 0.1807 0.1570
dummy Dummy Regressor 58218.1257 6558664005.0021 80446.7191 -0.0065 0.4146 0.3714 0.1550
par Passive Aggressive Regressor 47720.8071 10382498463.1984 76446.7184 -0.8692 0.3070 0.3026 0.1590
lr Linear Regression 39312569.0012 222477607190531808.0000 246441124.9222 -30259957.0668 0.8442 350.0721 0.7120
lar Least Angle Regression 1516799024373579505878769514543962914816.0000 815434204655696141595561074217079057248294011386514711630330477674825420770377728.0000 9030139562215032808510627921918280335360.0000 -99601094557373619053425121425857790625027113956046091633324534907535360.0000 27.4116 18142275082411613176980644921606144.0000 0.1750

Krok 5: Wyświetlenie informacji o najlepszym modelu¶

Sprawdźmy, jaki model został wybrany jako najlepszy.

In [5]:
# Wyświetlamy nazwę wybranego modelu
# best_model to zmienna zawierająca najlepszy algorytm z poprzedniego kroku
print("Najlepszy model:")
print(best_model)
Najlepszy model:
GradientBoostingRegressor(random_state=123)

Krok 6: Dokładna ocena najlepszego modelu¶

Sprawdźmy dokładnie, jak dobrze działa nasz najlepszy model. Zobaczymy różne metryki błędów - im niższe wartości, tym lepiej model przewiduje ceny.

In [6]:
# evaluate_model() - pokazuje szczegółowe informacje o jakości modelu
# Wyświetli różne wykresy i tabele z wynikami
# Najważniejsze metryki:
# - MAE (Mean Absolute Error) - średni błąd w dolarach
# - RMSE (Root Mean Squared Error) - pierwiastek ze średniego kwadratu błędów

evaluate_model(best_model)
interactive(children=(ToggleButtons(description='Plot Type:', icons=('',), options=(('Pipeline Plot', 'pipelin…

Krok 7: Zapisanie modelu do pliku¶

Teraz zapiszemy wytrenowany model do pliku, żeby móc go użyć później bez ponownego trenowania. Dzięki temu nie musimy za każdym razem uczyć modelu od nowa - możemy go po prostu wczytać z pliku.

In [7]:
# save_model() - zapisuje wytrenowany model do pliku
# Po zapisaniu możemy go wczytać w przyszłości bez ponownego trenowania
# model_name='models/best_model' - zapisuje w folderze 'models' jako 'best_model.pkl'

save_model(best_model, model_name='models/best_model')
print("Model został zapisany do pliku: models/best_model.pkl")
Transformation Pipeline and Model Successfully Saved
Model został zapisany do pliku: models/best_model.pkl

Krok 8: Predykcje na danych testowych¶

Teraz użyjemy naszego modelu do przewidzenia cen domów. Model sprawdzi dane testowe (których nie widział podczas treningu) i przewidzi, ile powinien kosztować każdy dom.

In [8]:
# predict_model() - używa naszego modelu do przewidywania cen
# best_model - nasz najlepszy wytrenowany model
# Funkcja zwróci tabelę z oryginalnymi danymi + kolumną 'prediction_label' (przewidywane ceny)

predictions = predict_model(best_model)

# Wyświetlamy pierwsze 10 przewidywań
print("Przykładowe przewidywania cen (prediction_label = przewidywana cena):")
predictions[['SalePrice', 'prediction_label']].head(10)
  Model MAE MSE RMSE R2 RMSLE MAPE
0 Gradient Boosting Regressor 15447.0734 589755563.7247 24284.8834 0.8970 0.1178 0.0846
Przykładowe przewidywania cen (prediction_label = przewidywana cena):
Out[8]:
SalePrice prediction_label
147 222500 222321.884335
676 87000 88898.450389
1304 130000 155431.589330
1372 274300 245244.373073
1427 140000 136519.809950
1127 259000 232899.748119
35 309000 322275.023868
954 127500 130480.267771
1296 155000 145647.698505
613 147000 122455.194953

Podsumowanie¶

✅ Gotowe!

Stworzyliśmy model uczenia maszynowego, który przewiduje ceny domów na podstawie ich cech.

Co zrobiliśmy:

  1. Wczytaliśmy dane o domach (powierzchnia, lokalizacja, liczba pokoi, etc.)
  2. PyCaret automatycznie przetestował wiele różnych algorytmów regresji
  3. Wybraliśmy najlepszy model (ten z najniższym błędem przewidywania)
  4. Zapisaliśmy model do pliku, żeby móc go użyć później
  5. Model może teraz przewidywać ceny domów na podstawie ich cech

Metryki błędów:

  • MAE (Mean Absolute Error) - średni błąd w dolarach (np. MAE=20000 oznacza, że średnio przewidywania różnią się o $20,000)
  • RMSE (Root Mean Squared Error) - większe kary za duże błędy (im niższy, tym lepiej)