Tworzenie drzewa decyzyjnego

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:

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

3 różne gatunki pingwinów.

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.

Schemat decyzyjny wytrenowany z użyciem domyślnych hiperparametrów.

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:

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

  2. Optymalizacja parametru za pomocą obserwacji i intuicji. Może Ci pomóc przewodnik po ulepszaniu modeli.

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

Drzewo decyzyjne wytrenowane z parametrem min_examples=1.

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.