我试图使用weka库和在线教程对java中的一个实例进行分类。
我已经在我的设备中构建了一个模型,并使用此代码从磁盘加载了该模型。
public void makeModel() throws Exception
{
ArffLoader loader = new ArffLoader();
loader.setFile(new File("data.arff"));
Instances structure = loader.getDataSet();
structure.setClassIndex(1);
// train NaiveBayes
NaiveBayesMultinomial n = new NaiveBayesMultinomial();
FilteredClassifier f = new FilteredClassifier();
StringToWordVector s = new StringToWordVector();
s.setUseStoplist(true);
s.setWordsToKeep(100);
f.setFilter(s);
f.setClassifier(n);
structure.numAttributes();
f.buildClassifier(structure);
Instance current;
Evaluation eval = new Evaluation(structure);
eval.crossValidateModel(f, structure, 10, new Random(1));
System.out.println(eval.toSummaryString("\nResults\n======\n", false));
// output generated model
//System.out.println(f);
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("classifier.model"));
oos.writeObject(f);
oos.flush();
oos.close();
}
------------------------ 输出-------------
正确分类实例20158 79.6948%错误分类实例5136 20.3052%Kappa统计量0.6737平均绝对误差0.0726均方根误差0.2025相对绝对误差38.7564%均方根误差66.1815%病例覆盖率(0.95水平)96.4142%平均相对误差。区域大小(0.95级)27.7531%实例总数25294
然后,我使用相同的模型对一个未标记的实例进行分类。
public void classify() throws Exception
{
FilteredClassifier cls = (FilteredClassifier) weka.core.SerializationHelper.read("classifier.model");
Instances unlabeled = new Instances(
new BufferedReader(
new FileReader("test.arff")));
// set class attribute
unlabeled.setClassIndex(0);
// create copy
Instances labeled = new Instances(unlabeled);
// label instances
for (int i = 0; i < unlabeled.numInstances(); i++) {
System.out.println(labeled.instance(i).classValue());
System.out.print(", actual: " + labeled.classAttribute().value((int)labeled.instance(i).classValue()));
double clsLabel = cls.classifyInstance(unlabeled.instance(i));
labeled.instance(i).setClassValue(clsLabel);
System.out.println(", predicted: " + labeled.classAttribute().value((int) clsLabel));
}
// save labeled data
System.out.println("ended");
}
------------------------输出---------------------------
1.0,实际值:Bud1 ?是一个新字符串。txtIlocblob R(????@?@?@?@?@?@?@?@?@?E?DSDB `@?@?@?@?@?@,预测:*WEKA*DUMMY*STRING*FOR*STRING*ATTRIBUTES*2.0,实际:这是一个新字符串,预测:*WEKA*DUMMY*STRING*FOR*STRING*ATTRIBUTES*结束
然而,我的错误是,预测值实际上是*字符串*属性*的*WEKA*伪*字符串*,而它应该给我一个类标签。
我已经在分类方法中添加了这些行。
ArffLoader loader = new ArffLoader();
loader.setFile(new File("data.arff"));
Instances structure = loader.getDataSet();
structure.setClassIndex(1);
要获取类标签,我将其更改为这个
System.out.println(", predicted: " + structure.classAttribute().value((int) clsLabel));
在保存分类器的同时也保存实例(只需标头,不需要数据):
Instances instancesSample = new Instances(structure, 0);
instancesSample.setClassIndex(1);
...
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("classifier.model"));
oos.writeObject(f);
oos.writeObject(instancesSample);
oos.flush();
oos.close();
加载模型后,将保存的实例加载为instancesSample
。分类时:
ObjectInputStream objectInputStream = new ObjectInputStream(new BufferedInputStream(new FileInputStream("classifier.model")));
FilteredClassifier cls = (FilteredClassifier)= (Classifier) objectInputStream.readObject();
Instances instancesSample = (Instances) objectInputStream.readObject();
objectInputStream.close();
int classIndex = 1;
Instances ins = unlabeled[i];
double clsLabel = cls.classifyInstance(ins);
String prediction = instancesSample.attribute(classIndex).value((int) clsLabel));
System.out.println(", predicted: " + prediction);
我没有得到任何警告,应用程序成功构建。但是,如果我尝试在连接的设备上运行它,它会崩溃,并出现以下错误(摘要): java.lang.NoClassDefoundError:解析:lcom/google/android/gms/r$string失败; 在com.google.android.gms.measurement.zza.(来源不明) ... 原因:java.lang.ClassNotFou
问题内容: 我试图声明一个类,如下所示 在上面的代码中,s1和byte不会编译,但是s2和byte1会编译。如果我将整个常量声明放在外部类中,则效果很好。我想念什么。有什么帮助吗? 问题答案: 阅读Java语言规范,第3版,第8.1.3节。 内部类是未显式或隐式声明为static的嵌套类。内部类不得声明静态初始化器(第8.7节)或成员接口。 这就是为什么您不能声明 new的原因 。 内部类不得声明
问题内容: 出现错误: 无法使用类型为参数的列表进行调用 如何解决呢? 问题答案: 使用Xcode7beta6: 带有Xcode7发行版:
问题内容: 我写了一个函数将字符串转换为整数 我有一个字符串6042076399,它给了我错误: 这不是将字符串转换为整数的正确方法吗? 问题答案: 这是我更喜欢的方式: 编辑(2015年4月4日): 如下面的评论所述,实际上这样做更好: