Projekt: Klasyfikacja przeżycia pasażerów Titanica¶
W tym projekcie wykorzystamy PyCaret do przewidywania, którzy pasażerowie Titanica przeżyli katastrofę.
PyCaret to narzędzie, które automatycznie testuje wiele różnych algorytmów uczenia maszynowego i wybiera najlepszy.
Krok 1: Import bibliotek¶
Najpierw importujemy (wczytujemy) potrzebne narzędzia do pracy z danymi.
# pandas - narzędzie do pracy z tabelami danych (jak Excel w Pythonie)
import pandas as pd
# pycaret - automatyczne narzędzie do uczenia maszynowego
from pycaret.classification import *
Krok 2: Wczytanie danych z pliku CSV¶
Teraz wczytamy dane o pasażerach Titanica z pliku CSV (plik tekstowy z danymi w kolumnach).
# 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/titanic.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:
| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
| 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
| 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
| 3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
| 4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
Krok 3: Przygotowanie danych do uczenia maszynowego¶
PyCaret automatycznie przygotuje dane - podzieli je na część treningową (do nauki) i testową (do sprawdzenia).
# setup() - funkcja która przygotowuje dane do uczenia maszynowego
# data=data - nasze dane o pasażerach Titanica
# target='Survived' - mówimy PyCaret, że chcemy przewidywać kolumnę 'Survived' (czy ktoś przeżył: 1=tak, 0=nie)
# session_id=123 - liczba dla powtarzalności wyników (żeby za każdym razem dostać takie same wyniki)
clf = setup(data=data, target='Survived', session_id=123)
| Description | Value | |
|---|---|---|
| 0 | Session id | 123 |
| 1 | Target | Survived |
| 2 | Target type | Binary |
| 3 | Original data shape | (891, 12) |
| 4 | Transformed data shape | (891, 14) |
| 5 | Transformed train set shape | (623, 14) |
| 6 | Transformed test set shape | (268, 14) |
| 7 | Numeric features | 6 |
| 8 | Categorical features | 5 |
| 9 | Rows with missing values | 79.5% |
| 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 | StratifiedKFold |
| 17 | Fold Number | 10 |
| 18 | CPU Jobs | -1 |
| 19 | Use GPU | False |
| 20 | Log Experiment | False |
| 21 | Experiment Name | clf-default-name |
| 22 | USI | 3dd1 |
Krok 4: Porównanie wszystkich modeli¶
Teraz PyCaret przetestuje wiele różnych algorytmów i pokaże, który jest najlepszy. To zajmie chwilę - komputer uczy różne modele i porównuje ich dokładność.
# compare_models() - testuje wszystkie dostępne modele uczenia maszynowego
# Zwraca tabelę z wynikami, gdzie każdy wiersz to inny algorytm
# Modele są posortowane od najlepszego do najgorszego
# Accuracy (dokładność) to procent poprawnych przewidywań
best_model = compare_models()
| Model | Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | TT (Sec) | |
|---|---|---|---|---|---|---|---|---|---|
| lr | Logistic Regression | 0.7975 | 0.8691 | 0.6697 | 0.7719 | 0.7132 | 0.5592 | 0.5654 | 0.6380 |
| ridge | Ridge Classifier | 0.7528 | 0.8647 | 0.4522 | 0.8257 | 0.5793 | 0.4273 | 0.4679 | 0.0350 |
| et | Extra Trees Classifier | 0.7400 | 0.7837 | 0.4774 | 0.7654 | 0.5815 | 0.4088 | 0.4356 | 0.0660 |
| nb | Naive Bayes | 0.6709 | 0.7925 | 0.1761 | 0.8582 | 0.2816 | 0.1808 | 0.2747 | 0.0360 |
| knn | K Neighbors Classifier | 0.6275 | 0.5906 | 0.3690 | 0.5175 | 0.4255 | 0.1654 | 0.1713 | 0.3980 |
| lda | Linear Discriminant Analysis | 0.6260 | 0.5382 | 0.0348 | 0.0800 | 0.0485 | 0.0335 | 0.0389 | 0.0340 |
| dt | Decision Tree Classifier | 0.6164 | 0.5000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0310 |
| rf | Random Forest Classifier | 0.6164 | 0.7890 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0790 |
| ada | Ada Boost Classifier | 0.6164 | 0.5000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0350 |
| gbc | Gradient Boosting Classifier | 0.6164 | 0.5000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0530 |
| lightgbm | Light Gradient Boosting Machine | 0.6164 | 0.5183 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0790 |
| dummy | Dummy Classifier | 0.6164 | 0.5000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0320 |
| qda | Quadratic Discriminant Analysis | 0.5938 | 0.4486 | 0.1000 | 0.0387 | 0.0558 | 0.0000 | 0.0000 | 0.0280 |
| svm | SVM - Linear Kernel | 0.5651 | 0.6070 | 0.3915 | 0.5018 | 0.3121 | 0.0717 | 0.1066 | 0.0310 |
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:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, l1_ratio=None, max_iter=1000,
multi_class='auto', n_jobs=None, penalty='l2',
random_state=123, solver='lbfgs', tol=0.0001, verbose=0,
warm_start=False)
Krok 6: Dokładna ocena najlepszego modelu¶
Sprawdźmy dokładnie, jak dobrze działa nasz najlepszy model. Zobaczymy różne metryki (miary jakości), w tym accuracy (dokładność).
# evaluate_model() - pokazuje szczegółowe informacje o jakości modelu
# Wyświetli różne wykresy i tabele z wynikami
# Najważniejsze to "Accuracy" - procent poprawnych przewidywań
evaluate_model(best_model)
interactive(children=(ToggleButtons(description='Plot Type:', icons=('',), options=(('Pipeline Plot', 'pipelin…
Krok 6.5: 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 7: Predykcje na danych testowych¶
Teraz użyjemy naszego modelu do przewidzenia, kto przeżył katastrofę Titanica. Model sprawdzi dane testowe (których nie widział podczas treningu) i powie, czy dana osoba przeżyła czy nie.
# predict_model() - używa naszego modelu do przewidywania wyników
# best_model - nasz najlepszy wytrenowany model
# Funkcja zwróci tabelę z oryginalnymi danymi + kolumną 'prediction_label' (przewidywania: 0 lub 1)
predictions = predict_model(best_model)
# Wyświetlamy pierwsze 10 przewidywań
print("Przykładowe przewidywania (prediction_label: 0=nie przeżył, 1=przeżył):")
predictions.head(10)
| Model | Accuracy | AUC | Recall | Prec. | F1 | Kappa | MCC | |
|---|---|---|---|---|---|---|---|---|
| 0 | Logistic Regression | 0.8209 | 0.8545 | 0.6699 | 0.8313 | 0.7419 | 0.6072 | 0.6155 |
Przykładowe przewidywania (prediction_label: 0=nie przeżył, 1=przeżył):
| PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Survived | prediction_label | prediction_score | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 178 | 179 | 2 | Hale, Mr. Reginald | male | 30.0 | 0 | 0 | 250653 | 13.000000 | NaN | S | 0 | 0 | 0.7672 |
| 457 | 458 | 1 | Kenyon, Mrs. Frederick R (Marion) | female | NaN | 1 | 0 | 17464 | 51.862499 | D21 | S | 1 | 1 | 0.8192 |
| 16 | 17 | 3 | Rice, Master. Eugene | male | 2.0 | 4 | 1 | 382652 | 29.125000 | NaN | Q | 0 | 0 | 0.8888 |
| 95 | 96 | 3 | Shorney, Mr. Charles Joseph | male | NaN | 0 | 0 | 374910 | 8.050000 | NaN | S | 0 | 0 | 0.8654 |
| 120 | 121 | 2 | Hickman, Mr. Stanley George | male | 21.0 | 2 | 0 | S.O.C. 14879 | 73.500000 | NaN | S | 0 | 0 | 0.8395 |
| 677 | 678 | 3 | Turja, Miss. Anna Sofia | female | 18.0 | 0 | 0 | 4138 | 9.841700 | NaN | S | 1 | 1 | 0.6303 |
| 512 | 513 | 1 | McGough, Mr. James Robert | male | 36.0 | 0 | 0 | PC 17473 | 26.287500 | E25 | S | 1 | 0 | 0.6146 |
| 561 | 562 | 3 | Sivic, Mr. Husein | male | 40.0 | 0 | 0 | 349251 | 7.895800 | NaN | S | 0 | 0 | 0.8971 |
| 356 | 357 | 1 | Bowerman, Miss. Elsie Edith | female | 22.0 | 0 | 1 | 113505 | 55.000000 | E33 | S | 1 | 1 | 0.9254 |
| 430 | 431 | 1 | Bjornstrom-Steffansson, Mr. Mauritz Hakan | male | 28.0 | 0 | 0 | 110564 | 26.549999 | C52 | S | 1 | 0 | 0.5563 |
Podsumowanie¶
✅ Gotowe!
Stworzyliśmy model uczenia maszynowego, który przewiduje, czy pasażer Titanica przeżył katastrofę.
Co zrobiliśmy:
- Wczytaliśmy dane pasażerów Titanica
- PyCaret automatycznie przetestował wiele różnych algorytmów
- Wybraliśmy najlepszy model (ten z najwyższą dokładnością)
- Model może teraz przewidywać przeżycie na podstawie danych o pasażerze (wiek, płeć, klasa biletu, itp.)
Accuracy (dokładność) to procent poprawnych przewidywań - im wyższy, tym lepiej!