Random Forest, ein Ensemble von Entscheidungsbäumen, ist eine der beliebtesten Methoden in der maschinellen Lernwelt und wird häufig verwendet, um Vorhersagen zu treffen. In diesem Beitrag besprechen wir 5 verschiedene Python-Pakete, mit denen Sie Random Forest implementieren können.
Beginnen wir damit, wie Sie einen Random Forest in Python ohne Verwendung von Paketen implementieren können.
Implementierung eines Random Forests in Python
Ein Random Forest besteht aus einer Sammlung von Entscheidungsbäumen. Der Algorithmus zufällig ausgewählter Stichproben der Trainingsdaten und Variablen und erstellt einen Entscheidungsbaum aus jeder Stichprobe. Die Vorhersage wird durch Durchschnitt oder Abstimmung der Vorhersagen der einzelnen Bäume durchgeführt.
Das vorliegende Codebeispiel implementiert den Random Forest Algorithmus in Python. Das Ziel des Algorithmus besteht darin, eine Menge von Entscheidungsbäumen zu generieren und durch Aggregation ihrer Vorhersagen die Vorhersagegenauigkeit zu erhöhen.
Pure Python Implementierung von einem Random Forest
Der Code beginnt damit, die erforderlichen Bibliotheken zu importieren, nämlich numpy und collections. Zudem wird das Scikit-Learn-Datensatzmodul importiert, um die Funktion make_classification() zu verwenden, die einen künstlichen Datensatz generiert, auf dem der Algorithmus trainiert und getestet werden kann.
Als nächstes wird eine Klasse Node definiert, um Knoten des Entscheidungsbaums darzustellen. Jeder Knoten hat mehrere Attribute wie feature_idx, threshold, left, right, und value.
Die Klasse RandomForest ist die Hauptklasse, die den Algorithmus implementiert. Sie hat mehrere Parameter wie n_trees, max_depth und min_samples_split. Die fit()-Funktion nimmt Datensätze als Input und erzeugt durch wiederholte Zufallsauswahl Entscheidungsbäume, um eine Vorhersage zu treffen.
Die Funktion build_tree() erzeugt einen Entscheidungsbaum durch rekursive Teilung der Daten. Wenn die maximale Tiefe erreicht ist, es nur eine Klasse gibt oder die minimale Stichprobengröße unterschritten wird, wird ein Blattknoten mit dem am häufigsten vorkommenden Label erstellt. Andernfalls wird ein zufälliges Feature ausgewählt, der beste Schwellenwert zur Aufteilung berechnet, und die Daten werden entsprechend geteilt. Dann wird dieser Prozess rekursiv auf die beiden Teilbäume angewendet, bis die Abbruchbedingungen erfüllt sind.
Die predict()-Funktion erzeugt Vorhersagen für neue Daten durch Aggregation der Vorhersagen aller Entscheidungsbäume. Die predict_tree()-Funktion trifft eine Entscheidung auf der Grundlage der Daten und des aktuellen Entscheidungsbaums.
Die Funktion best_split() wählt das beste Feature und den besten Schwellenwert für eine Entscheidungsknotentrennung durch Berechnung der Information Gain. Die information_gain()-Funktion berechnet die Information Gain auf der Grundlage des aktuellen Schwellenwerts, während die Funktion entropy() die Entropie eines Knotens berechnet. Die split()-Funktion teilt die Daten in zwei Teilmengen auf, eine für jeden Zweig des Entscheidungsbaums. Die Funktion most_common_label() gibt das am häufigsten vorkommende Label zurück.
Insgesamt ist dies ein robustes Codebeispiel, das eine klare Implementierung des Random Forest Algorithmus in Python darstellt. Es verwendet verschiedene Techniken wie Bootstrapping, Feature-Sampling und Entropieberechnungen, um eine genaue Vorhersage zu treffen.
Beispielcode Random Forest
Hier ist ein Beispielcode, um einen Random Forest in Python zu implementieren:
import numpy as np
from collections import Counter
from sklearn.datasets import make_classification
class Node:
def __init__(self, feature_idx=None, threshold=None, left=None, right=None, value=None):
self.feature_idx = feature_idx
self.threshold = threshold
self.left = left
self.right = right
self.value = value
class RandomForest:
def __init__(self, n_trees=10, max_depth=5, min_samples_split=5):
self.n_trees = n_trees
self.max_depth = max_depth
self.min_samples_split = min_samples_split
self.trees = []
def fit(self, X, y):
n_samples, n_features = X.shape
for i in range(self.n_trees):
sample_idxs = np.random.choice(n_samples, n_samples, replace=True)
X_bootstrap = X[sample_idxs]
y_bootstrap = y[sample_idxs]
tree = self.build_tree(X_bootstrap, y_bootstrap, 0)
self.trees.append(tree)
def build_tree(self, X, y, depth):
n_samples, n_features = X.shape
n_labels = len(np.unique(y))
if depth == self.max_depth or n_labels == 1 or n_samples < self.min_samples_split:
leaf_value = self.most_common_label(y)
return Node(value=leaf_value)
feature_idxs = np.random.choice(n_features, int(np.sqrt(n_features)), replace=False)
best_feature_idx, best_threshold = self.best_split(X, y, feature_idxs)
left_idxs, right_idxs = self.split(X[:, best_feature_idx], best_threshold)
left = self.build_tree(X[left_idxs, :], y[left_idxs], depth+1)
right = self.build_tree(X[right_idxs, :], y[right_idxs], depth+1)
return Node(best_feature_idx, best_threshold, left, right)
def predict(self, X):
predictions = np.zeros((X.shape[0], len(self.trees)))
for i, tree in enumerate(self.trees):
predictions[:, i] = self.predict_tree(X, tree)
return np.round(np.mean(predictions, axis=1))
def predict_tree(self, X, tree):
if tree.value is not None:
return tree.value
if X[tree.feature_idx] <= tree.threshold:
return self.predict_tree(X, tree.left)
else:
return self.predict_tree(X, tree.right)
def best_split(self, X, y, feature_idxs):
best_gain = -np.inf
split_idx, split_threshold = None, None
for feature_idx in feature_idxs:
X_column = X[:, feature_idx]
thresholds = np.unique(X_column)
for threshold in thresholds:
gain = self.information_gain(y, X_column, threshold)
if gain > best_gain:
best_gain = gain
split_idx = feature_idx
split_threshold = threshold
return split_idx, split_threshold
def information_gain(self, y, X_column, split_threshold):
parent_entropy = self.entropy(y)
left_idxs, right_idxs = self.split(X_column, split_threshold)
if len(left_idxs) == 0 or len(right_idxs) == 0:
return 0
n = len(y)
n_l, n_r = len(left_idxs), len(right_idxs)
e_l, e_r = self.entropy(y[left_idxs]), self.entropy(y[right_idxs])
child_entropy = (n_l/n)*e_l + (n_r/n)*e_r
ig = parent_entropy - child_entropy
return ig
def entropy(self, y):
_, counts = np.unique(y, return_counts=True)
probabilities = counts / len(y)
entropy = sum(probabilities * -np.log2(probabilities))
return entropy
def split(self, X_column, threshold):
left_idxs = np.argwhere(X_column <= threshold).flatten()
right_idxs = np.argwhere(X_column > threshold).flatten()
return left_idxs, right_idxs
def most_common_label(self, y):
counter = Counter(y)
most_common = counter.most_common(1)
return most_common[0][0]Daten erzeugen und RandomForest-Modell anpassen
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)
rf = RandomForest(n_trees=10, max_depth=5, min_samples_split=5) rf.fit(X, y)Vorhersagen machen
X_test = np.random.randn(10, 10)predictions = rf.predict(X_test)Dies ist eine sehr einfache Implementierung des Random Forest Algorithmus in Python. Wie Sie sehen können, ist es jedoch sehr umständlich, und Sie müssen dabei viele Dinge beachten. Zum Beispiel die Überprüfung, ob die Baumtiefe erreicht wurde, die Verwendung von Entscheidungsbäumen und die Abstimmung von Vorhersagen.
Deshalb werden in der Praxis häufig Pakete verwendet, um einen Random Forest zu implementieren. Im Folgenden finden Sie fünf verschiedene Python-Pakete, mit denen Sie Random Forest implementieren können.
Random Forest mit Scikit-Learn
Scikit-Learn ist ein beliebtes Paket in der Welt der maschinellen Lernens und bietet viele Algorithmen und Funktionen. Mit Scikit-Learn können Sie Random Forests mit nur wenigen Zeilen Code implementieren.
Hier ist ein Beispielcode:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# Daten erzeugen und RandomForest-Modell anpassen
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)
rf = RandomForestClassifier(n_estimators=10, max_depth=5, min_samples_split=5, random_state=42)
rf.fit(X, y)
# Vorhersagen machen
X_test = np.random.randn(10, 10)
predictions = rf.predict(X_test)
print(predictions)Random Forest in XGBoost
XGBoostist ein Paket, das speziell für den Einsatz in Entscheidungsbäumen und Gradienten-Boosting-Algorithmen
entwickelt wurde. Es ist schnell und bietet viele Optionen für die Anpassung von Modellen. XGBoost unterstützt auch Random Forest-Modelle.
Hier ist ein Beispielcode:
import xgboost as xgb
from sklearn.datasets import make_classification
# Daten erzeugen
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)
# XGBoost-Daten-Struktur erstellen
dtrain = xgb.DMatrix(X, label=y)
# Hyperparameter einstellen
params = {
"objective": "multi:softprob",
"eval_metric": "mlogloss",
"num_class": len(np.unique(y)),
"max_depth": 5,
"subsample": 0.8,
"colsample_bytree": 0.8,
"seed": 42
}
# Modell anpassen
num_round = 10
bst = xgb.train(params, dtrain, num_round)
# Vorhersagen machen
X_test = np.random.randn(10, 10)
dtest = xgb.DMatrix(X_test)
predictions = bst.predict(dtest)
print(predictions)In LightGBM Entscheidungsbäume implementieren
LightGBM ist ein weiteres schnelles Paket für Entscheidungsbäume und Gradienten-Boosting-Algorithmen. Es bietet auch eine Option für Random Forest-Modelle.
Hier ist ein Beispielcode:
import lightgbm as lgb
from sklearn.datasets import make_classification
# Daten erzeugen
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)
# LightGBM-Daten-Struktur erstellen
lgb_train = lgb.Dataset(X, y)
# Hyperparameter einstellen
params = {
"objective": "multiclass",
"num_class": len(np.unique(y)),
"max_depth": 5,
"subsample": 0.8,
"colsample_bytree": 0.8,
"seed": 42
}
# Modell anpassen
num_round = 10
bst = lgb.train(params, lgb_train, num_round)
# Vorhersagen machen
X_test = np.random.randn(10, 10)
predictions = bst.predict(X_test)
print(predictions)
RandomForestRegressor und RandomForestClassifier in Statsmodels
Statsmodels ist ein Paket, das sich auf statistische Modellierung und Analyse spezialisiert hat. Es bietet auch Optionen für Random Forest-Modelle.
Hier ist ein Beispielcode für RandomForestRegressor:
import statsmodels.api as sm
from sklearn.datasets import make_regression
# Daten erzeugen
X, y = make_regression(n_samples=100, n_features=10, random_state=42)
# Modell anpassen
rf = sm.OLS(y, X)
result = rf.fit()
# Vorhersagen machen
X_test = np.random.randn(10, 10)
predictions = result.predict(X_test)
print(predictions)
Hier ist ein Beispielcode für RandomForestClassifier:
import statsmodels.api as sm
from sklearn.datasets import make_classification
# Daten erzeugen
X, y = make_classification(n_samples=100, n_features=10, random_state=42)
# Modell anpassen
rf = sm.discrete_model.RandomForest(y, X)
result = rf.fit()
# Vorhersagen machen
X_test = np.random.randn(10, 10)
predictions = result.predict(X_test)
print(predictions)Fazit
Random Forest ist ein beliebter Algorithmus in der Welt der maschinellen Lernens und wird häufig verwendet, um Vorhersagen zu treffen. Es gibt viele Pakete in Python, die die Implementierung von Random Forest-Modellen erleichtern, wie Scikit-Learn, XGBoost, LightGBM und Statsmodels. Je nach Anforderungen und Datenmenge können Sie das für Sie passende Paket auswählen.
