Цифровое или категорическое разделение?
Я строю классификатор дерева решений и нашел этот метод для расчета прироста информации. Это может быть глупый вопрос, но мне интересно, если разделение в этом методе для числовых или категориальных атрибутов? Я в замешательстве, потому что я думал, что порог (медиана) был использован для числовых разбиений, но этот метод использует строковые значения.
Любая помощь приветствуется.
Вот код:
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;
}
}
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
}
Я настоятельно рекомендую смотреть на алгоритмы из учебника или википедии как ссылку, а не переходить непосредственно к коду. Или, если вам понадобятся примеры кода, я бы искал репозитории на Github, которые имеют более высокое качество (три измерения).
- Вы хотите изучить код с четкой лицензией. Во многих местах отсутствие лицензии равносильно тому, что она проприетарна, несмотря на скрытую природу Github с открытым исходным кодом, но это не является юридически точным.
- Вы хотите изучать код, который используют люди. Есть много других реализаций алгоритма дерева решений на github, которые имеют больше нуля звездочек и проблем.
- В противном случае вы хотите изучить код, в котором есть тесты (указание и возможность проверить, действительно ли он работает для вас).
В идеале, вы хотите много признаков доверия. Если я пойду на github, найду дерево решений, проверим Java, отсортирую по большинству звезд, я сам посмотрю на одно из sanity / quickml или saebyn / java-принятия решений.