1
我創建了一個大小約爲7000的巨大j48樹,有如此多的分支和樹葉。我也得到了分類結果以及測試圖像。我想知道哪個節點正在對每個結果進行分類。換句話說,weka有一種方法可以查看作出決定的葉節點的id或某些內容。Weka預測分類節點
我創建了一個大小約爲7000的巨大j48樹,有如此多的分支和樹葉。我也得到了分類結果以及測試圖像。我想知道哪個節點正在對每個結果進行分類。換句話說,weka有一種方法可以查看作出決定的葉節點的id或某些內容。Weka預測分類節點
就我所知,您將無法通過Weka GUI執行此操作。但是,如果您使用Weka API,有一些希望。我不是Java專家,所以下面的步驟可能不會遵循最佳實踐,但它對我編制的小例子有用。
構建J48樹在Weka的圖形用戶界面,並在「更多選項」選項卡中選擇「輸出源代碼」
複製源代碼到一個新的類在Java代碼中
在classifyInstance方法增大返回變量以包括葉數
修改類,使其不再伸出「分類」(這需要消除在班上其他幾個方法,你剛剛創建)
下面是一個類,將一個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]; }
}
}
非常感謝!不知道weka中有可用的輸出源代碼選項。雖然我會喜歡一個方法調用weka api來獲得相同的結果,但很高興知道這至少是可能的。 – user973743