Цифровое или категорическое разделение?

Я строю классификатор дерева решений и нашел этот метод для расчета прироста информации. Это может быть глупый вопрос, но мне интересно, если разделение в этом методе для числовых или категориальных атрибутов? Я в замешательстве, потому что я думал, что порог (медиана) был использован для числовых разбиений, но этот метод использует строковые значения.

Любая помощь приветствуется.

Вот код:

    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, которые имеют более высокое качество (три измерения).

  1. Вы хотите изучить код с четкой лицензией. Во многих местах отсутствие лицензии равносильно тому, что она проприетарна, несмотря на скрытую природу Github с открытым исходным кодом, но это не является юридически точным.
  2. Вы хотите изучать код, который используют люди. Есть много других реализаций алгоритма дерева решений на github, которые имеют больше нуля звездочек и проблем.
  3. В противном случае вы хотите изучить код, в котором есть тесты (указание и возможность проверить, действительно ли он работает для вас).

В идеале, вы хотите много признаков доверия. Если я пойду на github, найду дерево решений, проверим Java, отсортирую по большинству звезд, я сам посмотрю на одно из sanity / quickml или saebyn / java-принятия решений.

Другие вопросы по тегам