0

Ich baue einen Entscheidungsbaum Klassifikator und ich fand diese Methode zur Berechnung der Informationsgewinn. Das mag eine dumme Frage sein, aber ich frage mich, ob die Aufteilung in diese Methode für numerische oder kategorische Attribute ist? Ich bin verwirrt, weil ich dachte, dass ein Schwellenwert (Median) für die Ziffern Splits verwendet wurde, aber diese Methode verwendet String-Werte.Numeral oder Categorical Split?

Jede Hilfe wird geschätzt. Hier

ist der Code:

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; 
      } 
     } 
+0

Es ist möglich, dass sie die Strings als quantisierte Versionen der Werte verwenden, oder dies ist eine Art von Fehler. Wo ist der Rest dieses Codes? Können wir es im Kontext sehen? –

+0

https://github.com/vedrejothin/ID3-DecisionTree/blob/master/DecisonTree.java hier ist der vollständige Code – EPebassen93

Antwort

0

Obwohl der Code, den Sie bei wies auf die Terminologie der Schwellenwerte verwendet, wenn man sich den Kommentaren sehen, wird es sie in einem kategorischen oder binäre Weise verwendet wird.

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 
} 

würde ich empfehlen, an den Algorithmen aus einem Lehrbuch oder Wikipedia als Referenz suchen, anstatt zu gehen direkt zum Code. Oder, wenn Sie Code-Beispiele benötigen, würde ich nach Repositories auf Github suchen, die von höherer Qualität sind (drei Dimensionen).

  1. Sie möchten Code mit einer eindeutigen Lizenz studieren. An vielen Orten ist das Fehlen einer Lizenz gleichbedeutend damit, proprietär zu sein, trotz der impliziten Open-Source-Natur von Github, die rechtlich nicht korrekt ist.
  2. Sie möchten Code studieren, den Menschen verwenden. Es gibt viel mehr Entscheidungsbaum-Algorithmus-Implementierungen auf GitHub, die mehr als null Sterne und Probleme haben.
  3. Wenn Sie dies nicht tun, möchten Sie Code mit Tests (eine Indikation und eine Chance zu testen, ob es tatsächlich für Sie funktioniert) studieren.

Idealerweise möchten Sie viele Hinweise auf Vertrauen. Wenn ich nach GitHub gehe, suche nach Entscheidungsbaum, überprüfe Java, sortiere nach den meisten Sternen, gucke mir einen von sanity/quickml oder saebyn/java-decision-tree an.

Verwandte Themen