W tej części użyjesz szkolenia z biblioteki YDF (Yggdrasil Decision Forest) i zinterpretujesz drzewo decyzyjne.
Inspiracją do jej wykorzystania był 🧭 YDF Pierwsze kroki.
Eliminacje
Zanim przeanalizujesz zbiór danych, wykonaj te czynności:
- Utwórz nowy notatnik Colab.
- Zainstaluj bibliotekę YDF, umieszczając w nowym notatniku Colab i uruchamiając ten wiersz kodu:
!pip install ydf -U
- Zaimportuj te biblioteki:
import ydf import numpy as np import pandas as pd
Zbiór danych Palmer Penguins
Ta usługa korzysta ze zbioru danych Palmer Penguins, który zawiera pomiary wielkości 3 gatunków pingwinów:
- Pasek pod podbródkiem
- Gentoo
- Adeli
Jest to problem klasyfikacji — celem jest przewidywanie gatunku pingwinów na podstawie danych ze zbioru danych Palmer's Penguins. Oto pingwiny:
Rysunek 16. Trzy różne gatunki pingwinów. Autor zdjęcia: @allisonhorst
Ten kod wywołuje funkcję pandas, by wczytać zbiór danych Palmer Penguins do pamięci:
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)
Poniższa tabela formatuje pierwsze 3 przykłady w zbiorze danych Palmer Penguins:
Tabela 3. Pierwsze 3 przykłady u pingwinów Palmer
gatunek | wyspa | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | płeć | rok | |
---|---|---|---|---|---|---|---|---|
0 | Adeli | Torgersena | 39,1 | 18,7 | 181,0 | 3750 | mężczyźni | 2007 |
1 | Adeli | Torgersena | 39,5 | 17,4 | 186,0 | 3800 | kobiety | 2007 |
2 | Adeli | Torgersena | 40,3 | 18,0 | 195,0 | 3250 | kobiety | 2007 |
Pełny zbiór danych zawiera kombinację funkcji liczbowych (np. bill_depth_mm
), kategorialnych (np. island
) i brakujących funkcji. W przeciwieństwie do sieci neuronowych lasy decyzyjne natywnie obsługują wszystkie te typy cech natywnie, więc nie musisz stosować kodowania jeden raz, normalizacji ani dodatkowej funkcji is_present.
Ta komórka z kodem dzieli zbiór danych na zbiór do trenowania i zbiór 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
Możesz wytrenować pierwsze drzewo decyzyjne za pomocą algorytmu uczenia CART (klasyfikacji i drzew regresji) (nazywanego też modułem uczenia) bez określania hiperparametrów.
Dzieje się tak, ponieważ uczący się ydf.CartLearner
podaje dobre domyślne wartości hiperparametrów. Więcej o działaniu tego modelu dowiesz się w dalszej części szkolenia.
model = ydf.CartLearner(label=label).train(train_dataset)
Poprzednie wywołanie nie określało kolumn do wykorzystania jako cechy wejściowe. Dlatego używana jest każda kolumna w zbiorze treningowym. W wywołaniu nie określono też semantyki (np. liczbowej, kategorialnej, tekstowej) cech wejściowych. W związku z tym semantyka cech jest wnioskowana automatycznie.
Wywołaj metodę model.plot_tree()
, aby wyświetlić drzewo decyzyjne:
model.plot_tree()
W Colab możesz za pomocą myszy wyświetlić szczegółowe informacje o konkretnych elementach, takich jak rozkład klas w poszczególnych węzłach.
Rysunek 17. Drzewo decyzyjne wytrenowane z użyciem 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 zarezerwowanych automatycznie na potrzeby weryfikacji i przycięcia drzewa.
Pierwszy warunek sprawdza wartość bill_depth_mm
. Tabele 4 i 5 pokazują prawdopodobieństwo wystąpienia różnych gatunków w zależności od wyniku pierwszego warunku.
Tabela 4. Prawdopodobieństwo wystąpienia różnych gatunków, jeśli bill_depth_mm ≥
42.3
Gatunek | Prawdopodobieństwo |
---|---|
Adelie (czerwony) | 8% |
Gentoo (niebieski) | O 58% |
Podbródka (zielona) | 36% |
Tabela 5. Prawdopodobieństwo wystąpienia różnych gatunków, jeśli
bill_depth_mm < 42.3
Gatunek | Prawdopodobieństwo |
---|---|
Adelie (czerwony) | O 97% |
Gentoo (niebieski) | 2% |
Podbródka (zielona) | 0% |
bill_depth_mm
jest funkcją liczbową. W związku z tym wartość 42, 3 została wykryta przy użyciu algorytmu dokładnego podziału na potrzeby klasyfikacji binarnej z funkcjami liczbowymi.
Jeśli bill_depth_mm ≥ 42.3
ma wartość Prawda, przeprowadź dalsze testowanie, czy flipper_length_mm ≥ 207.5
może prawie idealnie oddzielić gentoos od Gentoos+Adelie.
Ten kod umożliwia trenowanie i testowanie dokładności 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ę, że dokładność testu jest wyższa niż dokładność trenowania. W takim przypadku zbiór testowy może różnić się od zbioru treningowego. W tym przypadku tak jednak nie jest, ponieważ trenowanie i test zostały podzielone losowo. Bardziej prawdopodobnym wyjaśnieniem jest to, że testowy zbiór danych jest bardzo mały (tylko 72 przykłady), więc oszacowanie dokładności jest zaszumione.
W praktyce w przypadku tak małego zbioru danych zalecane jest użycie walidacji krzyżowej, ponieważ pozwala to obliczyć dokładniejsze wartości wskaźników oceny. W tym przykładzie kontynuujemy trenowanie i testowanie, aby je uprościć.
Ulepszanie hiperparametrów modelu
Model jest pojedynczym drzewem decyzyjnym, który został wytrenowany z wykorzystaniem domyślnych wartości hiperparametrów. Aby uzyskać dokładniejsze prognozy, możesz:
Możesz korzystać z bardziej zaawansowanych metod uczenia się, na przykład z modelu losowego lasu lub drzew o podwyższonym standardzie gradientowym. Algorytmy te zostaną objaśnione na następnej stronie.
Optymalizowanie hiperparametru za pomocą obserwacji i intuicyjności. Pomocny może być przewodnik ulepszania modelu.
Korzystaj z dostrajania hiperparametrów, aby automatycznie testować dużą liczbę możliwych hiperparametrów.
Nie widzieliśmy jeszcze algorytmu wykorzystującego losowe lasy i drzewa o wzmocnieniu gradientu, a ponieważ liczba przykładów jest zbyt mała, aby przeprowadzić automatyczne dostrajanie hiperparametrów, trzeba będzie ręcznie ulepszyć model.
Powyższe drzewo decyzyjne jest małe, a liść z przykładem 61 zawiera mieszankę etykiet Adelie i Chinstrap. Dlaczego algorytm nie podzielił tego liścia? Są dwie możliwe przyczyny takiej sytuacji:
- Możliwe, że udało się osiągnąć minimalną liczbę 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 zobacz wyniki:
model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()
Rysunek 18. Drzewo decyzyjne wytrenowane z wartością min_examples=1.
Węzeł liścia zawierający 61 przykładów został dodatkowo podzielony wielokrotnie.
Aby sprawdzić, czy dalszy podział węzła jest wartościowy, oceniamy jakość nowego modelu na testowym zbiorze danych:
print(model.evaluate(test_dataset).accuracy)
# >> 0.97222
Jakość modelu wzrosła z dokładnością testów z 0,9167 do 0,97222. Zmiana hiperparametru była dobrym pomysłem.
Poprzednie lasy decyzyjne
Dalej ulepszając hiperparametry, możemy prawdopodobnie uzyskać idealną dokładność. Zamiast tego możemy wytrenować bardziej zaawansowany model, na przykład losowy las, i sprawdzić, czy działa lepiej.
model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111
Dokładność losowego lasu jest większa niż nasze proste drzewo. Na kolejnych stronach dowiesz się, dlaczego tak jest.
Użycie i ograniczenia
Jak już wspomnieliśmy, pojedyncze drzewo decyzyjne często ma niższą jakość niż nowoczesne metody uczenia maszynowego, takie jak losowe lasy, drzewa o wysokiej skuteczności gradientu czy sieci neuronowe. Drzewa decyzyjne są jednak przydatne w następujących przypadkach:
- Jest to prosta i niedroga metoda podstawowa do oceny bardziej złożonych metod.
- Gdy występuje kompromis między jakością modelu a czytelnością.
- Na podstawie interpretacji modelu lasów decyzyjnych, którą omówimy w dalszej części szkolenia.