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.
# 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.
# 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:
| 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).
# 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ść.
# 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.
# 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.
# 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.
# 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.
# 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):
| 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:
- Wczytaliśmy dane o domach (powierzchnia, lokalizacja, liczba pokoi, etc.)
- PyCaret automatycznie przetestował wiele różnych algorytmów regresji
- Wybraliśmy najlepszy model (ten z najniższym błędem przewidywania)
- Zapisaliśmy model do pliku, żeby móc go użyć później
- 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)