Tworzenie drzewa decyzyjnego

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:

  1. Utwórz nowy notatnik Colab.
  2. Zainstaluj bibliotekę YDF, umieszczając w nowym notatniku Colab i uruchamiając ten wiersz kodu:
    !pip install ydf -U
    
  3. 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:

Trzy różne gatunki pingwinów.

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.

Drzewo decyzyjne wytrenowane
za pomocą domyślnych hiperparametrów.

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:

  1. 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.

  2. Optymalizowanie hiperparametru za pomocą obserwacji i intuicyjności. Pomocny może być przewodnik ulepszania modelu.

  3. 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()

Drzewo decyzyjne wytrenowane na podstawie parametru min_examples=1.

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.