Articles

Random Forest Algorithmus mit Python und Scikit-Learn

Random Forest ist ein Algorithmus des überwachten maschinellen Lernens, der auf Ensemble-Lernen basiert. Ensemble-Lernen ist eine Art des Lernens, bei der man verschiedene Arten von Algorithmen oder denselben Algorithmus mehrfach kombiniert, um ein leistungsfähigeres Vorhersagemodell zu bilden. Der Random-Forest-Algorithmus kombiniert mehrere Algorithmen desselben Typs, z. B. mehrere Entscheidungsbäume, was zu einem Wald von Bäumen führt, daher der Name „Random Forest“. Der Random-Forest-Algorithmus kann sowohl für Regressions- als auch für Klassifizierungsaufgaben verwendet werden.

Wie der Random-Forest-Algorithmus funktioniert

Im Folgenden werden die grundlegenden Schritte zur Durchführung des Random-Forest-Algorithmus beschrieben:

  1. Wählen Sie N zufällige Datensätze aus dem Datensatz.
  2. Erstellen Sie einen Entscheidungsbaum basierend auf diesen N Datensätzen.
  3. Wählen Sie die Anzahl der Bäume, die Sie in Ihrem Algorithmus haben möchten, und wiederholen Sie die Schritte 1 und 2.
  4. Im Falle eines Regressionsproblems sagt jeder Baum im Forest für einen neuen Datensatz einen Wert für Y (Output) voraus. Der endgültige Wert kann berechnet werden, indem man den Durchschnitt aller Werte nimmt, die von allen Bäumen im Forest vorhergesagt wurden. Oder, im Falle eines Klassifizierungsproblems, sagt jeder Baum im Wald die Kategorie voraus, zu der der neue Datensatz gehört. Schließlich wird der neue Datensatz der Kategorie zugeordnet, die die meisten Stimmen erhält.

Vorteile der Verwendung von Random Forest

Wie bei jedem Algorithmus gibt es Vor- und Nachteile bei der Verwendung. In den nächsten beiden Abschnitten sehen wir uns die Vor- und Nachteile der Verwendung von Random Forest für Klassifikation und Regression an.

  1. Der Random-Forest-Algorithmus ist nicht voreingenommen, da es mehrere Bäume gibt und jeder Baum auf einer Teilmenge von Daten trainiert wird. Im Grunde genommen verlässt sich der Random-Forest-Algorithmus auf die Macht der „Masse“; daher ist die allgemeine Voreingenommenheit des Algorithmus reduziert.
  2. Dieser Algorithmus ist sehr stabil. Selbst wenn ein neuer Datenpunkt in den Datensatz eingeführt wird, wird der Gesamtalgorithmus nicht stark beeinflusst, da neue Daten zwar einen Baum beeinflussen können, aber es ist sehr schwer, dass sie alle Bäume beeinflussen.
  3. Der Random-Forest-Algorithmus funktioniert gut, wenn Sie sowohl kategoriale als auch numerische Merkmale haben.
  4. Der Random-Forest-Algorithmus funktioniert auch dann gut, wenn die Daten fehlende Werte haben oder nicht gut skaliert sind (obwohl wir die Skalierung der Merkmale in diesem Artikel nur zu Demonstrationszwecken durchgeführt haben).

Nachteile der Verwendung von Random Forest

  1. Ein großer Nachteil von Random Forests liegt in ihrer Komplexität. Sie benötigen viel mehr Rechenressourcen, da eine große Anzahl von Entscheidungsbäumen zusammengefügt wird.
  2. Durch ihre Komplexität benötigen sie viel mehr Zeit zum Trainieren als andere vergleichbare Algorithmen.

Im weiteren Verlauf dieses Artikels werden wir sehen, wie die Python-Bibliothek Scikit-Learn verwendet werden kann, um den Random-Forest-Algorithmus zu implementieren, um sowohl Regressions- als auch Klassifikationsprobleme zu lösen.

Teil 1: Verwendung von Random Forest für Regression

In diesem Abschnitt werden wir untersuchen, wie Random Forests verwendet werden können, um Regressionsprobleme mit Scikit-Learn zu lösen. Im nächsten Abschnitt werden wir ein Klassifizierungsproblem mit Hilfe von Random Forests lösen.

Problemdefinition

Das Problem besteht darin, den Benzinverbrauch (in Millionen Gallonen) in 48 der US-Bundesstaaten vorherzusagen, basierend auf der Benzinsteuer (in Cent), dem Pro-Kopf-Einkommen (in Dollar), den asphaltierten Highways (in Meilen) und dem Anteil der Bevölkerung mit Führerschein.

Lösung

Um dieses Regressionsproblem zu lösen, werden wir den Random-Forest-Algorithmus über die Scikit-Learn Python-Bibliothek verwenden. Wir werden der traditionellen Pipeline für maschinelles Lernen folgen, um dieses Problem zu lösen. Folgen Sie diesen Schritten:

1. Bibliotheken importieren

Führen Sie den folgenden Code aus, um die notwendigen Bibliotheken zu importieren:

import pandas as pdimport numpy as np
2. Importieren des Datensatzes

Der Datensatz für dieses Problem ist verfügbar unter:

https://drive.google.com/file/d/1mVmGNx6cbfvRHC_DvF12ZL3wGLSHD9f_/view

Für dieses Tutorial wurde der Datensatz in den Ordner „Datasets“ auf dem Laufwerk „D“ heruntergeladen. Sie müssen den Dateipfad entsprechend Ihrer eigenen Einrichtung ändern.

Führen Sie den folgenden Befehl aus, um das Dataset zu importieren:

dataset = pd.read_csv('D:\Datasets\petrol_consumption.csv')

Um eine Übersicht zu erhalten, wie das Dataset aussieht, führen Sie den folgenden Befehl aus:

dataset.head()
Benzinsteuer Durchschnittliches_Einkommen Befestigte_Highways Bevölkerung_Führerschein(%) Benzin_Verbrauch
0 9.0 3571 1976 0.525 541
1 9.0 4092 1250 0.572 524
2 9.0 3865 1586 0.580 561
3 7.5 4870 2351 0.529 414
4 8.0 4399 431 0.544 410

Wir können sehen, dass die Werte in unserem Datensatz nicht sehr gut skaliert sind. Wir werden sie vor dem Training des Algorithmus herunter skalieren.

3. Vorbereiten der Daten für das Training

In diesem Abschnitt werden zwei Aufgaben durchgeführt. Die erste Aufgabe besteht darin, die Daten in „Attribute“- und „Label“-Sätze aufzuteilen. Die resultierenden Daten werden dann in Trainings- und Test-Sets aufgeteilt.

Das folgende Skript teilt die Daten in Attribute und Labels auf:

X = dataset.iloc.valuesy = dataset.iloc.values

Zuletzt teilen wir die Daten in Trainings- und Test-Sets auf:

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
4. Feature-Skalierung

Wir wissen, dass unser Datensatz noch nicht skaliert ist, z. B. hat das Feld „Average_Income“ Werte im Bereich von Tausenden, während „Petrol_tax“ Werte im Bereich von Zehnern hat. Daher wäre es von Vorteil, unsere Daten zu skalieren (obwohl, wie bereits erwähnt, dieser Schritt für den Random-Forests-Algorithmus nicht so wichtig ist). Dazu werden wir die StandardScaler-Klasse von Scikit-Learn verwenden. Führen Sie dazu den folgenden Code aus:

# Feature Scalingfrom sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train)X_test = sc.transform(X_test)
5. Training des Algorithmus

Nun, da wir unseren Datensatz skaliert haben, ist es an der Zeit, unseren Random-Forest-Algorithmus zu trainieren, um dieses Regressionsproblem zu lösen. Führen Sie den folgenden Code aus:

from sklearn.ensemble import RandomForestRegressorregressor = RandomForestRegressor(n_estimators=20, random_state=0)regressor.fit(X_train, y_train)y_pred = regressor.predict(X_test)

Die RandomForestRegressor Klasse der sklearn.ensemble Bibliothek wird verwendet, um Regressionsprobleme mittels Random Forest zu lösen. Der wichtigste Parameter der RandomForestRegressor Klasse ist der n_estimators Parameter. Dieser Parameter definiert die Anzahl der Bäume im Random Forest. Wir werden mit n_estimator=20 beginnen, um zu sehen, wie unser Algorithmus funktioniert. Details zu allen Parametern von RandomForestRegressor finden Sie hier.

6. Bewertung des Algorithmus

Der letzte und abschließende Schritt beim Lösen eines Machine-Learning-Problems ist die Bewertung der Leistung des Algorithmus. Bei Regressionsproblemen sind die Metriken, die zur Bewertung eines Algorithmus verwendet werden, der mittlere absolute Fehler, der mittlere quadratische Fehler und der mittlere quadratische Wurzelfehler. Führen Sie den folgenden Code aus, um diese Werte zu ermitteln:

from sklearn import metricsprint('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

Die Ausgabe wird in etwa so aussehen:

Mean Absolute Error: 51.765Mean Squared Error: 4216.16675Root Mean Squared Error: 64.932016371

Bei 20 Bäumen beträgt der mittlere quadratische Wurzelfehler 64,93, was mehr als 10 Prozent des durchschnittlichen Benzinverbrauchs, d. h. 576,77, ausmacht. Dies kann unter anderem darauf hindeuten, dass wir nicht genügend Schätzer (Bäume) verwendet haben.

Wird die Anzahl der Schätzer auf 200 geändert, ergeben sich folgende Ergebnisse:

Mean Absolute Error: 47.9825Mean Squared Error: 3469.7007375Root Mean Squared Error: 58.9041657058

Das folgende Diagramm zeigt die Abnahme des Wertes des mittleren quadratischen Wurzelfehlers (RMSE) in Abhängigkeit von der Anzahl der Schätzer. Hier enthält die X-Achse die Anzahl der Schätzer, während die Y-Achse den Wert für den mittleren quadratischen Fehler enthält.

RMSE vs. Anzahl der Schätzer

Sie können sehen, dass die Fehlerwerte mit der Erhöhung der Anzahl der Schätzer abnehmen. Nach 200 nimmt die Rate der Fehlerabnahme ab, daher ist 200 eine gute Zahl für n_estimators. Sie können mit der Anzahl der Bäume und anderen Parametern herumspielen, um zu sehen, ob Sie selbst bessere Ergebnisse erzielen können.

Teil 2: Verwendung von Random Forest für die Klassifikation

Problemstellung

Die Aufgabe hier ist es, vorherzusagen, ob eine Banknote echt ist oder nicht, basierend auf vier Attributen, nämlichd. h. Varianz des Wavelet-transformierten Bildes, Schiefe, Entropie und Curtosis des Bildes.

Lösung

Dies ist ein binäres Klassifikationsproblem und wir werden einen Random-Forest-Klassifikator verwenden, um dieses Problem zu lösen. Die Schritte zur Lösung dieses Problems ähneln den Schritten, die für die Regression durchgeführt werden.

1. Bibliotheken importieren
import pandas as pdimport numpy as np
2. Importieren des Datensatzes

Der Datensatz kann unter folgendem Link heruntergeladen werden:

https://drive.google.com/file/d/13nw-uRXPY8XIZQxKRNZ3yYlho-CYm_Qt/view

Die detaillierten Informationen zu den Daten sind unter folgendem Link verfügbar:

https://archive.ics.uci.edu/ml/datasets/banknote+authentication

Der folgende Code importiert den Datensatz:

dataset = pd.read_csv("D:/Datasets/bill_authentication.csv")

Um eine Übersicht über das Dataset zu erhalten, führen Sie den folgenden Befehl aus:

dataset.head()
Varianz Skewness Kurtosis Entropie Klasse
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

Wie schon beim Regressionsdatensatz sind die Werte in diesem Datensatz nicht sehr gut skaliert. Der Datensatz wird vor dem Training des Algorithmus skaliert.

3. Vorbereiten der Daten für das Training

Der folgende Code unterteilt die Daten in Attribute und Labels:

X = dataset.iloc.valuesy = dataset.iloc.values

Der folgende Code unterteilt die Daten in Trainings- und Testsätze:

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
4. Merkmalsskalierung

Wie zuvor funktioniert die Merkmalsskalierung auf die gleiche Weise:

# Feature Scalingfrom sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train)X_test = sc.transform(X_test)
5. Training des Algorithmus

Und wieder können wir nun, nachdem wir unseren Datensatz skaliert haben, unsere Random Forests trainieren, um dieses Klassifikationsproblem zu lösen. Führen Sie dazu den folgenden Code aus:

from sklearn.ensemble import RandomForestRegressorregressor = RandomForestRegressor(n_estimators=20, random_state=0)regressor.fit(X_train, y_train)y_pred = regressor.predict(X_test)

Für die Regression verwenden wir die RandomForestRegressor Klasse der sklearn.ensemble Bibliothek. Für die Klassifizierung verwenden wir die RandomForestClassifier Klasse der sklearn.ensemble Bibliothek. Die RandomForestClassifier Klasse nimmt ebenfalls n_estimators als Parameter. Wie zuvor definiert dieser Parameter die Anzahl der Bäume in unserem Random Forest. Wir werden wieder mit 20 Bäumen beginnen. Details zu allen Parametern von RandomForestClassifier finden Sie hier.

6. Bewertung des Algorithmus

Bei Klassifizierungsproblemen sind die Metriken, die zur Bewertung eines Algorithmus verwendet werden, Genauigkeit, Konfusionsmatrix, Präzision, Recall und F1-Werte. Führen Sie das folgende Skript aus, um diese Werte zu ermitteln:

from sklearn.metrics import classification_report, confusion_matrix, accuracy_scoreprint(confusion_matrix(y_test,y_pred))print(classification_report(y_test,y_pred))print(accuracy_score(y_test, y_pred))

Die Ausgabe sieht etwa so aus:

 1 117]] precision recall f1-score support 0 0.99 0.99 0.99 157 1 0.98 0.99 0.99 118 avg / total 0.99 0.99 0.99 2750.989090909091

Die Genauigkeit, die unser Random-Forest-Klassifikator mit 20 Bäumen erreicht, beträgt 98,90 %. Anders als zuvor hat die Änderung der Anzahl der Schätzer für dieses Problem die Ergebnisse nicht signifikant verbessert, wie das folgende Diagramm zeigt. Hier enthält die X-Achse die Anzahl der Schätzer, während die Y-Achse die Genauigkeit anzeigt.

Genauigkeit vs. Anzahl der Schätzer

98,90 % ist eine ziemlich gute Genauigkeit, so dass es ohnehin nicht viel Sinn macht, die Anzahl der Schätzer zu erhöhen. Wir sehen, dass die Erhöhung der Anzahl der Schätzer die Genauigkeit nicht weiter verbessert hat.

Um die Genauigkeit zu verbessern, würde ich vorschlagen, dass Sie mit anderen Parametern der RandomForestClassifier-Klasse herumspielen und sehen, ob Sie unsere Ergebnisse verbessern können.

Ressourcen

Möchten Sie mehr über Scikit-Learn und andere nützliche Algorithmen für maschinelles Lernen wie Random Forests erfahren? Sie können sich einige detailliertere Ressourcen ansehen, wie zum Beispiel einen Online-Kurs:

  • Data Science in Python, Pandas, Scikit-learn, Numpy, Matplotlib
  • Python for Data Science and Machine Learning Bootcamp
  • Machine Learning A-Z: Hands-On Python & R in Data Science

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.