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)