使用OpenCV随机森林,有没有办法获得分类的“置信度”水平?

时间:2012-04-27 23:00:42

标签: c++ opencv

如果我有一个训练有素的随机森林,我有什么方法可以获得每个班级在测试样本上获得的每个班级的投票数量?投票的百分比会更好。

类似于CVRTrees ::预测,但获得原始输出和预测类。

由于

修改为了进一步解释我的目标,我可以找到解决问题的答案,而不一定是我的问题。

要回答我知道多少,这很少。

这是一个真实世界的应用程序,我正努力让自己尽快加快速度。

基本上,我研究判别分类器,要求我需要能够比较2个(或更多)独立分类器之间的输出。我的意思是独立的,他们可能知道也可能不知道整个类的集合,但是确实存在一组类,其中所有分类器都包含这些类的子集。

我最初的目的是从每个分类器中收集关于分类的元信息,理想情况下这些分类器包含某种形式(其中15%是A,78%是B的机会)[我知道机会是一个坏词,但我会离开它。如果我能得到那个输出,我将能够根据分配给每个分类器的动态性能权重执行最终分类。

我的想法是,我可以使用一个非常简单的基于规则的分类器来进行初始分类,而更奇特的分类器有时间训练。理想情况下,学习分类器可能支持比规则分类器更多的类,并且随着时间的推移主要使用它。

3 个答案:

答案 0 :(得分:6)

我正在处理同样的问题,我想在这里分享我的解决方案。我从CvRTrees派生了一个类,并添加了一个具有所需行为的函数。我使用现有的predict()函数作为我的起点。这是我的代码:

class CvRTreesMultiClass : public CvRTrees
{
    public:
    int predict_multi_class( const CvMat* sample, 
                             cv::AutoBuffer<int>& out_votes, 
                             const CvMat* missing = 0) const;
};

使用:

int CvRTreesMultiClass::predict_multi_class( const CvMat* sample, 
                                             cv::AutoBuffer<int>& out_votes, 
                                             const CvMat* missing ) const
{
int result = 0;
int k;

if( nclasses > 0 ) //classification
{
    int max_nvotes = 0;
    int* votes = out_votes;
    memset( votes, 0, sizeof(*votes)*nclasses );
    for( k = 0; k < ntrees; k++ )
    {
        CvDTreeNode* predicted_node = trees[k]->predict( sample, missing );
        int nvotes;
        int class_idx = predicted_node->class_idx;
        CV_Assert( 0 <= class_idx && class_idx < nclasses );

        nvotes = ++votes[class_idx];

    }

    result = ntrees;
}
else // regression
{
    throw std::runtime_error(__FUNCTION__ "can only be used classification");
}

return result;
}

在调用此函数后,我只根据每个类收到的投票数(prob = out_votes [class_index] / result)计算概率。我认为这是OP正在寻找的东西(至少我是)。

答案 1 :(得分:2)

你在进行二元分类吗?如果是,您可以使用CvRTrees::predict_prob()。这应该返回0到1之间的值,这是决定给定点属于第二类的树的比例。

如果你有两个以上的类,那么将给定点分类到特定类的树的比例实际上并不是信心的良好指标。更好的方法是使用CvRTrees::get_proximity()。它的使用方式取决于您的应用程序。假设你从每个班级中都有一个很有可能属于他们班级的观点。然后你首先对给定的点进行分类。要检查分类的质量,您可以使用get_proximity来衡量树的投票比例,即给定点和高概率属于该类的点。

注意

你的问题非常有限,目前还不清楚你对衡量判别分类者的信心有多了解。但是,如果您正在开展一个真实世界和严肃的项目,那么还有更多内容。如果它只是一个家庭作业或练习,那么也许就足够了。

答案 2 :(得分:0)

对于某些分类器,可以直接计算特征向量x的分类的置信度:对于线性和二次判别分类器(参见McLachlan“判别分析和统计模式识别”,Wiley,第11章,第378页),公式是派生的。它们相当复杂,但确实给出了正确答案。