您可以将超类Classifier
用作任何分类器对象的类型声明,即使每个对象都是Classifier
诸如J48
. 它之所以有效,是因为它们都实现了超类的功能,因此即使您不一定知道您正在使用哪种特定类型的分类器,也会定义函数调用。Axcdnt 的答案链接到有关多态性的更多详细信息。无论如何,我有一个带有以下代码片段的工作程序;他们完全按照您的需要做。
Classifier Clfs = null;
try {
if (modelType.equals("J48")) {
Clfs = new J48();
} else if (modelType.equals("MLP")) {
Clfs = new MultilayerPerceptron();
} else if (modelType.equals("IB3")) {
Clfs = new IBk(3);
} else if (modelType.equals("RF")) {
Clfs = new RandomForest();
} else if (modelType.equals("NB")) {
Clfs = new NaiveBayes();
//...
在其他地方,在将分类器写入我调用的文件之后
Classifier cls = (Classifier) weka.core.SerializationHelper.read(target);
prediction = cls.distributionForInstance(data.instance(0));
(target
是一个包含从中加载模型的文件路径的字符串)如您所见,我使用的分类器类型无关紧要,除非在创建时,当我必须指定时。注意仍然会有一些限制,例如 j48 不能预测数字类。