如何使用AdaBoost进行功能选择

How do I use AdaBoost for feature selection?

本文关键字:功能 选择 何使用 AdaBoost      更新时间:2023-10-16

我想使用AdaBoost从大量(约100k)中选择一组好的功能。AdaBoost的工作原理是迭代特征集,并根据它们的预成型程度添加特征。它选择在现有特征集错误分类的样本上预成型良好的特征。

我目前在Open CV的CvBoost中使用。我有一个正在运行的示例,但从文档中不清楚如何提取它使用的功能索引。

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

在@greeness answer的帮助下,我创建了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;
}

声明:我不是opencv的用户。从文档来看,opencv的adaboost使用决策树(分类树或回归树)作为基本的弱学习器。

在我看来,这是让弱学习者下划线的方法:

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类;不幸的是,类本身没有提供一个公共方法来检查所使用的内部特性。但是,您可能希望创建自己的继承自CvBoostTree的子类,并公开任何功能。