對於隨機森林演算法,原理我想大家都會去看論文,推薦兩個老外的網址http://www.stat.berkeley.edu/users/breiman/RandomForests/和https://cwiki.apache.org/MAHOUT/random-forests.html,第一個網址是提出隨機森林方法大牛寫的,很全面具體,第二個是我自己找的一個,算是一個簡化版的介紹吧。說白了,隨機森林分類的過程就是對於每個隨機產生的決策樹分類器,輸入特徵向量,森林中每棵樹對樣本進行分類,根據每個樹的權重得到最後的分類結果。所有的樹訓練都是使用同樣的參數,但是訓練集是不同的,分類器的錯誤估計採用的是oob(out
of bag)的辦法。如果大家看懂了,接下來就簡單咯
還是先介紹一下對應opencv的類和函數吧,之前有籠統介紹過機器學習的類,對於隨機森林相關演算法類有CvRTParams、CvRTrees。具體再講解一下:
CvRTParams類包涵了隨機森林訓練過程中需要設定的全部參數,繼承自CvDTParams。其中
max_depth表示單棵樹的最大深度
min_sample_count閾值,當節點的樣本數比閾值小的時候,節點就不在進行分裂
regression_accuracy回逆樹時候的閾值
use_surrogates是否使用代理?(這是神馬功能。。。)
max_categories最大分類的閾值
priors先驗分類可能性
calc_var_importance變數重要性是否計算標誌
nactive_vars每棵樹選取特徵子集的大小
max_num_of_trees_in_the_forest森林內樹的數目上限
forest_accuracy森林訓練OOB error的精度
termcrit_type森林訓練閾值選取的類型
以上參數的賦值都通過CvRTParams的建構函式實現。
CvRTrees就是隨機森林的主體了。包涵了train訓練函數、predict預測函數、predict_prob返回預測分類標籤、getVarImportance返回變數權重矩陣、get_proximity返回兩訓練樣本之間的相似性、calc_error返回隨機森林的預測誤差、get_train_error返回訓練誤差、get_rng返回使用隨機數的當前值、get_tree_count返回構造隨機森林的樹的數目、get_tree返回構造隨機森林的其中一棵樹。
接下來,結合sample內建的letter_recog.cpp講解一下如何應用隨機森林演算法做字母的識別,這裡選擇的訓練樣本庫是http://archive.ics.uci.edu/ml/下的一個訓練集,這個網站還有很多其他的資源提供,非常好的機器學習的data庫。這個訓練檔案letter-recognition.data有20000個訓練字母,每一字母用16維的特徵表示。本程式使用前16000個進行訓練,後4000個進行測試。唯一讓我很不爽的是這個程式是用老版本的資料結構寫的,所以我決定用新結構再寫一下,我對原程式進行了簡化,刪除了很多不相關和不是必須的部分。
其實隨機森林使用起來非常簡單,兩個最重要的步驟無非就是train()和predict()函數,其他的函數都是用來得到測試結果。
這裡把我簡化並用新結構改寫之後的代碼下載連結奉上http://download.csdn.net/detail/yang_xian521/4134557