W tym module użyjesz biblioteki YDF (Yggdrasil Decision Forest) do trenowania i interpretowania drzewa decyzyjnego.
Ten moduł jest inspirowany samouczkiem 🧭 YDF – rozpoczęcie.
Eliminacje
Zanim zaczniesz analizować zbiór danych:
- Utwórz nowy notatnik Colab.
- Zainstaluj bibliotekę YDF, umieszczając i uruchamiając ten wiersz kodu w nowym notatniku Colab:
!pip install ydf -U
- Zaimportuj te biblioteki:
import ydf import numpy as np import pandas as pd
zbiór danych Palmer Penguins;
Ten Colab używa zbioru danych Palmer Penguins, który zawiera pomiary wielkości trzech gatunków pingwinów:
- Pasek podbródkowy
- Gentoo
- Adelie
Jest to problem klasyfikacji – celem jest prognozowanie gatunku pingwina na podstawie danych ze zbioru danych Palmer's Penguins. Oto pingwiny:
Rysunek 16. 3 różne gatunki pingwinów. Obraz autorstwa @allisonhorst
Poniższy kod wywołuje funkcję pandas, aby załadować do pamięci zbiór danych Palmer Penguins:
path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"
# Display the first 3 examples.
dataset.head(3)
W tabeli poniżej przedstawiono pierwsze 3 przypadki ze zbioru danych Palmer Penguins:
Tabela 3. Pierwsze 3 przykłady w Palmer Penguins:
gatunek | wyspa | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | seks | rok | |
---|---|---|---|---|---|---|---|---|
0 | Adelie | Torgersen | 39.1 | 18,7 | 181,0 | 3750,0 | mężczyźni | 2007 |
1 | Adelie | Torgersen | 39,5 | 17,4 | 186,0 | 3800,0 | kobiety | 2007 |
2 | Adelie | Torgersen | 40,3 | 18,0 | 195,0 | 3250,0 | kobiety | 2007 |
Pełny zbiór danych zawiera mieszankę atrybutów numerycznych (np. bill_depth_mm
), kategorialnych (np. island
) i brakujących. W przeciwieństwie do sieci neuronowych lasy decyzyjne obsługują wszystkie te typy cech natywnie, więc nie musisz stosować kodowania jednobitowego, normalizacji ani dodatkowej funkcji is_present.
Komórka kodu poniżej dzieli zbiór danych na zbiór treningowy i testowy:
# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2
train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]
print("Training examples: ", len(train_dataset))
# >> Training examples: 272
print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72
Trenowanie drzew decyzyjnych z domyślnymi hiperparametrami
Pierwsze drzewo decyzyjne możesz wytrenować za pomocą algorytmu uczenia się CART (drzewa klasyfikacyjne i regresyjne) (zwane też uczącymi) bez określania hiperparametrów.
Dzieje się tak, ponieważ model ydf.CartLearner
zapewnia dobre domyślne wartości hiperparametrów. Więcej informacji o tym, jak działa ten typ modelu, znajdziesz w później części kursu.
model = ydf.CartLearner(label=label).train(train_dataset)
Poprzedni wywołanie nie określiło kolumn, które mają być używane jako funkcje wejściowe. Dlatego wykorzystywana jest każda kolumna w zbiorze treningowym. W wywołaniu nie określono też semantyki (np. liczbowej, tekstowej lub kategorycznej) funkcji wejściowych. Dlatego semantyka funkcji jest automatycznie wywnioskowana.
Wywołaj funkcję model.plot_tree()
, aby wyświetlić otrzymany diagram decyzyjny:
model.plot_tree()
W Colab możesz używać myszy, aby wyświetlać szczegółowe informacje o poszczególnych elementach, takie jak rozkład klas w każdym węźle.
Rysunek 17. Schemat decyzyjny wytrenowany przy użyciu domyślnych hiperparametrów.
Colab pokazuje, że warunek główny zawiera 243 przykłady. Pamiętaj jednak, że zbiór danych treningowych zawierał 272 przykłady. Pozostałe 29 przykładów zostało automatycznie zarezerwowanych na potrzeby weryfikacji i przycinania drzewa.
Pierwszy warunek sprawdza wartość bill_depth_mm
. Tabele 4 i 5 przedstawiają prawdopodobieństwo występowania różnych gatunków w zależności od wyniku pierwszego warunku.
Tabela 4. Prawdopodobieństwo występowania różnych gatunków, jeśli bill_depth_mm ≥
42.3
Gatunek | Prawdopodobieństwo |
---|---|
Adelie (czerwony) | 8% |
Gentoo (niebieski) | 58% |
Pasek pod brodę (zielony) | 36% |
Tabela 5. Prawdopodobieństwo występowania różnych gatunków, jeśli:bill_depth_mm < 42.3
Gatunek | Prawdopodobieństwo |
---|---|
Adelie (czerwony) | 97% |
Gentoo (niebieski) | 2% |
Pasek pod brodę (zielony) | 0% |
bill_depth_mm
to cecha liczbowa. Dlatego przy użyciu algorytmu dokładnego podziału na klasyfikację binarną z cechami numerycznymi znaleziono wartość 42, 3.
Jeśli bill_depth_mm ≥ 42.3
ma wartość Prawda, przeprowadź dalsze testy, aby sprawdzić, czy flipper_length_mm ≥ 207.5
może prawie idealnie oddzielić gatunki Gentoos i Gentoos+Adelie.
Ten kod zapewnia dokładność trenowania i testowania modelu:
train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy: 0.9338
test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy: 0.9167
Zdarza się to rzadko, ale jest możliwe, że dokładność testu jest wyższa niż dokładność podczas trenowania. W takim przypadku zestaw testowy może się różnić od zestawu treningowego. W tym przypadku tak się nie stało, ponieważ dane zostały podzielone losowo. Bardziej prawdopodobne jest, że zbiór danych testowych jest bardzo mały (tylko 72 przykłady), więc szacowanie dokładności jest nieprecyzyjne.
W praktyce w przypadku tak małego zbioru danych lepiej jest użyć weryfikacji krzyżowej, ponieważ pozwala ona uzyskać dokładniejsze wartości wskaźników oceny. W tym przykładzie kontynuujemy jednak szkolenie i testowanie ze względu na prostotę.
Ulepszanie hiperparametrów modelu
Model to pojedyncze drzewo decyzyjne wytrenowane z użyciem domyślnych wartości hiperparametrów. Aby uzyskać lepsze prognozy, możesz:
Użyj bardziej zaawansowanego modelu uczenia się, np. lasu losowego lub modelu drzewa Boostrapowanego gradientem. Na następnej stronie znajdziesz wyjaśnienie tych algorytmów.
Optymalizacja parametru za pomocą obserwacji i intuicji. Może Ci pomóc przewodnik po ulepszaniu modeli.
Użyj dostrajania hiperparametrów, aby automatycznie przetestować dużą liczbę możliwych hiperparametrów.
Nie mamy jeszcze doświadczeń z działaniem algorytmów random forest i gradient boosting trees, a liczba przykładów jest zbyt mała, aby można było automatycznie dostosować hiperparametry, dlatego musisz ręcznie ulepszyć model.
Powyższe drzewo decyzyjne jest małe, a liść z 61 przykładem zawiera mieszankę etykiet Adelie i Chinstrap. Dlaczego algorytm nie podzielił tego elementu na dalsze gałęzie? Są dwie możliwe przyczyny takiej sytuacji:
- Może to być spowodowane osiągnięciem minimalnej liczby próbek na liść (domyślnie
min_examples=5
). - Drzewo mogło zostać podzielone, a następnie przycięte, aby zapobiec nadmiernemu dopasowaniu.
Zmniejsz minimalną liczbę przykładów do 1 i sprawdź wyniki:
model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()
Rysunek 18. Drzewo decyzyjne wytrenowane z parametrem min_examples=1.
Liść zawierający 61 przykładów został podzielony jeszcze kilkakrotnie.
Aby sprawdzić, czy dalsze dzielenie węzła jest przydatne, oceniamy jakość tego nowego modelu na podstawie testowego zbioru danych:
print(model.evaluate(test_dataset).accuracy)
# >> 0.97222
Jakość modelu wzrosła, a dokładność testu wzrosła z 0,9167 do 0,97222. Ta zmiana hiperparametru była dobrym pomysłem.
Poprzednie drzewa decyzyjne
Dalsze ulepszanie hiperparametrów może pozwolić nam osiągnąć idealną dokładność. Zamiast tego możemy jednak przetrenować potężniejszy model, np. las losowy, i sprawdzić, czy działa on lepiej.
model = ydf.RandomForestLearner(label=label).train(train_dataset)
print("Test accuracy: ", model.evaluate(test_dataset).accuracy)
# >> Test accuracy: 0.986111
Dokładność lasu losowego jest większa niż prostego drzewa. Na kolejnych stronach dowiesz się, dlaczego.
Zastosowanie i ograniczenia
Jak już wspomnieliśmy, pojedyncze drzewo decyzyjne często ma niższą jakość niż nowoczesne metody uczenia maszynowego, takie jak lasy losowe, drzewa z wzmocnieniem gradientowym i sieci neuronowe. Drzewa decyzyjne są jednak przydatne w tych sytuacjach:
- Jako prosty i niedrogi punkt odniesienia do oceny bardziej złożonych metod.
- Gdy występuje kompromis między jakością modelu a jego interpretowalnością.
- jako zastępnik interpretacji modelu lasów decyzyjnych, który zostanie omówiony w dalszej części kursu.