2

12で示される2つのクラスラベルに属するいくつかの機能を含むデータセットがあります。このデータセットは、決定木を構築するために処理されます。ツリーの構築中に、データセットの最適なパーティションを見つけるために情報ゲインを計算する必要があります。

ラベル1に関連付けられたN1フィーチャと、ラベル2に関連付けられたN2フィーチャがあるとすると、エントロピーは次の式で計算できます。

Entropy = - (N1/N)*log2(N1/N) - (N2/N)*log2(N2/N)、ここでN = N1 + N2

情報ゲインを取得するには、エントロピーの3つの値を計算する必要があります。

  • entropyBefore、これは現在のデータセットを分割する前のエントロピーです。
  • entropyLeft、それは分割後の左分割のエントロピーです。
  • entropyRight、それは分割後の右分割のエントロピーです。

したがって、情報ゲインはに等しくなりますentropyBefore - (S1/N)*entropyLeft - (S2/N)*entropyRight。ここで、S1はスプリット1に属するクラス1の特徴の数であり、 S2はスプリット2に属するクラス2の特徴の数です。

浮動小数点近似誤差を減らすために、情報ゲインの値を計算するにはどうすればよいですか?情報ゲインがゼロでなければならない場合に上記の式を適用すると、計算値は非常に小さい負の値に等しくなります。

UPDATE(サンプルコード)

double N = static_cast<double>(this->rows());   // rows count of the dataset

double entropyBefore = this->entropy();   // current entropy (before performing the split)

bool firstCheck = true;
double bestSplitIg;

for each possible split
{
    // ...

    pair<Dataset,Dataset> splitPair = split(...,...);
    double S1 = splitPair.first.rows();
    double S2 = splitPair.second.rows();

    double entropyLeft = splitPair.first.entropy();
    double entropyRight = splitPair.second.entropy();

    double splitIg = entropyBefore - (S1/N*entropyLeft + S2/N*entropyRight);
    if (firstCheck || splitIg > bestSplitIg)
    {
        bestSplitIg = splitIg;
        // ...

        firstCheck = false;
    }
}
4

1 に答える 1

2

エントロピーのみを使用してどちらの選択肢が優れているかを判断し、2 つのエントロピーを比較した結果のみが必要であり、それらの実際の値は必要ない場合は、一部の計算を省略できます。

この関数があります:エントロピー(N1、N2、N)->-N1/N*log2(N1/N)-N2/N*log2(N2/N)。

N が問題の期間中定数であると仮定すると、式に N を掛けてみましょう。

  • N1*log2(N1/N)-N2*log2(N2/N)

次に、対数から「/N」を分離します。

  • N1*(log2(N1)-log2(N)) - N2*(log2(N2)-log2(N))

そして展開します:

  • N1*log2(N1) - N2*log2(N2) - (N1+N2)*log2(N)

そして単純化します:

  • N1*log2(N1) - N2*log2(N2) - N*log2(N)

明らかに、N*log2(N) は定数であり、あるエントロピーが別のエントロピーよりも大きいかどうかには影響しないため、破棄できます。

また、ln(2) を掛けます。これも、あるエントロピーが別のエントロピーより大きいかどうかは変わりません。これには、log2 関数を ln 関数に変更する効果があり、ln は数学ライブラリによってわずかに正確に計算される可能性があります (「自然な」対数である理由があります)。

E(N1, N2, N) -> - N1*ln(N1) - N2*ln(N2)

この関数は操作が少ないため、エントロピー関数よりも正確に計算される可能性があり、(正確に計算すると) E(N1, N2, N) < E(M1, M2, N) iff Entropy(N1 、N2、N) < エントロピー (M1、M2、N)。

于 2013-02-19T00:48:11.040 に答える