1. 程式人生 > >編寫符合weka規範的自定義分類器

編寫符合weka規範的自定義分類器

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