Erstellen eines Entscheidungsbaums

In diesem Modul verwenden Sie das YDF (Yggdrasil Entscheidungswald) einen Entscheidungsbaum trainieren und interpretieren.

Diese Lektion ist inspiriert von 🧭 YDF – Erste Schritte .

Grundlegendes

Bevor Sie das Dataset untersuchen, gehen Sie so vor:

  1. Neues Colab erstellen Notizbuch.
  2. Installiere die YDF-Bibliothek, indem du die folgende Codezeile einfügst und ausführst in Ihrem neuen Colab-Notebook:
    !pip install ydf -U
    
  3. Importieren Sie die folgenden Bibliotheken:
    import ydf
    import numpy as np
    import pandas as pd
    

Das Palmer Penguins-Dataset

Dieses Colab verwendet die <ph type="x-smartling-placeholder"></ph> Palmer Penguins-Dataset, das Größenmessungen für drei Pinguinarten:

  • Zügelpinguine
  • Eselspinguine
  • Adelie

Dies ist ein Klassifizierungsproblem – das Ziel ist es, die Art der basierend auf Daten im Palmer's Penguins-Dataset. Hier sind die Pinguine:

Drei verschiedene Pinguin
Spezies.

<ph type="x-smartling-placeholder"></ph> Abbildung 16: Drei verschiedene Pinguinarten. Bild von @allisonhorst

 

Mit dem folgenden Code wird eine Panda um das Palmer Penguins-Dataset in den Arbeitsspeicher zu laden:

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)

In der folgenden Tabelle werden die ersten drei Beispiele in den Palmer Penguins formatiert. Dataset:

<ph type="x-smartling-placeholder"></ph> Tabelle 3. Die ersten drei Beispiele bei Palmer Penguins

Gattung Insel bill_length_mm bill_depth_mm flipper_length_mm body_mass_g Sex Jahr
0 Adelie Torgersen 39,1 18,7 181,0 3.750,0 Männlich 2007
1 Adelie Torgersen 39,5 17,4 186,0 3.800,0 weiblich 2007
2 Adelie Torgersen 40,3 18.0 195,0 3.250,0 weiblich 2007

Das vollständige Dataset enthält eine Mischung aus numerischen Werten (z. B. bill_depth_mm), kategoriale Merkmale (z. B. island) und fehlende Merkmale vorliegen. Anders als neuronale Netzwerke unterstützen Entscheidungsstrukturen alle diese Elementtypen nativ. keine One-Hot-Codierung, Normalisierung oder zusätzliches "is_present"-Feature vornehmen.

Die folgende Codezelle teilt das Dataset in ein Trainings-Dataset und Tests auf festlegen:

# 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

Entscheidungsbäume mit Standard-Hyperparametern trainieren

Sie können Ihren ersten Entscheidungsbaum mit der CART (Klassifizierung und Regressionsstrukturen). Hyperparameter. Das liegt daran, dass der ydf.CartLearner-Learner eine gute Standardeinstellung bietet Hyperparameter-Werten. Sie werden später mehr darüber erfahren, wie diese Art von Modell funktioniert. später im Kurs.

model = ydf.CartLearner(label=label).train(train_dataset)

Im vorherigen Aufruf wurden keine Spalten angegeben, die als Eingabefeatures. Daher wird jede Spalte im Trainings-Dataset verwendet. Der Anruf auch keine Semantik angegeben (z. B. numerisch, kategorial, text) der Eingabefeatures. Daher wird die Semantik von Merkmalen automatisch abgeleitet.

Rufen Sie model.plot_tree() auf, um den resultierenden Entscheidungsbaum aufzurufen:

model.plot_tree()

In Colab können Sie mit der Maus Details zu bestimmten Elementen anzeigen, z. B. als Klassenverteilung in jedem Knoten.

Einen mit Standard trainierten Entscheidungsbaum
Hyperparameter.

<ph type="x-smartling-placeholder"></ph> Abbildung 17: Entscheidungsbaum, der mit Standard-Hyperparametern trainiert wurde

Colab zeigt, dass die Stammbedingung 243 Beispiele enthält. Sie können jedoch dass das Trainings-Dataset 272 Beispiele enthielt. Die verbleibenden 29 Beispiele wurden automatisch für die Validierung und Baumbereinigung reserviert.

Mit der ersten Bedingung wird der Wert von bill_depth_mm getestet. In den Tabellen 4 und 5 sind die Wahrscheinlichkeit unterschiedlicher Arten in Abhängigkeit vom Ergebnis der ersten Erkrankung.

<ph type="x-smartling-placeholder"></ph> Tabelle 4. Wahrscheinlichkeit anderer Spezies, wenn bill_depth_mm ≥ 42.3

Spezies Wahrscheinlichkeit
Adelie (Rot) 8 %
Eselspinguine (blau) 58 %
Zügel (grün) 36 %

 

<ph type="x-smartling-placeholder"></ph> Tabelle 5. Wahrscheinlichkeit verschiedener Spezies, wenn bill_depth_mm < 42.3

Spezies Wahrscheinlichkeit
Adelie (Rot) 97 %
Eselspinguine (blau) 2 %
Zügel (grün) 0 %

bill_depth_mm ist ein numerisches Element. Daher wurde der Wert 42, 3 ermittelt. unter Verwendung der exakten Aufteilung für die binäre Klassifizierung mit numerischen Werten Funktionen.

Wenn bill_depth_mm ≥ 42.3 „True“ ist, wird weiter getestet, ob der flipper_length_mm ≥ 207.5 kann den Traffic Eselspinguine und von den Eselspinguinen + Adelie.

Der folgende Code liefert die Trainings- und Testgenauigkeit des Modells:

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

Es ist selten, aber möglich, dass die Testgenauigkeit höher ist als die des Trainings Genauigkeit. In diesem Fall unterscheidet sich das Test-Dataset möglicherweise vom Trainings-Dataset. Dies ist hier jedoch nicht der Fall, da die Trainings- und Test wurde aufgeteilt nach dem Zufallsprinzip ausgewählt werden. Eine wahrscheinlichere Erklärung ist, dass das Test-Dataset sehr klein ist (nur 72 Beispiele), sodass die Genauigkeitsschätzung ungenau ist.

In der Praxis können Sie bei so kleinen Datasets Kreuzvalidierung besser geeignet, weil damit genauere Bewertungsmesswerte berechnet werden können. In diesem Beispiel setzen wir jedoch mit einer Schulung und um der Kundschaft Einfachheit.

Modell-Hyperparameter verbessern

Das Modell ist ein einzelner Entscheidungsbaum, der mit Standard-Hyperparameter trainiert wurde Werte. Um bessere Vorhersagen zu erhalten, haben Sie folgende Möglichkeiten:

  1. Nutzen Sie einen leistungsstärkeren Lerntyp, z. B. Random Forest oder einen Farbverlauf Boosted Tree modellieren. Diese Lernalgorithmen werden auf der nächsten Seite erläutert.

  2. Optimieren Sie den Hyperparameter anhand Ihrer Beobachtungen und Erkenntnisse. Die Leitfaden zur Modellverbesserung kann hilfreich sein.

  3. Hyperparameter-Abstimmung verwenden um automatisch eine große Anzahl möglicher Hyperparameter zu testen.

Da wir den zufälligen Wald und den Gradienten-Booster-Bäume noch nicht gesehen haben, Da die Anzahl der Beispiele zu klein ist, um eine automatische Hyperparameter-Abstimmung verwenden, verbessern Sie das Modell manuell.

Der oben gezeigte Entscheidungsbaum ist klein und das Blatt mit 61 enthält ein eine Mischung aus Adelie- und Zügel-Labels. Warum hat der Algorithmus dieses Blatt nicht geteilt weiter? Hierfür gibt es zwei mögliche Gründe:

  • Die Mindestanzahl an Proben pro Blatt (standardmäßig min_examples=5) kann erreicht wurden.
  • Der Baum wurde möglicherweise geteilt und dann beschnitten, um eine Überanpassung zu vermeiden.

Reduzieren Sie die Mindestanzahl von Beispielen auf 1 und sehen Sie sich die Ergebnisse an:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

Ein Entscheidungsbaum, der mit
min_examples=1 festgelegt ist.

<ph type="x-smartling-placeholder"></ph> Abbildung 18: Einen Entscheidungsbaum, der mit min_examples=1 trainiert wurde.

 

Der Blattknoten mit 61 Beispielen wurde weiter durch mehrere Mal.

Um zu sehen, ob eine weitere Unterteilung des Knotens wertvoll ist, bewerten wir die Qualität der dieses neue Modell auf das Test-Dataset anwenden:

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

Die Qualität des Modells hat sich mit einer Testgenauigkeit von 0,9167 auf 0,97222. Diese Änderung des Hyperparameters war eine gute Idee.

Vorheriger Entscheidungswald

Durch die weitere Verbesserung der Hyperparameter konnten wir wahrscheinlich Genauigkeit. Anstelle dieses manuellen Prozesses können wir jedoch eine leistungsstärkere wie z. B. eine Random Forests, um zu sehen, ob es besser funktioniert.

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

Die Genauigkeit des zufälligen Waldes ist besser als die unseres einfachen Baums. Sie werden erfahren Sie auf den nächsten Seiten, warum.

Nutzung und Beschränkung

Wie bereits erwähnt, ist die Qualität eines einzelnen Entscheidungsbaums oft niedriger als bei modernen ML-Methoden wie Random Forests, Gradient Boosted Trees und neuronale Netze Netzwerken. In folgenden Fällen sind Entscheidungsbäume jedoch weiterhin nützlich:

  • Als einfache und kostengünstige Baseline zur Bewertung komplexerer Ansätze.
  • Wenn ein Kompromiss zwischen Qualität und Interpretierbarkeit des Modells besteht.
  • Als Proxy für die Interpretation des Entscheidungsstrukturmodells, das die wir später im Kurs behandeln.