如何使用AdaBoost进行功能选择?

时间:2014-09-21 18:14:19

标签: c++ opencv machine-learning feature-selection adaboost

我想使用AdaBoost从大量(~100k)中选择一个好的集合功能。 AdaBoost通过迭代功能集并根据功能预先形成添加功能来工作。它选择的功能可以很好地对现有功能集错误分类的样本进行预处理。

我目前在Open CV' s CvBoost中使用。我得到了一个example working,但是从documentation我不清楚如何提取它已使用过的功能索引。

使用CvBoost,第三方库或自己实施,如何使用AdaBoot从大型功能集中提取一组功能?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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*的序列,您就应该能够检查树中包含哪些要素以及拆分值等等。

如果每棵树只是一个决策树桩,每个弱学习者中只包含一个特征。但是如果我们允许更深的树深度,那么每个弱学习者都可能存在一系列特征。

我进一步了解了CvBoostTree class;遗憾的是,该类本身并未提供检查所使用的内部功能的公共方法。但是您可能希望创建自己继承自CvBoostTree的子类并公开任何功能。