2016-02-29 75 views
3

我爲一個項目實現了Adaboost,但我不確定是否正確理解了adaboost。以下是我所實施的內容,請讓我知道它是否是正確的解釋。Adaboost與神經網絡

  1. 我的弱分類器是8個不同的神經網絡。這些預測中的每一個在完全訓練後都具有約70%的準確度。
  2. 我將所有這些網絡完全訓練,並收集他們對訓練集的預測;所以我在訓練集上有8個預測向量。

現在我使用adaboost。我對adaboost的解釋是,它會找到一個最終的分類器作爲我上面訓練的分類器的加權平均值,其作用是找到這些權重。所以,對於每個訓練示例我都有8個預測,並且我正在使用adaboost權重將它們組合起來。請注意,通過這種解釋,弱分類器在adaboost迭代過程中不會被重新訓練,只會更新權重。但更新後的權重實際上會在每次迭代中創建新的分類器。

這裏是僞代碼:

all_alphas = [] 
all_classifier_indices = [] 
initialize all training example weights to 1/(num of examples) 
compute error for all 8 networks on the training set 
for i in 1 to T: 
     find the classifier with lowest weighted error. 
     compute the weights (alpha) according to the Adaboost confidence formula 
     Update the weight distribution, according to the weight update formula in Adaboost. 
     all_alphas.append(alpha) 
     all_classifier_indices.append(selected_classifier) 

T後反覆,有T阿爾法和T分類指數;這些分類器索引將指向8個神經網絡預測向量中的一個。

然後在測試集上,對於每個示例,我通過總和alpha*classifier進行預測。

我想與神經網絡使用的adaboost,但我想我已經曲解了AdaBoost算法錯誤..

+0

那麼..究竟發生了什麼? – javadba

+0

@javadba精確度或多或少保持不變。我之前沒有使用boost,並且我讀過它總是將準確度提高1到2%。 –

+0

另一個問題,在adaboost過程中,基本/元分類器必須支持sample_weight屬性。但是Nerual網絡的重量是通過SGD或其他優化器更新的。如何將樣本權重添加到Nerual網絡 – machen

回答

5

推進摘要:

1-通過訓練數據

訓練你的第一個弱分類

2-第一個訓練過的分類器在某些樣本上出錯,並將其他分類正確分類。增加錯誤分類樣品的重量並減少正確樣品的重量。用這些權重重新分類您的分類器以獲得您的第二個分類器。

對於您的情況,您首先必須使用這些更新的權重對數據進行重新取樣,創建新的訓練數據,然後通過這些新數據訓練分類器。

3-重複第二步T次,並在每輪結束時,根據公式計算分類器的alpha權重。最後的分類器是T分類器決策的加權總和。

希望從這個解釋中可以清楚地知道,你做了錯誤的昇華。而不是用新的數據集對您的網絡進行再培訓,而是將它們全部用原始數據集進行訓練。事實上,你有種使用隨機森林類型分類器(除了你使用NN而不是決策樹)集合。

PS:無法保證提高精度。事實上,到目前爲止,我所知道的所有助推方法都沒有成功地提高NN作爲弱學習者的準確性(原因在於促進工作的方式,需要更長的討論)。

+1

謝謝,我使用了adaboost給出的權重,直接在損失函數中使用..現在,損失現在是每個訓練示例的權重,權重來自adaboost –

+0

甚至更​​好。這是確切的實現,如果你想將其推廣到多類增強,它更容易。 – TNM

+0

@TNM另一個問題,在adaboost過程中,基本/元分類器必須支持sample_weight屬性。但是Nerual網絡的重量是通過SGD或其他優化器更新的。如何將樣品重量添加到Nerual網絡 – machen