数字或分类拆分?
Numeral or Categorical split?
我正在构建一个决策树分类器,我发现了这种计算信息增益的方法。
这可能是一个愚蠢的问题,但我想知道这种方法中的拆分是针对数字还是
分类属性?我很困惑,因为我认为阈值(中位数)用于数字
拆分,但此方法使用字符串值。
感谢任何帮助。
代码如下:
public static double getInfoGain(int f, ArrayList<String[]> dataSubset) {
double entropyBefore = getEntropy(dataSubset); //Entropy before split
if(entropyBefore != 0){ // Calculate information gain if entropy is not 0
String threshold = thresholdMap.get(f); // Get threshold value of the feature
ArrayList<String[]> leftData = new ArrayList<String[]>();
ArrayList<String[]> rightData = new ArrayList<String[]>();
for(String[] d : dataSubset) {
if(d[f].equals(threshold)) {
leftData.add(d); // If feature value of data == threshold, add it to leftData
} else {
rightData.add(d); // If feature value of data != threshold, add it to leftData
}
}
if(leftData.size() > 0 && rightData.size() > 0) {
double leftProb = (double)leftData.size()/dataSubset.size();
double rightProb = (double)rightData.size()/dataSubset.size();
double entropyLeft = getEntropy(leftData); //Entropy after split - left
double entropyRight = getEntropy(rightData); //Entropy after split - right
double gain = entropyBefore - (leftProb * entropyLeft) - (rightProb * entropyRight);
return gain;
} else { // If entropy = 0 on either subsets of data, return 0
return 0;
}
} else { // If entropy = 0 before split, return 1
return -1;
}
}
虽然您指出的代码使用了阈值术语,但如果您查看注释,它是以分类或二进制方式使用它们的。
if(d[f].equals(threshold)) {
leftData.add(d); // If feature value of data == threshold, add it to leftData
} else {
rightData.add(d); // If feature value of data != threshold, add it to leftData
}
我强烈建议您查看教科书中的算法或 Wikipedia 作为参考,而不是直接看代码。或者,如果您发现自己需要代码示例,我会在 Github 上寻找质量更高(三维)的存储库。
- 您想学习具有明确许可的代码。在许多地方,没有许可证等同于专有,尽管 Github 隐含了开源性质,但这在法律上是不准确的。
- 您想研究人们使用的代码。 github 上有更多的决策树算法实现,它们的星级和问题都超过零。
- 否则,您想研究具有测试的代码(指示和机会来测试它是否真的适合您自己)。
理想情况下,您需要许多信任的迹象。如果我转到 github,搜索决策树,检查 Java,按大多数星星排序,我会自己查看 sanity/quickml or saebyn/java-decision-tree 中的一个。
我正在构建一个决策树分类器,我发现了这种计算信息增益的方法。 这可能是一个愚蠢的问题,但我想知道这种方法中的拆分是针对数字还是 分类属性?我很困惑,因为我认为阈值(中位数)用于数字 拆分,但此方法使用字符串值。
感谢任何帮助。
代码如下:
public static double getInfoGain(int f, ArrayList<String[]> dataSubset) {
double entropyBefore = getEntropy(dataSubset); //Entropy before split
if(entropyBefore != 0){ // Calculate information gain if entropy is not 0
String threshold = thresholdMap.get(f); // Get threshold value of the feature
ArrayList<String[]> leftData = new ArrayList<String[]>();
ArrayList<String[]> rightData = new ArrayList<String[]>();
for(String[] d : dataSubset) {
if(d[f].equals(threshold)) {
leftData.add(d); // If feature value of data == threshold, add it to leftData
} else {
rightData.add(d); // If feature value of data != threshold, add it to leftData
}
}
if(leftData.size() > 0 && rightData.size() > 0) {
double leftProb = (double)leftData.size()/dataSubset.size();
double rightProb = (double)rightData.size()/dataSubset.size();
double entropyLeft = getEntropy(leftData); //Entropy after split - left
double entropyRight = getEntropy(rightData); //Entropy after split - right
double gain = entropyBefore - (leftProb * entropyLeft) - (rightProb * entropyRight);
return gain;
} else { // If entropy = 0 on either subsets of data, return 0
return 0;
}
} else { // If entropy = 0 before split, return 1
return -1;
}
}
虽然您指出的代码使用了阈值术语,但如果您查看注释,它是以分类或二进制方式使用它们的。
if(d[f].equals(threshold)) {
leftData.add(d); // If feature value of data == threshold, add it to leftData
} else {
rightData.add(d); // If feature value of data != threshold, add it to leftData
}
我强烈建议您查看教科书中的算法或 Wikipedia 作为参考,而不是直接看代码。或者,如果您发现自己需要代码示例,我会在 Github 上寻找质量更高(三维)的存储库。
- 您想学习具有明确许可的代码。在许多地方,没有许可证等同于专有,尽管 Github 隐含了开源性质,但这在法律上是不准确的。
- 您想研究人们使用的代码。 github 上有更多的决策树算法实现,它们的星级和问题都超过零。
- 否则,您想研究具有测试的代码(指示和机会来测试它是否真的适合您自己)。
理想情况下,您需要许多信任的迹象。如果我转到 github,搜索决策树,检查 Java,按大多数星星排序,我会自己查看 sanity/quickml or saebyn/java-decision-tree 中的一个。