7

訓練されたランダムフォレストがある場合、テストサンプルで各クラスがフォレストによって獲得した投票数を取得する方法はありますか?投票の割合はさらに良いでしょう。

CVRTrees :: predictのようなものですが、予測されたクラスとともに生の出力を取得します。

ありがとう

編集私の目標をさらに説明するために、私の問題を解決する答えを得る可能性があり、必ずしも私の質問ではありません。

私がどれだけ知っているか答えるために、それは非常に少ないです。

これは実際のアプリケーションであり、私はこれらすべてについてできるだけ早く自分自身を理解しようとしています。

基本的に、私は識別分類器を研究していますが、2つ(またはそれ以上)の独立した分類器間で出力を比較できる必要があるという要件があります。私は、クラスのセット全体について知っているかもしれないし、知らないかもしれないという意味で独立していることを意味しますが、すべての分類子がそのようなクラスのサブセットを含むクラスのセットが存在します。

私の最初の目的は、各分類子から分類に関するメタ情報を収集することです。これには、理想的には何らかの形式が含まれます(15%がAで、78%がBである可能性があります)[チャンスは悪い言葉ですが、私はそれを残します]。その出力を取得できれば、各分類器に割り当てられた動的パフォーマンスの重みに基づいて最終的な分類を実行できます。

アイデアは、非常に単純なルールベースの分類器を使用して初期分類を行うことができ、よりエキゾチックな分類器にはトレーニングする時間があります。理想的には、学習分類器はルール分類器よりも多くのクラスをサポートする可能性があり、時間の経過とともに主に使用されます。

4

3 に答える 3

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が探していたものだと思います(少なくとも私はそうだった)。

于 2013-05-23T01:35:31.340 に答える
2

二項分類をしていますか?はいの場合、CvRTrees :: predict_prob()を使用できます。これは、0から1の間の値を返す必要があります。これは、指定されたポイントが2番目のクラスに属すると判断する木の割合です。

3つ以上のクラスがある場合、特定のクラスに対する特定のポイントを分類するツリーの割合は、実際には信頼性の良い指標ではありません。より良いアプローチは、CvRTrees :: get_proximity()を使用することです。使用方法は、アプリケーションによって異なります。各クラスから、そのクラスに属する可能性が高いポイントがあるとします。次に、最初に特定のポイントを分類します。また、分類の品質を確認するには、get_proximityを使用して、指定されたポイントとそのクラスに属する可能性が高いポイントの両方に投票するツリーの割合を測定できます。

注意

あなたの質問は本当に限られており、識別分類器の信頼度を測定することについてあなたがどれだけ知っているかは不明です。しかし、実際の深刻なプロジェクトに取り組んでいる場合は、これについてさらに多くのことがあります。宿題や運動だけなら、おそらくそれで十分です。

于 2012-05-01T13:50:29.920 に答える
0

特徴ベクトルxの分類の信頼度は、一部の分類器に対して直接計算できます。線形および2次判別分類器(McLachlan「判別分析と統計的パターン認識」、Wiley、第11章、378ページを参照)の式は次のとおりです。派生。それらはかなり複雑ですが、あなたの質問に正しい答えを与えます。

于 2012-05-12T14:25:13.233 に答える