Wie benutzt man einen Entscheidungsstumpf als schwachen Lernenden in Adaboost?

11

Ich möchte Adaboost mit Decision Stump implementieren. Ist es richtig, in jeder Iteration von Adaboost so viele Entscheidungsstümpfe wie die Funktionen unseres Datensatzes zu treffen?

Wenn ich beispielsweise einen Datensatz mit 24 Funktionen habe, sollte ich in jeder Iteration 24 Entscheidungsstumpfklassifizierer haben? Oder sollte ich zufällig einige Funktionen auswählen und sie anstelle aller Funktionen klassifizieren?

Pegah
quelle

Antworten:

11

Die typische Art, einen (1-stufigen) Entscheidungsbaum zu trainieren, besteht darin, ein solches Attribut zu finden, das die reinste Aufteilung ergibt. Wenn wir also unseren Datensatz in zwei Teilmengen aufteilen, möchten wir, dass die Beschriftungen in diesen Teilmengen so homogen wie möglich sind. Es kann also auch so gesehen werden, dass viele Bäume erstellt werden - ein Baum für jedes Attribut - und dann der Baum ausgewählt wird, der die beste Aufteilung erzeugt.

In einigen Fällen ist es auch sinnvoll, eine Teilmenge von Attributen auszuwählen und dann Bäume in der Teilmenge zu trainieren. Dies wird beispielsweise in Random Forest verwendet, um die Korrelation zwischen einzelnen Bäumen zu verringern.

Wenn es jedoch um AdaBoost geht, reicht es normalerweise aus, um sicherzustellen, dass der Basisklassifizierer an gewogenen Datenpunkten trainiert werden kann und die zufällige Auswahl von Merkmalen weniger wichtig ist. Entscheidungsbäume können mit Gewichten umgehen (siehe zB hier oder hier ). Dies kann durch Gewichtung des Beitrags jedes Datenpunkts zur gesamten Verunreinigung der Teilmenge erfolgen.

Als Referenz werde ich auch meine AdaBoost-Implementierung in Python mit numpy und sklearns hinzufügenDecisionTreeClassifier mit max_depth=1:

# input: dataset X and labels y (in {+1, -1})
hypotheses = []
hypothesis_weights = []

N, _ = X.shape
d = np.ones(N) / N

for t in range(num_iterations):
    h = DecisionTreeClassifier(max_depth=1)

    h.fit(X, y, sample_weight=d)
    pred = h.predict(X)

    eps = d.dot(pred != y)
    alpha = (np.log(1 - eps) - np.log(eps)) / 2

    d = d * np.exp(- alpha * y * pred)
    d = d / d.sum()

    hypotheses.append(h)
    hypothesis_weights.append(alpha)

Zur Vorhersage der Etiketten:

# X input, y output
y = np.zeros(N)
for (h, alpha) in zip(hypotheses, hypotheses_weight):
    y = y + alpha * h.predict(X)
y = np.sign(y)
Alexey Grigorev
quelle
Vielen Dank. Wird der Entscheidungsstumpf als Teil (als Entscheidungsbaumalgorithmus) mit maximaler Tiefe 1 verwendet? Ich meine, sollte ich ein Attribut zufällig auswählen oder der Baum sollte nach bestimmten Kriterien wie dem Gini-Index aufgeteilt werden? @ AlexeyGrigorev
Pegah
Entscheidungsstumpf = 1-Regel = ein Entscheidungsbaum mit einem Knoten (mit maximaler Tiefe 1). Sie sollten die Aufteilung basierend auf einem Verunreinigungsmaß auswählen, z. B. basierend auf dem Gini-Index.
Alexey Grigorev
Danke für diese ausführliche Antwort!
xsari3x