2013-10-09 214 views
1

我創建了一個大小約爲7000的巨大j48樹,有如此多的分支和樹葉。我也得到了分類結果以及測試圖像。我想知道哪個節點正在對每個結果進行分類。換句話說,weka有一種方法可以查看作出決定的葉節點的id或某些內容。Weka預測分類節點

回答

0

就我所知,您將無法通過Weka GUI執行此操作。但是,如果您使用Weka API,有一些希望。我不是Java專家,所以下面的步驟可能不會遵循最佳實踐,但它對我編制的小例子有用。

  1. 構建J48樹在Weka的圖形用戶界面,並在「更多選項」選項卡中選擇「輸出源代碼」

  2. 複製源代碼到一個新的類在Java代碼中

  3. classifyInstance方法增大返回變量以包括葉數

  4. 修改類,使其不再伸出「分類」(這需要消除在班上其他幾個方法,你剛剛創建)

下面是一個類,將一個Weka的實例進行分類以決定樹樁分類。輸出將包含一個葉號。這是通過遵循上述步驟從Weka示例數據集中包含的分類天氣數據構建的。對於你所擁有的巨大決策樹,可能需要做一些字符串替換來有效地增加你的返回變量。

import weka.core.Instance; 

public class WekaWrapper { 

    /** 
    * Classifies the given instance. 
    * 
    * @param i the instance to classify 
    * @return the classification result 
    */ 
    public double[] classifyInstance(Instance i) throws Exception { 
    Object[] s = new Object[i.numAttributes()]; 

    for (int j = 0; j < s.length; j++) { 
     if (!i.isMissing(j)) { 
     if (i.attribute(j).isNominal()) 
      s[j] = new String(i.stringValue(j)); 
     else if (i.attribute(j).isNumeric()) 
      s[j] = new Double(i.value(j)); 
     } 
    } 

    // set class value to missing 
    s[i.classIndex()] = null; 

    return WekaClassifier.classify(s); 
    } 
} 
class WekaClassifier { 
    public static double[] classify(Object[] i) { 
    /* outlook */ 
     double[][] here=new double[3][2]; 
     here[0][0]=0; //leaf value 
     here[0][1]=1; //leaf ID 
     here[1][0]=0; //leaf value 
     here[1][1]=2; //leaf ID 
     here[2][0]=0; //leaf value 
     here[2][1]=3; //leaf ID 
    if (i[0] == null) { return here[0]; } else if (((String)i[0]).equals("overcast")) { return here[1]; } else { return here[2]; } 
    } 
} 
+1

非常感謝!不知道weka中有可用的輸出源代碼選項。雖然我會喜歡一個方法調用weka api來獲得相同的結果,但很高興知道這至少是可能的。 – user973743