gpt4 book ai didi

java - 如何多次重建FilteredClassifier?

转载 作者:行者123 更新时间:2023-12-01 13:40:43 27 4
gpt4 key购买 nike

我需要在不同的训练实例上一次性在 weka 中构建过滤分类器。我已经发布了示例代码来阐明我的观点



导入 weka.classifiers.meta.FilteredClassifier;
导入 weka.classifiers.trees.J48;
导入 weka.filters.unsupervised.attribute.Remove;
...
实例 train = ...//来自某处
实例 test = ...//来自某处
//筛选
删除 rm = 新删除();
rm.setAttributeIndices("1");//删除第一个属性
//分类器
J48 j48 = 新 J48();
j48.setUnpruned(true);//使用未修剪的 J48
//元分类器
FilteredClassifier fc = new FilteredClassifier();
fc.setFilter(rm);
fc.setClassifier(j48);
//训练并做出预测
fc.buildClassifier(train);
for (int i = 0; i < test.numInstances(); i++) {
双 pred = fc.classifyInstance(test.instance(i));
System.out.print("ID:"+ test.instance(i).value(0));
System.out.print(",实际:"+ test.classAttribute().value((int) test.instance(i).classValue()));
System.out.println(", 预测: "+ test.classAttribute().value((int) pred));
}

在将数据打印到控制台后的 for 循环内,我需要在另一个训练数据集上再次重建 FilteredClassifier (fc)。我目前正在尝试这样做,但没有成功,就像我使用 FilteredClassifier (fc) 的相同实例或创建 FilteredClassifier 的新实例一样,Weka 引发 NullPointerException。

我怎样才能做我想做的事?如果 FilteredClassifier 创建线程以便在我使用 FilteredClassifier 的另一个实例时挂起其操作,我是否需要使用任何 wait() 或 notification() 操作?

这是 JVM 引发的异常的 pintStack



java.lang.NullPointerException
在 java.util.Hashtable.hash(来源未知)
在 java.util.Hashtable.get(来源未知)
在 weka.core.Attribute.addStringValue(Attribute.java:868)
在 weka.core.StringLocator.copyStringValues(StringLocator.java:148)
在 weka.core.StringLocator.copyStringValues(StringLocator.java:93)
在 weka.filters.Filter.copyValues(Filter.java:364)
在 weka.filters.Filter.bufferInput(Filter.java:301)
在weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:697)
在 weka.filters.Filter.useFilter(Filter.java:661)
在 weka.classifiers.meta.FilteredClassifier.buildClassifier(FilteredClassifier.java:390)

我感谢任何形式的帮助......

最佳答案

首先,我不知道原因,但这可能很有用:我恰好遇到了同样的异常,并且解决了它。

我正在将两个数据集合并为一个更大的数据集。 摘要

for (int i=0; i < datasetB.numInstances(); i++) {
Instance instance = datasetB.instance(i);
datasetA.add(instance);
}

datasetA包含A+B

但是,当我尝试使用 datasetA 时,类似

public MyResponse classify(String msg) {
...

// rebuild classififer and filter
Instances filteredData = Filter.useFilter(dataset, filter); //BREAKS
...

// classify
MyResponse response = classifier.classifyInstance(filteredInstance)
}

它说

java.lang.NullPointerException
at java.util.Hashtable.hash(Unknown Source)
at java.util.Hashtable.get(Unknown Source)
at weka.core.Attribute.addStringValue(Attribute.java:868)
at weka.core.StringLocator.copyStringValues(StringLocator.java:148)
at weka.core.StringLocator.copyStringValues(StringLocator.java:93)
at weka.filters.Filter.copyValues(Filter.java:364)
at weka.filters.Filter.bufferInput(Filter.java:301)
at weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:697)
at weka.filters.Filter.useFilter(Filter.java:661)
<小时/>

解决方案是:将 datasetB 的实例视为一个新实例。

如果您构建一个新实例,您将执行类似的操作

// Msg: String, Class: String
private Instance makeInstance(String text, String classValue) {
Instance instance = new Instance(2); // two attributes
Attribute messageAttribute = data.attribute("Msg");
instance.setValue(messageAttribute, messageAttribute.addStringValue(text));
instance.setClassValue(classValue);
instance.setDataset(this.dataset);
return instance;
}

与datasetB实例相同

private Instance makeInstance(Instance i) {
Instance instance = new Instance(2); // two attributes
Attribute messageAttribute = dataset.attribute("Msg");
instance.setValue(messageAttribute, messageAttribute.addStringValue(getMsg(i)));
instance.setDataset(this.dataset);
instance.setClassValue(getClassValue(i));
return instance
}

并在合并方法中调用该方法

for (int i=0; i < data.numInstances(); i++) {
Instance instance = data.instance(i);
Instance buildInstance = makeInstance(instance);
dataset.add(buildInstance);
}

关于java - 如何多次重建FilteredClassifier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20813069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com