Entscheidungsbaum in R - Klassifizierungsbaum & Code in R mit Beispiel

Inhaltsverzeichnis:

Anonim

Was sind Entscheidungsbäume?

Entscheidungsbäume sind vielseitige Algorithmen für maschinelles Lernen, die sowohl Klassifizierungs- als auch Regressionsaufgaben ausführen können. Sie sind sehr leistungsfähige Algorithmen, die komplexe Datensätze anpassen können. Außerdem sind Entscheidungsbäume grundlegende Bestandteile zufälliger Wälder, die zu den leistungsfähigsten Algorithmen für maschinelles Lernen gehören, die heute verfügbar sind.

Schulung und Visualisierung von Entscheidungsbäumen

Um Ihren ersten Entscheidungsbaum in R-Beispiel zu erstellen, gehen wir in diesem Tutorial zum Entscheidungsbaum wie folgt vor:

  • Schritt 1: Importieren Sie die Daten
  • Schritt 2: Bereinigen Sie den Datensatz
  • Schritt 3: Erstellen Sie ein Zug- / Test-Set
  • Schritt 4: Erstellen Sie das Modell
  • Schritt 5: Vorhersage machen
  • Schritt 6: Leistung messen
  • Schritt 7: Stellen Sie die Hyperparameter ein

Schritt 1) Importieren Sie die Daten

Wenn Sie neugierig auf das Schicksal der Titanic sind, können Sie dieses Video auf Youtube sehen. Der Zweck dieses Datensatzes besteht darin, vorherzusagen, welche Personen nach der Kollision mit dem Eisberg mit größerer Wahrscheinlichkeit überleben werden. Der Datensatz enthält 13 Variablen und 1309 Beobachtungen. Der Datensatz ist nach der Variablen X geordnet.

set.seed(678)path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'titanic <-read.csv(path)head(titanic)

Ausgabe:

## X pclass survived name sex## 1 1 1 1 Allen, Miss. Elisabeth Walton female## 2 2 1 1 Allison, Master. Hudson Trevor male## 3 3 1 0 Allison, Miss. Helen Loraine female## 4 4 1 0 Allison, Mr. Hudson Joshua Creighton male## 5 5 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female## 6 6 1 1 Anderson, Mr. Harry male## age sibsp parch ticket fare cabin embarked## 1 29.0000 0 0 24160 211.3375 B5 S## 2 0.9167 1 2 113781 151.5500 C22 C26 S## 3 2.0000 1 2 113781 151.5500 C22 C26 S## 4 30.0000 1 2 113781 151.5500 C22 C26 S## 5 25.0000 1 2 113781 151.5500 C22 C26 S## 6 48.0000 0 0 19952 26.5500 E12 S## home.dest## 1 St Louis, MO## 2 Montreal, PQ / Chesterville, ON## 3 Montreal, PQ / Chesterville, ON## 4 Montreal, PQ / Chesterville, ON## 5 Montreal, PQ / Chesterville, ON## 6 New York, NY
tail(titanic)

Ausgabe:

## X pclass survived name sex age sibsp## 1304 1304 3 0 Yousseff, Mr. Gerious male NA 0## 1305 1305 3 0 Zabour, Miss. Hileni female 14.5 1## 1306 1306 3 0 Zabour, Miss. Thamine female NA 1## 1307 1307 3 0 Zakarian, Mr. Mapriededer male 26.5 0## 1308 1308 3 0 Zakarian, Mr. Ortin male 27.0 0## 1309 1309 3 0 Zimmerman, Mr. Leo male 29.0 0## parch ticket fare cabin embarked home.dest## 1304 0 2627 14.4583 C## 1305 0 2665 14.4542 C## 1306 0 2665 14.4542 C## 1307 0 2656 7.2250 C## 1308 0 2670 7.2250 C## 1309 0 315082 7.8750 S

An der Kopf- und Schwanzausgabe können Sie erkennen, dass die Daten nicht gemischt werden. Das ist ein großes Problem! Wenn Sie Ihre Daten zwischen einem Zugsatz und einem Testsatz aufteilen, wählen Sie nur den Passagier aus Klasse 1 und 2 aus (kein Passagier aus Klasse 3 befindet sich in den oberen 80 Prozent der Beobachtungen), was bedeutet, dass der Algorithmus den niemals sieht Merkmale des Passagiers der Klasse 3. Dieser Fehler führt zu einer schlechten Vorhersage.

Um dieses Problem zu beheben, können Sie das Funktionsbeispiel () verwenden.

shuffle_index <- sample(1:nrow(titanic))head(shuffle_index)

Entscheidungsbaum R-Code Erläuterung

  • sample (1: nrow (titanic)): Generiert eine zufällige Indexliste von 1 bis 1309 (dh die maximale Anzahl von Zeilen).

Ausgabe:

## [1] 288 874 1078 633 887 992 

Sie werden diesen Index verwenden, um den Titanic-Datensatz zu mischen.

titanic <- titanic[shuffle_index, ]head(titanic)

Ausgabe:

## X pclass survived## 288 288 1 0## 874 874 3 0## 1078 1078 3 1## 633 633 3 0## 887 887 3 1## 992 992 3 1## name sex age## 288 Sutton, Mr. Frederick male 61## 874 Humblen, Mr. Adolf Mathias Nicolai Olsen male 42## 1078 O'Driscoll, Miss. Bridget female NA## 633 Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren) female 39## 887 Jermyn, Miss. Annie female NA## 992 Mamee, Mr. Hanna male NA## sibsp parch ticket fare cabin embarked home.dest## 288 0 0 36963 32.3208 D50 S Haddenfield, NJ## 874 0 0 348121 7.6500 F G63 S## 1078 0 0 14311 7.7500 Q## 633 1 5 347082 31.2750 S Sweden Winnipeg, MN## 887 0 0 14313 7.7500 Q## 992 0 0 2677 7.2292 C

Schritt 2) Bereinigen Sie den Datensatz

Die Struktur der Daten zeigt, dass einige Variablen NAs haben. Die Datenbereinigung muss wie folgt durchgeführt werden

  • Löschen Sie die Variablen home.dest, Kabine, Name, X und Ticket
  • Erstellen Sie Faktorvariablen für pclass und überleben Sie
  • Lass die NA fallen
library(dplyr)# Drop variablesclean_titanic <- titanic % > %select(-c(home.dest, cabin, name, X, ticket)) % > %#Convert to factor levelmutate(pclass = factor(pclass, levels = c(1, 2, 3), labels = c('Upper', 'Middle', 'Lower')),survived = factor(survived, levels = c(0, 1), labels = c('No', 'Yes'))) % > %na.omit()glimpse(clean_titanic)

Code Erklärung

  • Wählen Sie (-c (home.dest, Kabine, Name, X, Ticket)): Löschen Sie unnötige Variablen
  • pclass = Faktor (pclass, Ebenen = c (1,2,3), Beschriftungen = c ('Obere', 'Mittlere', 'Untere')): Fügen Sie der Variablen pclass Beschriftungen hinzu. 1 wird Upper, 2 wird MIddle und 3 wird Lower
  • Faktor (überlebt, Ebenen = c (0,1), Beschriftungen = c ('Nein', 'Ja')): Fügen Sie der überlebenden Variablen eine Beschriftung hinzu. 1 wird zu Nein und 2 wird zu Ja
  • na.omit (): Entfernen Sie die NA-Beobachtungen

Ausgabe:

## Observations: 1,045## Variables: 8## $ pclass  Upper, Lower, Lower, Upper, Middle, Upper, Middle, U… ## $ survived  No, No, No, Yes, No, Yes, Yes, No, No, No, No, No, Y… ## $ sex  male, male, female, female, male, male, female, male… ## $ age  61.0, 42.0, 39.0, 49.0, 29.0, 37.0, 20.0, 54.0, 2.0,… ## $ sibsp  0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 1, 1, 0, 0, 0, 1, 1,… ## $ parch  0, 0, 5, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 4, 0,… ## $ fare  32.3208, 7.6500, 31.2750, 25.9292, 10.5000, 52.5542,… ## $ embarked  S, S, S, S, S, S, S, S, S, C, S, S, S, Q, C, S, S, C… 

Schritt 3) Erstellen Sie ein Zug- / Test-Set

Bevor Sie Ihr Modell trainieren, müssen Sie zwei Schritte ausführen:

  • Erstellen eines Zug- und Testsatzes: Sie trainieren das Modell auf dem Zugsatz und testen die Vorhersage auf dem Testsatz (dh unsichtbare Daten).
  • Installieren Sie rpart.plot von der Konsole

Es ist üblich, die Daten zu 80/20 aufzuteilen, 80 Prozent der Daten dienen zum Trainieren des Modells und 20 Prozent zum Vorhersagen. Sie müssen zwei separate Datenrahmen erstellen. Sie möchten das Test-Set erst berühren, wenn Sie mit dem Erstellen Ihres Modells fertig sind. Sie können einen Funktionsnamen create_train_test () erstellen, der drei Argumente akzeptiert.

create_train_test(df, size = 0.8, train = TRUE)arguments:-df: Dataset used to train the model.-size: Size of the split. By default, 0.8. Numerical value-train: If set to `TRUE`, the function creates the train set, otherwise the test set. Default value sets to `TRUE`. Boolean value.You need to add a Boolean parameter because R does not allow to return two data frames simultaneously.
create_train_test <- function(data, size = 0.8, train = TRUE) {n_row = nrow(data)total_row = size * n_rowtrain_sample < - 1: total_rowif (train == TRUE) {return (data[train_sample, ])} else {return (data[-train_sample, ])}}

Code Erklärung

  • Funktion (Daten, Größe = 0,8, Zug = WAHR): Fügen Sie die Argumente in die Funktion ein
  • n_row = nrow (Daten): Anzahl der Zeilen im Datensatz zählen
  • total_row = size * n_row: Gibt die n-te Zeile zurück, um den Zugsatz zu erstellen
  • train_sample <- 1: total_row: Wählen Sie die erste bis zur n-ten Zeile aus
  • if (train == TRUE) {} else {}: Wenn die Bedingung auf true gesetzt ist, geben Sie den Zugsatz zurück, andernfalls den Testsatz.

Sie können Ihre Funktion testen und die Abmessung überprüfen.

data_train <- create_train_test(clean_titanic, 0.8, train = TRUE)data_test <- create_train_test(clean_titanic, 0.8, train = FALSE)dim(data_train)

Ausgabe:

## [1] 836 8
dim(data_test)

Ausgabe:

## [1] 209 8 

Der Zugdatensatz enthält 1046 Zeilen, während der Testdatensatz 262 Zeilen enthält.

Sie verwenden die Funktion prop.table () in Kombination mit table (), um zu überprüfen, ob der Randomisierungsprozess korrekt ist.

prop.table(table(data_train$survived))

Ausgabe:

#### No Yes## 0.5944976 0.4055024
prop.table(table(data_test$survived))

Ausgabe:

#### No Yes## 0.5789474 0.4210526

In beiden Datensätzen ist die Anzahl der Überlebenden mit etwa 40 Prozent gleich.

Installieren Sie rpart.plot

rpart.plot ist nicht in Conda-Bibliotheken verfügbar. Sie können es von der Konsole installieren:

install.packages("rpart.plot") 

Schritt 4) Erstellen Sie das Modell

Sie können das Modell erstellen. Die Syntax für die Rpart-Entscheidungsbaumfunktion lautet:

rpart(formula, data=, method='')arguments:- formula: The function to predict- data: Specifies the data frame- method:- "class" for a classification tree- "anova" for a regression tree

Sie verwenden die Klassenmethode, weil Sie eine Klasse vorhersagen.

library(rpart)library(rpart.plot)fit <- rpart(survived~., data = data_train, method = 'class')rpart.plot(fit, extra = 106

Code Erklärung

  • rpart (): Funktion zur Anpassung an das Modell. Die Argumente sind:
    • überlebt ~.: Formel der Entscheidungsbäume
    • data = data_train: Datensatz
    • method = 'class': Passt ein Binärmodell an
  • rpart.plot (fit, extra = 106): Zeichnen Sie den Baum. Die zusätzlichen Funktionen werden auf 101 gesetzt, um die Wahrscheinlichkeit der 2. Klasse anzuzeigen (nützlich für binäre Antworten). Weitere Informationen zu den anderen Optionen finden Sie in der Vignette.

Ausgabe:

Sie beginnen am Wurzelknoten (Tiefe 0 über 3, oben im Diagramm):

  1. An der Spitze steht die Gesamtüberlebenswahrscheinlichkeit. Es zeigt den Anteil der Passagiere, die den Absturz überlebt haben. 41 Prozent der Passagiere überlebten.
  2. Dieser Knoten fragt, ob das Geschlecht des Passagiers männlich ist. Wenn ja, gehen Sie zum linken untergeordneten Knoten der Wurzel (Tiefe 2). 63 Prozent sind Männer mit einer Überlebenswahrscheinlichkeit von 21 Prozent.
  3. Im zweiten Knoten fragen Sie, ob der männliche Passagier älter als 3,5 Jahre ist. Wenn ja, liegt die Überlebenschance bei 19 Prozent.
  4. Sie machen so weiter, um zu verstehen, welche Merkmale die Überlebenswahrscheinlichkeit beeinflussen.

Beachten Sie, dass eine der vielen Eigenschaften von Entscheidungsbäumen darin besteht, dass sie nur sehr wenig Datenaufbereitung erfordern. Insbesondere erfordern sie keine Feature-Skalierung oder -Zentrierung.

Standardmäßig verwendet die Funktion rpart () das Gini- Verunreinigungsmaß, um die Note zu teilen. Je höher der Gini-Koeffizient ist, desto mehr unterschiedliche Instanzen innerhalb des Knotens.

Schritt 5) Machen Sie eine Vorhersage

Sie können Ihren Testdatensatz vorhersagen. Um eine Vorhersage zu treffen, können Sie die Funktion Predict () verwenden. Die grundlegende Syntax der Vorhersage für den R-Entscheidungsbaum lautet:

predict(fitted_model, df, type = 'class')arguments:- fitted_model: This is the object stored after model estimation.- df: Data frame used to make the prediction- type: Type of prediction- 'class': for classification- 'prob': to compute the probability of each class- 'vector': Predict the mean response at the node level

Sie möchten vorhersagen, welche Passagiere nach der Kollision aus dem Test-Set mit größerer Wahrscheinlichkeit überleben. Es bedeutet, dass Sie unter diesen 209 Passagieren wissen, welcher überleben wird oder nicht.

predict_unseen <-predict(fit, data_test, type = 'class')

Code Erklärung

  • Vorhersagen (fit, data_test, type = 'class'): Vorhersage der Klasse (0/1) des Testsatzes

Testen des Passagiers, der es nicht geschafft hat, und derjenigen, die es geschafft haben.

table_mat <- table(data_test$survived, predict_unseen)table_mat

Code Erklärung

  • Tabelle (data_test $ überlebt, Predict_unseen): Erstellen Sie eine Tabelle, um zu zählen, wie viele Passagiere als Überlebende eingestuft und verstorben sind, verglichen mit der korrekten Klassifizierung des Entscheidungsbaums in R.

Ausgabe:

## predict_unseen## No Yes## No 106 15## Yes 30 58

Das Modell sagte 106 tote Passagiere korrekt voraus, stufte jedoch 15 Überlebende als tot ein. In Analogie dazu klassifizierte das Modell 30 Passagiere als Überlebende, während sie sich als tot herausstellten.

Schritt 6) Messen Sie die Leistung

Mit der Verwirrungsmatrix können Sie ein Genauigkeitsmaß für die Klassifizierungsaufgabe berechnen :

Die Verwirrungsmatrix ist eine bessere Wahl, um die Klassifizierungsleistung zu bewerten. Die allgemeine Idee besteht darin, zu zählen, wie oft True-Instanzen als False klassifiziert werden.

Jede Zeile in einer Verwirrungsmatrix repräsentiert ein tatsächliches Ziel, während jede Spalte ein vorhergesagtes Ziel darstellt. In der ersten Zeile dieser Matrix werden tote Passagiere (die falsche Klasse) berücksichtigt: 106 wurden korrekt als tot eingestuft ( wahr negativ ), während die verbleibende fälschlicherweise als Überlebender eingestuft wurde ( falsch positiv ). Die zweite Reihe betrachtet die Überlebenden, die positive Klasse war 58 ( wahr positiv ), während die wahre negativ 30 war.

Sie können den Genauigkeitstest aus der Verwirrungsmatrix berechnen:

Es ist das Verhältnis von wahrem Positiv und wahrem Negativ zur Summe der Matrix. Mit R können Sie wie folgt codieren:

accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)

Code Erklärung

  • sum (diag (table_mat)): Summe der Diagonale
  • sum (table_mat): Summe der Matrix.

Sie können die Genauigkeit des Testsatzes ausdrucken:

print(paste('Accuracy for test', accuracy_Test))

Ausgabe:

## [1] "Accuracy for test 0.784688995215311" 

Sie haben eine Punktzahl von 78 Prozent für den Testsatz. Sie können dieselbe Übung mit dem Trainingsdatensatz replizieren.

Schritt 7) Stellen Sie die Hyperparameter ein

Der Entscheidungsbaum in R verfügt über verschiedene Parameter, die Aspekte der Anpassung steuern. In der rpart-Entscheidungsbaumbibliothek können Sie die Parameter mit der Funktion rpart.control () steuern. Im folgenden Code stellen Sie die Parameter vor, die Sie einstellen möchten. Weitere Parameter finden Sie in der Vignette.

rpart.control(minsplit = 20, minbucket = round(minsplit/3), maxdepth = 30)Arguments:-minsplit: Set the minimum number of observations in the node before the algorithm perform a split-minbucket: Set the minimum number of observations in the final note i.e. the leaf-maxdepth: Set the maximum depth of any node of the final tree. The root node is treated a depth 0

Wir werden wie folgt vorgehen:

  • Konstruieren Sie eine Funktion, um die Genauigkeit zurückzugeben
  • Stellen Sie die maximale Tiefe ein
  • Stellen Sie die Mindestanzahl an Samples ein, die ein Knoten haben muss, bevor er geteilt werden kann
  • Stellen Sie die Mindestanzahl an Proben ein, die ein Blattknoten haben muss

Sie können eine Funktion schreiben, um die Genauigkeit anzuzeigen. Sie wickeln einfach den Code ein, den Sie zuvor verwendet haben:

  1. Vorhersagen: Vorhersagen_unseen <- Vorhersagen (fit, data_test, type = 'class')
  2. Tabelle erstellen: table_mat <- table (data_test $ überlebt, Predict_unseen)
  3. Rechengenauigkeit: Genauigkeitstest <- Summe (diag (table_mat)) / Summe (table_mat)
accuracy_tune <- function(fit) {predict_unseen <- predict(fit, data_test, type = 'class')table_mat <- table(data_test$survived, predict_unseen)accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)accuracy_Test}

Sie können versuchen, die Parameter zu optimieren und festzustellen, ob Sie das Modell gegenüber dem Standardwert verbessern können. Zur Erinnerung, Sie müssen eine Genauigkeit von mehr als 0,78 erhalten

control <- rpart.control(minsplit = 4,minbucket = round(5 / 3),maxdepth = 3,cp = 0)tune_fit <- rpart(survived~., data = data_train, method = 'class', control = control)accuracy_tune(tune_fit)

Ausgabe:

## [1] 0.7990431 

Mit folgendem Parameter:

minsplit = 4minbucket= round(5/3)maxdepth = 3cp=0 

Sie erhalten eine höhere Leistung als das Vorgängermodell. Glückwunsch!

Zusammenfassung

Wir können die Funktionen zum Trainieren eines Entscheidungsbaumalgorithmus in R zusammenfassen

Bibliothek

Zielsetzung

Funktion

Klasse

Parameter

Einzelheiten

rpart

Zugklassifizierungsbaum in R.

rpart ()

Klasse

Formel, df, Methode

rpart

Regressionsbaum trainieren

rpart ()

Anova

Formel, df, Methode

rpart

Plotten Sie die Bäume

rpart.plot ()

Einbaumodell

Base

vorhersagen

vorhersagen()

Klasse

Einbau Modell, Typ

Base

vorhersagen

vorhersagen()

prob

Einbau Modell, Typ

Base

vorhersagen

vorhersagen()

Vektor

Einbau Modell, Typ

rpart

Regelparameter

rpart.control ()

minsplit

Legen Sie die Mindestanzahl von Beobachtungen im Knoten fest, bevor der Algorithmus eine Aufteilung durchführt

Minbucket

Stellen Sie die Mindestanzahl von Beobachtungen in der letzten Note ein, dh im Blatt

maximale Tiefe

Legen Sie die maximale Tiefe eines Knotens des endgültigen Baums fest. Der Wurzelknoten wird mit einer Tiefe von 0 behandelt

rpart

Zugmodell mit Steuerparameter

rpart ()

Formel, df, Methode, Kontrolle

Hinweis: Trainieren Sie das Modell anhand von Trainingsdaten und testen Sie die Leistung anhand eines nicht sichtbaren Datensatzes, dh eines Testsatzes.