Course
Entscheidungsbaum-Klassifizierung in Python Tutorial
Als Marketingmanager willst du eine Gruppe von Kunden finden, die mit hoher Wahrscheinlichkeit dein Produkt kaufen werden. So kannst du dein Marketingbudget sparen, indem du deine Zielgruppe findest. Als Kreditmanager/in musst du risikoreiche Kreditanträge identifizieren, um eine niedrigere Kreditausfallquote zu erreichen. Dieser Prozess der Einteilung von Kunden in eine Gruppe potenzieller und nicht potenzieller Kunden bzw. sicherer oder riskanter Kreditanträge wird als Klassifizierungsproblem bezeichnet.
Die Klassifizierung ist ein zweistufiger Prozess: ein Lernschritt und ein Vorhersageschritt. Im Lernschritt wird das Modell auf der Grundlage gegebener Trainingsdaten entwickelt. Bei der Vorhersage wird das Modell verwendet, um die Reaktion auf die gegebenen Daten vorherzusagen. Ein Entscheidungsbaum ist einer der einfachsten und beliebtesten Klassifizierungsalgorithmen, um Daten zu verstehen und zu interpretieren. Sie kann sowohl für Klassifizierungs- als auch für Regressionsprobleme verwendet werden.
Um den Beispielcode in diesem Lernprogramm ganz einfach selbst auszuführen, kannst du eine kostenlose DataLab-Arbeitsmappe erstellen, auf der Python vorinstalliert ist und die alle Codebeispiele enthält. Ein Erklärvideo zur Entscheidungsbaum-Klassifizierung findest du in diesem DataCamp-Kursvideo.
Werde ein ML-Wissenschaftler
Der Entscheidungsbaum-Algorithmus
Ein Entscheidungsbaum ist eine Flussdiagramm-ähnliche Baumstruktur, bei der ein interner Knoten ein Merkmal (oder Attribut) darstellt, der Zweig eine Entscheidungsregel und jeder Blattknoten das Ergebnis.
Der oberste Knoten in einem Entscheidungsbaum wird als Wurzelknoten bezeichnet. Es lernt, auf der Grundlage des Attributwerts zu partitionieren. Es unterteilt den Baum in einer rekursiven Weise, der sogenannten rekursiven Partitionierung. Diese fließdiagrammartige Struktur hilft dir bei der Entscheidungsfindung. Es ist eine Visualisierung wie ein Flussdiagramm, die das menschliche Denken leicht nachahmt. Deshalb sind Entscheidungsbäume leicht zu verstehen und zu interpretieren.
Bild | Abid Ali Awan
Ein Entscheidungsbaum ist ein ML-Algorithmus vom Typ White Box. Es teilt die interne Entscheidungslogik, die bei Blackbox-Algorithmen wie einem neuronalen Netz nicht vorhanden ist. Seine Trainingszeit ist im Vergleich zum Algorithmus des neuronalen Netzes schneller.
Die Zeitkomplexität von Entscheidungsbäumen ist eine Funktion der Anzahl von Datensätzen und Attributen in den gegebenen Daten. Der Entscheidungsbaum ist eine verteilungsfreie oder nicht-parametrische Methode, die nicht von den Annahmen der Wahrscheinlichkeitsverteilung abhängt. Entscheidungsbäume können hochdimensionale Daten mit guter Genauigkeit verarbeiten.
Wie funktioniert der Entscheidungsbaum-Algorithmus?
Die Grundidee hinter jedem Entscheidungsbaum-Algorithmus ist die folgende:
- Wähle das beste Attribut mit Hilfe von Attribute Selection Measures (ASM) aus, um die Datensätze aufzuteilen.
- Mach dieses Attribut zu einem Entscheidungsknoten und unterteile den Datensatz in kleinere Teilmengen.
- Beginne mit dem Aufbau des Baums, indem du diesen Vorgang rekursiv für jedes Kind wiederholst, bis eine der Bedingungen erfüllt ist:
- Alle Tupel gehören zu demselben Attributwert.
- Es gibt keine verbleibenden Attribute mehr.
- Es gibt keine weiteren Instanzen.
Attribut Auswahlmaßnahmen
Das Attributauswahlmaß ist eine Heuristik zur Auswahl des Aufteilungskriteriums, das die Daten bestmöglich aufteilt. Sie wird auch als Aufteilungsregeln bezeichnet, weil sie uns hilft, Haltepunkte für Tupel auf einem bestimmten Knoten zu bestimmen. ASM gibt jedem Merkmal (oder Attribut) einen Rang, indem es den gegebenen Datensatz erklärt. Das Attribut mit der besten Punktzahl wird als Splitting-Attribut ausgewählt(Quelle). Wenn es sich um ein Attribut mit kontinuierlichem Wert handelt, müssen auch Splitpunkte für Zweige definiert werden. Die beliebtesten Selektionsmaße sind Informationsgewinn, Gain Ratio und Gini-Index.
Informationsgewinn
Claude Shannon erfand das Konzept der Entropie, das die Unreinheit der Eingangsmenge misst. In der Physik und Mathematik wird die Entropie als Zufälligkeit oder Unreinheit in einem System bezeichnet. In der Informationstheorie bezieht er sich auf die Unreinheit in einer Gruppe von Beispielen. Der Informationsgewinn ist die Abnahme der Entropie. Der Informationsgewinn berechnet die Differenz zwischen der Entropie vor der Aufteilung und der durchschnittlichen Entropie nach der Aufteilung des Datensatzes auf der Grundlage der gegebenen Attributwerte. Der ID3 (Iterative Dichotomiser) Entscheidungsbaum-Algorithmus nutzt den Informationsgewinn.
Dabei ist Pi die Wahrscheinlichkeit, dass ein beliebiges Tupel in D zur Klasse Ci gehört.
Wo:
- Info(D) ist die durchschnittliche Menge an Informationen, die benötigt wird, um die Klassenbezeichnung eines Tupels in D zu bestimmen.
- |Dj|/|D| fungiert als das Gewicht der j-ten Partition.
- InfoA(D) ist die erwartete Information, die benötigt wird, um ein Tupel aus D auf der Grundlage der Partitionierung durch A zu klassifizieren.
Das Attribut A mit dem höchsten Informationsgewinn, Gain(A), wird als Splitting-Attribut am Knoten N() gewählt.
Verstärkungsverhältnis
Der Informationsgewinn ist für das Attribut mit vielen Ergebnissen verzerrt. Das bedeutet, dass er das Attribut mit einer großen Anzahl unterschiedlicher Werte bevorzugt. Nehmen wir zum Beispiel ein Attribut mit einem eindeutigen Bezeichner, wie customer_ID, das aufgrund einer reinen Partitionierung null info(D) hat. Das maximiert den Informationsgewinn und schafft eine nutzlose Aufteilung.
C4.5, eine Verbesserung von ID3, verwendet eine Erweiterung des Informationsgewinns, die als Gain Ratio bekannt ist. Gain Ratio behandelt das Problem der Verzerrung, indem es den Informationsgewinn mit Split Info normalisiert. Die Java-Implementierung des C4.5-Algorithmus ist unter dem Namen J48 bekannt, der im Data-Mining-Tool WEKA verfügbar ist.
Wo:
- |Dj|/|D| fungiert als das Gewicht der j-ten Partition.
- v ist die Anzahl der diskreten Werte im Attribut A.
Das Verstärkungsverhältnis kann wie folgt definiert werden
Das Attribut mit dem höchsten Verstärkungsverhältnis wird als Splitting-Attribut gewählt(Quelle).
Gini-Index
Ein anderer Entscheidungsbaum-Algorithmus, CART (Classification and Regression Tree), verwendet die Gini-Methode, um Splitpunkte zu erstellen.
Dabei ist pi die Wahrscheinlichkeit, dass ein Tupel in D zur Klasse Ci gehört.
Der Gini-Index berücksichtigt eine binäre Aufteilung für jedes Attribut. Du kannst eine gewichtete Summe der Verunreinigungen der einzelnen Partitionen berechnen. Wenn eine binäre Aufteilung des Attributs A die Daten D in D1 und D2 unterteilt, ist der Gini-Index von D:
Im Falle eines diskret bewerteten Attributs wird die Teilmenge, die den geringsten Gini-Index für das gewählte Attribut ergibt, als Splitting-Attribut ausgewählt. Bei Attributen mit kontinuierlichen Werten besteht die Strategie darin, jedes Paar benachbarter Werte als möglichen Aufteilungspunkt auszuwählen, und der Punkt mit dem kleineren Gini-Index wird als Aufteilungspunkt gewählt.
Das Attribut mit dem geringsten Gini-Index wird als Splitting-Attribut gewählt.
Führe den Code aus diesem Tutorial online aus und bearbeite ihn
Code ausführenEntscheidungsbaum-Klassifikator in Scikit-learn erstellen
Erforderliche Bibliotheken importieren
Laden wir zunächst die benötigten Bibliotheken.
# Load libraries
import pandas as pd
from sklearn.tree import DecisionTreeClassifier # Import Decision Tree Classifier
from sklearn.model_selection import train_test_split # Import train_test_split function
from sklearn import metrics #Import scikit-learn metrics module for accuracy calculation
Daten laden
Laden wir zunächst den benötigten Pima Indian Diabetes-Datensatz mit der read CSV-Funktion von Pandas. Du kannst den Kaggle-Datensatz herunterladen, um mitzumachen.
col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("diabetes.csv", header=None, names=col_names)
pima.head()
schwanger | glucose | bp | Haut | insulin | bmi | Stammbaum | Alter | Etikett | |
---|---|---|---|---|---|---|---|---|---|
0 | 6 | 148 | 72 | 35 | 0 | 33.6 | 0.627 | 50 | 1 |
1 | 1 | 85 | 66 | 29 | 0 | 26.6 | 0.351 | 31 | 0 |
2 | 8 | 183 | 64 | 0 | 0 | 23.3 | 0.672 | 32 | 1 |
3 | 1 | 89 | 66 | 23 | 94 | 28.1 | 0.167 | 21 | 0 |
4 | 0 | 137 | 40 | 35 | 168 | 43.1 | 2.288 | 33 | 1 |
Auswahl der Merkmale
Hier musst du die gegebenen Spalten in zwei Arten von Variablen unterteilen: abhängige (oder Zielvariable) und unabhängige Variablen (oder Merkmalsvariablen).
#split dataset in features and target variable
feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable
Daten aufteilen
Um die Leistung des Modells zu verstehen, ist es eine gute Strategie, den Datensatz in einen Trainings- und einen Testsatz zu unterteilen.
Teilen wir den Datensatz mit der Funktion train_test_split()
auf. Du musst drei Parameter übergeben: Merkmale, Ziel und test_set Größe.
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 70% training and 30% test
Aufbau eines Entscheidungsbaummodells
Lass uns ein Entscheidungsbaummodell mit Scikit-learn erstellen.
# Create Decision Tree classifer object
clf = DecisionTreeClassifier()
# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)
#Predict the response for test dataset
y_pred = clf.predict(X_test)
Bewertung des Modells
Schätzen wir ab, wie genau der Klassifikator oder das Modell die Art der Kulturpflanzen vorhersagen kann.
Die Genauigkeit kann berechnet werden, indem die tatsächlichen Werte der Testreihe mit den vorhergesagten Werten verglichen werden.
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.6753246753246753
Wir erhielten eine Klassifizierungsrate von 67,53%, was als gute Genauigkeit gilt. Du kannst diese Genauigkeit verbessern, indem du die Parameter des Entscheidungsbaum-Algorithmus abstimmst.
Entscheidungsbäume visualisieren
Du kannst die Funktion export_graphviz von Scikit-learn verwenden, um den Baum in einem Jupyter-Notebook anzuzeigen. Um den Baum zu zeichnen, musst du auch graphviz und pydotplus installieren.
pip install graphviz
pip install pydotplus
Die Funktion export_graphviz wandelt den Entscheidungsbaum-Klassifikator in eine Dot-Datei um und pydotplus konvertiert diese Dot-Datei in eine png- oder anzeigbare Form auf Jupyter.
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
filled=True, rounded=True,
special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('diabetes.png')
Image(graph.create_png())
Im Entscheidungsbaumdiagramm hat jeder interne Knoten eine Entscheidungsregel, die die Daten aufteilt. Gini, auch als Gini-Ratio bezeichnet, misst die Unreinheit des Knotens. Man kann sagen, dass ein Knoten rein ist, wenn alle seine Datensätze zur selben Klasse gehören, solche Knoten nennt man Blattknoten.
Hier ist der resultierende Baum nicht beschnitten. Dieser ungeschnittene Baum ist unerklärlich und nicht leicht zu verstehen. Im nächsten Abschnitt werden wir sie durch Beschneiden optimieren.
Optimierung der Leistung von Entscheidungsbäumen
-
Kriterium : optional (Standardwert="gini") oder Attributauswahlmaß wählen. Dieser Parameter ermöglicht es uns, die Auswahl der verschiedenen Attribute zu treffen. Unterstützte Kriterien sind "gini" für den Gini-Index und "Entropie" für den Informationsgewinn.
-
splitter : string, optional (Standard="best") oder Split-Strategie. Mit diesem Parameter können wir die Aufteilungsstrategie wählen. Unterstützte Strategien sind "best", um den besten Split zu wählen, und "random", um den besten zufälligen Split zu wählen.
-
max_depth : int oder None, optional (default=None) oder Maximale Tiefe eines Baums. Die maximale Tiefe des Baums. Wenn Keine, dann werden die Knoten so lange erweitert, bis alle Blätter weniger als min_samples_split samples enthalten. Ein höherer Wert der maximalen Tiefe führt zu einer Überanpassung, ein niedrigerer Wert zu einer Unteranpassung(Quelle).
In Scikit-learn wird die Optimierung des Entscheidungsbaum-Klassifikators nur durch Pre-Pruning durchgeführt. Die maximale Tiefe des Baumes kann als Kontrollvariable für die Vorbeschneidung verwendet werden. Im folgenden Beispiel kannst du einen Entscheidungsbaum für dieselben Daten mit max_depth=3 zeichnen. Neben den Prepruning-Parametern kannst du auch andere Maßstäbe für die Attributauswahl ausprobieren, z. B. die Entropie.
# Create Decision Tree classifer object
clf = DecisionTreeClassifier(criterion="entropy", max_depth=3)
# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)
#Predict the response for test dataset
y_pred = clf.predict(X_test)
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.7705627705627706
Nun, die Klassifizierungsrate stieg auf 77,05%, was eine bessere Genauigkeit als das vorherige Modell ist.
Entscheidungsbäume visualisieren
Machen wir unseren Entscheidungsbaum mit dem folgenden Code ein bisschen verständlicher:
from six import StringIO from IPython.display import Image
from sklearn.tree import export_graphviz
import pydotplus
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
filled=True, rounded=True,
special_characters=True, feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('diabetes.png')
Image(graph.create_png())
Hier haben wir die folgenden Schritte durchgeführt:
- Importiere die benötigten Bibliotheken.
- Erstelle ein
StringIO
Objekt namensdot_data
, um die Textdarstellung des Entscheidungsbaums zu speichern. - Exportiere den Entscheidungsbaum mit der Funktion
export_graphviz
in das Formatdot
und schreibe die Ausgabe in den Pufferdot_data
. - Erstellt ein
pydotplus
Graph-Objekt aus derdot
Format-Darstellung des Entscheidungsbaums, der imdot_data
Puffer gespeichert ist. - Schreibe das erstellte Diagramm in eine PNG-Datei namens "diabetes.png".
- Zeigt das generierte PNG-Bild des Entscheidungsbaums mithilfe des
Image
Objekts aus demIPython.display
Modul an.
Wie du siehst, ist dieses beschnittene Modell weniger komplex, besser erklärbar und leichter zu verstehen als das vorherige Entscheidungsbaummodell.
Entscheidungsbaum-Profis
- Entscheidungsbäume sind leicht zu interpretieren und zu visualisieren.
- Er kann nicht-lineare Muster leicht erfassen.
- Es erfordert weniger Datenvorverarbeitung durch den Nutzer, zum Beispiel müssen die Spalten nicht normalisiert werden.
- Sie kann für das Feature-Engineering verwendet werden, z. B. für die Vorhersage fehlender Werte, und eignet sich für die Variablenauswahl.
- Der Entscheidungsbaum hat keine Annahmen über die Verteilung, da der Algorithmus nicht parametrisch ist. (Quelle)
Entscheidungsbaum Nachteile
- Empfindlich gegenüber verrauschten Daten. Sie kann verrauschte Daten überarbeiten.
- Die geringe Abweichung (oder Varianz) in den Daten kann zu einem anderen Entscheidungsbaum führen. Dies kann durch Bagging- und Boosting-Algorithmen reduziert werden.
- Entscheidungsbäume sind bei unausgewogenen Datensätzen voreingenommen, daher wird empfohlen, den Datensatz vor der Erstellung des Entscheidungsbaums auszugleichen.
Fazit
Glückwunsch, du hast es bis zum Ende dieses Tutorials geschafft!
In diesem Tutorium hast du viele Details über Entscheidungsbäume erfahren: wie sie funktionieren, Maße für die Attributauswahl wie Informationsgewinn, Gewinnverhältnis und Gini-Index, Aufbau von Entscheidungsbaummodellen, Visualisierung und Auswertung eines Diabetes-Datensatzes mit dem Python-Paket Scikit-learn. Wir haben auch über die Vor- und Nachteile gesprochen und darüber, wie man die Leistung des Entscheidungsbaums mit Hilfe von Parametertuning optimieren kann.
Wir hoffen, dass du den Entscheidungsbaum-Algorithmus jetzt nutzen kannst, um deine eigenen Datensätze zu analysieren.
Wenn du mehr über maschinelles Lernen in Python erfahren möchtest, besuche den Kurs Machine Learning with Tree-Based Models in Python von DataCamp.
Schau dir unser Kaggle Tutorial an: Dein erstes Machine Learning Modell.
Lass dich für deine Traumrolle als Data Scientist zertifizieren
Unsere Zertifizierungsprogramme helfen dir, dich von anderen abzuheben und potenziellen Arbeitgebern zu beweisen, dass deine Fähigkeiten für den Job geeignet sind.
FAQs zur Entscheidungsbaum-Klassifizierung
Was sind die häufigsten Anwendungsfälle für die Klassifizierung mit Entscheidungsbäumen?
Die Klassifizierung mit Entscheidungsbäumen wird in verschiedenen Bereichen eingesetzt, z. B. im Finanzwesen für die Kreditwürdigkeitsprüfung, im Gesundheitswesen für die Krankheitsdiagnose, im Marketing für die Kundensegmentierung und vieles mehr. Es hilft bei der Entscheidungsfindung, indem es die Daten nach verschiedenen Kriterien in Teilmengen aufteilt.
Wie kann ich bei der Verwendung von Entscheidungsbäumen ein Overfitting verhindern?
Eine Überanpassung kann verhindert werden, indem der Baum beschnitten wird, eine maximale Tiefe festgelegt wird, eine Mindestanzahl von Stichproben verwendet wird, die erforderlich ist, um einen internen Knoten zu teilen, und eine Mindestanzahl von Stichproben verwendet wird, die erforderlich ist, um einen Blattknoten zu erreichen. Eine Kreuzvalidierung kann auch dabei helfen, diese Parameter effektiv zu optimieren.
Was ist der Unterschied zwischen einem Entscheidungsbaum und einem Random Forest?
Ein Entscheidungsbaum ist eine einzelne Baumstruktur, die zur Klassifizierung oder Regression verwendet wird. Ein Random Forest hingegen ist ein Ensemble aus mehreren Entscheidungsbäumen, das die Vorhersagegenauigkeit verbessert und die Überanpassung kontrolliert, indem es die Ergebnisse der verschiedenen Bäume mittelt.
Wie gehe ich mit fehlenden Werten in meinem Datensatz um, wenn ich Entscheidungsbäume verwende?
Entscheidungsbäume können mit fehlenden Werten umgehen, indem sie Surrogat-Splits verwenden oder fehlende Werte durch den häufigsten Wert oder den Mittelwert/Modus des Merkmals ersetzen. Scikit-learn bietet auch Methoden wie SimpleImputer
, um fehlende Werte vor dem Training des Modells aufzufüllen.
Welche Vorteile hat die Verwendung von Scikit-learn für die Erstellung von Entscheidungsbaummodellen?
Scikit-learn bietet ein einfaches und effizientes Werkzeug für Data Mining und Datenanalyse, einschließlich Entscheidungsbaum-Klassifikatoren. Es bietet verschiedene Funktionen wie eine einfache Integration, eine ausführliche Dokumentation, Unterstützung für verschiedene Metriken und Parametereinstellungen sowie Methoden zur Visualisierung von Entscheidungsbäumen, was es zu einer beliebten Wahl für Praktiker des maschinellen Lernens macht.
Python-Kurse
Course
Introduction to Data Science in Python
Course
Intermediate Python
Der Blog