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:
- Wählen Sie N zufällige Datensätze aus dem Datensatz.
- Erstellen Sie einen Entscheidungsbaum basierend auf diesen N Datensätzen.
- Wählen Sie die Anzahl der Bäume, die Sie in Ihrem Algorithmus haben möchten, und wiederholen Sie die Schritte 1 und 2.
- 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.
- 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.
- 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.
- Der Random-Forest-Algorithmus funktioniert gut, wenn Sie sowohl kategoriale als auch numerische Merkmale haben.
- 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
- 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.
- 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.
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.
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