Cara khas melatih Pohon Keputusan (1-tingkat) adalah menemukan atribut yang memberikan pemisahan paling murni. Yaitu jika kita membagi dataset kami menjadi dua himpunan bagian, kami ingin label di dalam himpunan bagian ini menjadi homogen mungkin. Jadi itu juga dapat dilihat sebagai membangun banyak pohon - pohon untuk setiap atribut - dan kemudian memilih pohon yang menghasilkan perpecahan terbaik.
Dalam beberapa kasus, masuk akal untuk memilih subset atribut dan kemudian melatih pohon pada subset tersebut. Sebagai contoh, ini digunakan dalam Hutan Acak untuk mengurangi korelasi antara masing-masing pohon.
Tetapi ketika datang ke AdaBoost, biasanya itu sudah cukup untuk memastikan classifier dasar dapat dilatih pada titik data yang ditimbang, dan pemilihan fitur acak kurang penting. Pohon keputusan dapat menangani bobot (lihat misalnya di sini atau di sini ). Ini dapat dilakukan dengan menimbang kontribusi masing-masing titik data terhadap total pengotor subset.
Untuk referensi saya juga akan menambahkan implementasi AdaBoost saya di python menggunakan numpy dan sklearnDecisionTreeClassifier
dengan 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)
Untuk memprediksi label:
# 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)