我有一个数据集,其中包含一些属于由1和2表示的两个类标签的特征。该数据集的处理是为了构建决策树:在树的构建过程中,我需要计算信息增益以找到数据集的最佳分区。
假设标签1有N1个特征,标签2有N2个特征,那么熵可以用以下公式计算:
Entropy = - (N1/N)*log2(N1/N) - (N2/N)*log2(N2/N)
, 其中N = N1 + N2
我需要计算三个熵值以获得信息增益:
entropyBefore
,即当前数据集划分前的熵;entropyLeft
,即分割后左分裂的熵;entropyRight
,即分区后右拆分的熵。
因此,信息增益等于entropyBefore - (S1/N)*entropyLeft - (S2/N)*entropyRight
,其中S1是属于分割 1的类别1的特征的数量,而S2是属于分割 2的类别2的特征的数量。
如何计算信息增益值以减少浮点逼近误差?当我在信息增益必须为零的情况下应用上述公式时,计算值等于一个非常小的负值。
更新(示例代码)
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;
}
}