我用来构建分类器的数据集只有两个属性,第一个是字符串注释,第二个是名义上的类,但是数据集太大我不想在服务器中加载它所以我想使用该模型来分类新实例而不加载数据集。 所以这里举例说,我从一些用户评论中创建了一个新实例
String usercomment;
Instance instance = new Instance(2);
instance.setValue(0, usercomment);
instance.setMissing(1);
我知道我必须为实例设置数据集,但我不想加载,那么如何为实例创建具有相似属性的虚拟数据集?也 我正在使用一个旧的weka库我需要使用fastvectors。
答案 0 :(得分:1)
您无需加载数据集来分类新实例。您可以在数据集上训练模型,然后保存此模型。稍后,您加载此模型以对新实例进行分类。请参阅Saving and loading models。
加载模型后,您可以对实例进行分类,请参阅Classifying instances in Use Weka in your Java code
我在git repository WekaExamples中编写了一个示例代码。我也在这里复制粘贴代码,但在该存储库中运行示例。 你可以在命令行中运行它。
gradlew loadArffAndTrainModelExample1 loadModelAndTestExampleInstance1
loadArff
String datasetName = "weather.nominal";
Instances data = DataSetHelper.getInstanceFromFile("data/" + datasetName + ".arff");
// weka.classifiers.trees.J48 -C 0.25 -M 2
String classifierFullName = "weka.classifiers.trees.J48"
String optionString = " -C 0.25 -M 2"
AbstractClassifier classifier = (AbstractClassifier) Class.forName(classifierFullName).newInstance();
classifier.setOptions(Utils.splitOptions(optionString));
classifier.buildClassifier(data); // build classifier
String modelFullFileName = Finals.MODELS_SAVE_FOLDER + classifier.getClass().getName() + ".model";
SerializationHelper.write(modelFullFileName, classifier);
loadModelAndTestExampleInstance1
String datasetName = "weather.nominal.only.header";
Instances data = DataSetHelper.getInstanceFromFile("data/" + datasetName + ".arff");
Instance inst = new DenseInstance(data.numAttributes());
inst.setDataset(data);
inst.setValue(0, 1);
inst.setValue(1, 2);
inst.setValue(2, 0);
inst.setValue(3, 1);
println(inst)
Classifier cls = (Classifier) SerializationHelper.read("models/weka.classifiers.trees.J48.model");
double prediction = cls.classifyInstance(inst);
println("prediction as double: " + prediction);
println("prediction as name: " + data.classAttribute().value((int) prediction));
代码输出如下
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:loadModelAndTestExampleInstance1
overcast,cool,high,FALSE,?
prediction as double: 0.0
prediction as name: yes
BUILD SUCCESSFUL