編寫符合weka規範的自定義分類器
阿新 • • 發佈:2018-11-20
1 在編寫分類器時一定要繼承AbstractClassifier或者它的子類;(這也是weka識別的方式吧)。
2 重寫介面buildClassifier;這個方法重要作用是:構造分類器並訓練模型;
3 重寫classifyinstance,這個方法功能是對單個例項進行預測。
在weka中也有很多分類器並沒有重寫這個方法,而是直接使用父類(AbstractClassifier)的方法;如:SVM,RandomForest等
4 重寫distributeForInstance;這個方法的作用是得到置信度(其實,在classifyinstance中也是呼叫了該方法)。
5 重寫getCapabilities方法這個方法控制是否顯示分類器(也就是在weka中選擇分類器是否為灰色)
接下來舉一個簡單的例子:
@Override public void buildClassifier(Instances arg0) throws Exception { // TODO Auto-generated method stub Instances ins = null; if (arg0.numAttributes() <= 2) { ins = atgc1(arg0); lib.buildClassifier(ins); }else { lib.buildClassifier(arg0); } } public double classifyInstance(Instance instance) throws Exception { double result = 0; Instances ii = null; double dist[] = new double[2]; if (instance.numAttributes() <= 2) { ii = atgc(instance); dist = lib.distributionForInstance(ii.instance(0)); } else { dist = lib.distributionForInstance(instance); } if (dist == null) { throw new Exception("Null distribution predicted"); } switch (instance.classAttribute().type()) { case Attribute.NOMINAL: double max = 0; int maxIndex = 0; for (int i = 0; i < dist.length; i++) { if (dist[i] > max) { maxIndex = i; max = dist[i]; } } if (max > 0) { return maxIndex; } else { return Utils.missingValue(); } case Attribute.NUMERIC: case Attribute.DATE: return dist[0]; default: return Utils.missingValue(); } }
我只簡單的重寫了buildclassify和classifyinstance方法。
另外說一點就是在匯入jar包時可以不用匯入weka.jar.具體載入方法可以看新增自定義分類器到weka。