Bagaimana cara menggunakan tunggul keputusan sebagai pembelajar yang lemah di Adaboost?

11

Saya ingin menerapkan Adaboost menggunakan Decision Stump. Benarkah membuat banyak tunggakan keputusan seperti fitur kumpulan data kami di setiap iterasi Adaboost?

Misalnya, jika saya memiliki kumpulan data dengan 24 fitur, haruskah saya memiliki 24 class stump classifier di setiap iterasi? Atau haruskah saya secara acak memilih beberapa fitur dan membuat classifier pada mereka alih-alih semua fitur?

Pegah
sumber

Jawaban:

11

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)
Alexey Grigorev
sumber
Terima kasih. Apakah tunggul keputusan digunakan sebagai rpart (sebagai algoritma pohon keputusan) dengan kedalaman maksimal 1? Maksud saya, apakah saya harus memilih atribut secara acak atau pohon harus dibagi berdasarkan kriteria tertentu seperti Indeks Gini? @AlexeyGrigorev
Pegah
Decision stump = 1-rule = pohon keputusan dengan satu simpul (dengan kedalaman maksimal 1). Anda harus memilih pemisahan berdasarkan pada beberapa tindakan pengotor, misalnya, berdasarkan indeks Gini.
Alexey Grigorev
Terima kasih atas jawaban terinci ini!
xsari3x