擁有高方差使得決策樹(secision tress)在處理特定訓練數據集時其結果顯得相對脆弱。bagging(bootstrap aggregating 的縮寫)算法從訓練數據的樣本中建立復合模型,可以有效降低決策樹的方差,但樹與樹之間有高度關聯(并不是理想的樹的狀態)。
隨機森林算法(Random forest algorithm)是對 bagging 算法的擴展。除了仍然根據從訓練數據樣本建立復合模型之外,隨機森林對用做構建樹(tree)的數據特征做了一定限制,使得生成的決策樹之間沒有關聯,從而提升算法效果。
本教程將實現如何用 Python 實現隨機森林算法。
bagged decision trees 與隨機森林算法的差異; 如何構建含更多方差的裝袋決策樹; 如何將隨機森林算法運用于預測模型相關的問題。算法描述
這個章節將對隨機森林算法本身以及本教程的算法試驗所用的聲納數據集(Sonar dataset)做一個簡要介紹。
隨機森林算法
決策樹運行的每一步都涉及到對數據集中的最優分裂點(best split point)進行貪婪選擇(greedy selection)。
這個機制使得決策樹在沒有被剪枝的情況下易產生較高的方差。整合通過提取訓練數據庫中不同樣本(某一問題的不同表現形式)構建的復合樹及其生成的預測值能夠穩定并降低這樣的高方差。這種方法被稱作引導聚集算法(bootstrap aggregating),其簡稱 bagging 正好是裝進口袋,袋子的意思,所以被稱為「裝袋算法」。該算法的局限在于,由于生成每一棵樹的貪婪算法是相同的,那么有可能造成每棵樹選取的分裂點(split point)相同或者極其相似,最終導致不同樹之間的趨同(樹與樹相關聯)。相應地,反過來說,這也使得其會產生相似的預測值,降低原本要求的方差。
我們可以采用限制特征的方法來創建不一樣的決策樹,使貪婪算法能夠在建樹的同時評估每一個分裂點。這就是隨機森林算法(Random Forest algorithm)。
與裝袋算法一樣,隨機森林算法從訓練集里擷取復合樣本并訓練。其不同之處在于,數據在每個分裂點處完全分裂并添加到相應的那棵決策樹當中,且可以只考慮用于存儲屬性的某一固定子集。
對于分類問題,也就是本教程中我們將要探討的問題,其被考慮用于分裂的屬性數量被限定為小于輸入特征的數量之平方根。代碼如下:
num_features_for_split = sqrt(total_input_features)
這個小更改會讓生成的決策樹各不相同(沒有關聯),從而使得到的預測值更加多樣化。而多樣的預測值組合往往會比一棵單一的決策樹或者單一的裝袋算法有更優的表現。
聲納數據集(Sonar dataset)
我們將在本教程里使用聲納數據集作為輸入數據。這是一個描述聲納反射到不同物體表面后返回的不同數值的數據集。60 個輸入變量表示聲納從不同角度返回的強度。這是一個二元分類問題(binary classification problem),要求模型能夠區分出巖石和金屬柱體的不同材質和形狀,總共有 208 個觀測樣本。
新聞熱點
疑難解答