【问题标题】:How do I use AdaBoost for feature selection?如何使用 AdaBoost 进行特征选择?
【发布时间】:2014-11-15 17:26:28
【问题描述】:

我想使用 AdaBoost 从大量(~100k)中选择一组好的特征。 AdaBoost 通过迭代特征集并根据它们的执行情况添加特征来工作。它选择在被现有特征集错误分类的样本上表现良好的特征。

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

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

【问题讨论】:

  • 这似乎离题有几个原因:没有明确的问题、对第三方库的请求、固执己见和广泛。
  • @JBentley - 感谢您的评论。我认为这个问题很清楚——我如何让 AdaBoost 用于特征选择。问题的主体实际上是为了表明我在这方面做了一些腿部工作。我不想要第 3 方库推荐,但是如果解决方案是使用第 3 方库,那就太好了。我欢迎就如何改进这个问题提出建议,因为我真的很想得到一些有用的答复。

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


【解决方案1】:

在@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;
}

【讨论】:

  • 你能成功吗?我的意思是,能够用这种方式提取特征吗?
  • 是的 - 它似乎工作。我通过对一系列 x、y 点进行训练来测试它,如果 x^2+y^2 > 某个阈值,标签为真。我添加了第三个参数 z,它是随机噪声,并向 y 添加了少量随机噪声,而不是 x。该算法选择 x 然后 y 然后 z 这是我所期望的。
【解决方案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 的子类并公开任何功能。

【讨论】:

  • 这看起来很棒,谢谢!我很好奇 - 如果您不是 Open CV,您是否知道任何其他机器学习包,或者您是否从头开始研究答案?
  • np。我有使用 adaboost 的经验(编写我自己的代码),所以我知道大致的想法。
  • 我终于弄明白了,谢谢你的帮助:)
猜你喜欢
  • 2013-04-26
  • 2012-04-20
  • 2020-06-19
  • 2020-09-11
  • 2012-07-09
  • 2018-05-23
  • 2013-08-15
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多