编写符合weka规范的自定义分类器

版权声明:博主委派超级玛丽进行维权,转载请附上链接 https://blog.csdn.net/So_that/article/details/83539908

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

猜你喜欢

转载自blog.csdn.net/So_that/article/details/83539908