2014-09-21 18 views
2

我想使用AdaBoost從大量(〜100k)中選擇一個好的設置功能。 AdaBoost通過迭代功能集來添加功能,並根據預成型效果添加功能。它選擇對現有功能集錯誤分類的樣本進行預處理的功能。如何使用AdaBoost進行功能選擇?

我目前正在使用Open CV的CvBoost。我得到了一個example working,但從documentation不清楚如何提取它使用的特徵索引。

使用CvBoost(第三方庫或自己實現),如何使用AdaBoot從大型功能集中提取一組功能?

+0

一個子類,這似乎是題外話有以下幾個原因:沒有明確的問題,對於第三方庫,自以爲是,和廣泛的請求。 – JBentley 2014-09-21 18:26:31

+1

@JBentley - 感謝您的評論。我認爲問題很清楚 - 我如何讓AdaBoost爲特徵選擇工作。問題的實質是真的表明我在這方面做了一些小腿工作。我不想要第三方圖書館的建議,但是如果解決方案是使用第三方庫,那就太好了。我很樂意就如何改善這個問題提出建議,因爲我真的想得到一些有用的答覆。 – Robert 2014-09-21 18:37:15

回答

2

索賠:我不是opencv的用戶。從文檔中,opencv的adaboost使用decision tree(分類樹或迴歸樹)作爲基本的弱學習者。

在我看來,這是通向get the underline weak learners

CvBoost::get_weak_predictors 
Returns the sequence of weak tree classifiers. 

C++: CvSeq* CvBoost::get_weak_predictors() 
The method returns the sequence of weak classifiers. 
Each element of the sequence is a pointer to the CvBoostTree class or 
to some of its derivatives. 

一旦你有機會獲得的CvBoostTree*序列,你應該能夠檢查其功能包含在樹上,什麼是分裂值等。

如果每棵樹只是一個決策樹,每個弱學習者只包含一個特徵。但是如果我們允許更深入的樹,每個單獨的弱學習者都可能存在特徵的組合。

我進一步看了一下CvBoostTreeclass;不幸的是,該類本身不提供公共方法來檢查所使用的內部特徵。但是你可能想創建自己的繼承自CvBoostTree的子類,並公開任何功能。

+0

這看起來不錯,謝謝!我很好奇 - 如果你不是一個公開簡歷,你是否知道其他機器學習軟件包,或者你從頭開始研究答案? – Robert 2014-09-21 22:23:52

+0

np。我有經驗與adaboost(寫我自己的代碼),所以我知道一般的想法。 – greeness 2014-09-21 22:33:27

+0

我終於明白了,謝謝你的幫助:) – Robert 2014-09-27 19:50:27

3

隨着@greeness答案的幫助下,我做的CvBoost

std::vector<int> RSCvBoost::getFeatureIndexes() { 

    CvSeqReader reader; 
    cvStartReadSeq(weak, &reader); 
    cvSetSeqReaderPos(&reader, 0); 

    std::vector<int> featureIndexes; 

    int weak_count = weak->total; 
    for(int i = 0; i < weak_count; i++) { 
     CvBoostTree* wtree; 
     CV_READ_SEQ_ELEM(wtree, reader); 

     const CvDTreeNode* node = wtree->get_root(); 
     CvDTreeSplit* split = node->split; 
     const int index = split->condensed_idx; 

     // Only add features that are not already added 
     if (std::find(featureIndexes.begin(), 
         featureIndexes.end(), 
         index) == featureIndexes.end()) { 

      featureIndexes.push_back(index); 
     } 

    } 

    return featureIndexes; 
} 
+0

你能把它關掉嗎? 我的意思是,能夠用這種方式提取功能? – 4nonymou5 2014-11-24 19:09:19

+1

是的 - 它似乎工作。我通過訓練一系列x,y點進行測試,其中如果x^2 + y^2>某個閾值,標籤爲true。我添加了第三個參數z,它是隨機噪聲,並向y添加了少量隨機噪聲,但不添加x。算法選擇x然後y然後z這是我所期望的。 – Robert 2014-11-24 20:22:22