1と2で示される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;
}
}