我使用WEKA gui训练并创建了一个J48模型。我将模型文件保存到我的计算机上,现在我想用它来分类我的Java代码中的单个实例。我想预测属性" cluster"。我的工作如下:
public void classify(double lat, double lon, double co)
{
// Create attributes to be used with classifiers
Attribute latitude = new Attribute("latitude");
Attribute longitude = new Attribute("longitude");
Attribute carbonmonoxide = new Attribute("co");
// Create instances for each pollutant with attribute values latitude, longitude and pollutant itself
inst_co = new DenseInstance(4);
// Set instance's values for the attributes "latitude", "longitude", and "pollutant concentration"
inst_co.setValue(latitude, lat);
inst_co.setValue(longitude, lon);
inst_co.setValue(carbonmonoxide, co);
inst_co.setMissing(cluster);
Classifier cls_co = (Classifier) weka.core.SerializationHelper.read("/CO_J48Model.model");//load classifier from file
// Test the model
double result = cls_co.classifyInstance(inst_co);
}
但是,我在行inst_co.setValue(latitude, lat);
上得到一个IndexArrayOutofBoundsException。我找不到这个例外的原因。如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:8)
您需要将inst_co添加到数据集,Instances对象。以下代码应该可以工作。
import java.util.ArrayList;
import weka.classifiers.Classifier;
import weka.core.Attribute;
import weka.core.DenseInstance;
import weka.core.Instance;
import weka.core.Instances;
public class QuestionInstanceClassifiy {
public static void main(String[] args) {
QuestionInstanceClassifiy q = new QuestionInstanceClassifiy();
double result = q.classify(1.0d, 1, 1);
System.out.println(result);
}
private Instance inst_co;
public double classify(double lat, double lon, double co) {
// Create attributes to be used with classifiers
// Test the model
double result = -1;
try {
ArrayList<Attribute> attributeList = new ArrayList<Attribute>(2);
Attribute latitude = new Attribute("latitude");
Attribute longitude = new Attribute("longitude");
Attribute carbonmonoxide = new Attribute("co");
ArrayList<String> classVal = new ArrayList<String>();
classVal.add("ClassA");
classVal.add("ClassB");
attributeList.add(latitude);
attributeList.add(longitude);
attributeList.add(carbonmonoxide);
attributeList.add(new Attribute("@@class@@",classVal));
Instances data = new Instances("TestInstances",attributeList,0);
// Create instances for each pollutant with attribute values latitude,
// longitude and pollutant itself
inst_co = new DenseInstance(data.numAttributes());
data.add(inst_co);
// Set instance's values for the attributes "latitude", "longitude", and
// "pollutant concentration"
inst_co.setValue(latitude, lat);
inst_co.setValue(longitude, lon);
inst_co.setValue(carbonmonoxide, co);
// inst_co.setMissing(cluster);
// load classifier from file
Classifier cls_co = (Classifier) weka.core.SerializationHelper
.read("/CO_J48Model.model");
result = cls_co.classifyInstance(inst_co);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
您可以从Instances创建数据对象。将您的实例添加到此数据中。之后,您可以在实例中设置值。
Instances data = new Instances("TestInstances",attributeList,0);
inst_co = new DenseInstance(data.numAttributes());
data.add(inst_co);
我建议从外部文件中获取标题信息和实例值,或仅创建此信息一次。
答案 1 :(得分:3)
实际上我试过在我的情况下调用instance.setDataSet()方法,而不是addInstance方法。所以你的代码应该是 inst_co.setDataSet(data)。