Подтвердить что ты не робот

Weka.core.UnassignedDatasetException при создании немаркированного экземпляра

Я подготовил классификатор IBK с некоторыми данными обучения, которые я создал вручную, следующим образом:

ArrayList<Attribute> atts = new ArrayList<Attribute>();
ArrayList<String> classVal = new ArrayList<String>();
classVal.add("C1");
classVal.add("C2");
atts.add(new Attribute("a"));
atts.add(new Attribute("b"));
atts.add(new Attribute("c"));
atts.add(new Attribute("d"));
atts.add(new Attribute("@@[email protected]@", classVal));

Instances dataRaw = new Instances("TestInstances", atts, 0);
dataRaw.setClassIndex(dataRaw.numAttributes() - 1);
double[] instanceValue1 = new double[]{3,0,1,0,0};
dataRaw.add(new DenseInstance(1.0, instanceValue1));

double[] instanceValue2 = new double[]{2,1,1,0,0};
dataRaw.add(new DenseInstance(1.0, instanceValue2));

double[] instanceValue3 = new double[]{2,0,2,0,0};
dataRaw.add(new DenseInstance(1.0, instanceValue3));

double[] instanceValue4 = new double[]{1,3,0,0,1};
dataRaw.add(new DenseInstance(1.0, instanceValue4));

double[] instanceValue5 = new double[]{0,3,1,0,1};
dataRaw.add(new DenseInstance(1.0, instanceValue5));

double[] instanceValue6 = new double[]{0,2,1,1,1};
dataRaw.add(new DenseInstance(1.0, instanceValue6));

Затем я создаю классификатор:

IBk ibk = new IBk();
try {
    ibk.buildClassifier(dataRaw);

} catch (Exception e) {
    e.printStackTrace();
}

Я хочу создать новый экземпляр с немаркированным классом и классифицировать этот экземпляр, я попробовал следующее без везения.

IBk ibk = new IBk();
try {
    ibk.buildClassifier(dataRaw);
    double[] values = new double[]{3,1,0,0,-1};
    DenseInstance newInst = new DenseInstance(1.0,values);
    double classif = ibk.classifyInstance(newInst);
    System.out.println(classif);
} catch (Exception e) {
    e.printStackTrace();
}

Я получаю следующие ошибки:

weka.core.UnassignedDatasetException: DenseInstance doesn't have access to a dataset!
at weka.core.AbstractInstance.classAttribute(AbstractInstance.java:98)
at weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:74)
at TextCategorizationTest.instancesWithDoubleValues(TextCategorizationTest.java:136)
at TextCategorizationTest.main(TextCategorizationTest.java:33)

Похоже, я делаю что-то неправильно, создавая новый экземпляр. Как я могу создать немаркированный экземпляр точно?

Спасибо в Advance

4b9b3361

Ответ 1

Проблема с этой строкой:

double classif = ibk.classifyInstance(newInst);

Когда вы пытаетесь классифицировать newInst, Weka выдает исключение, потому что newInst не имеет объекта экземпляров (т.е. набора данных), связанного с ним, поэтому он ничего не знает об атрибуте класса.

Сначала вы должны создать новый экземпляр объекта, похожий на dataRaw, добавить к нему свой немаркированный экземпляр, установить индекс класса и только затем попробовать его классифицировать, например:

Instances dataUnlabeled = new Instances("TestInstances", atts, 0);
dataUnlabeled.add(newInst);
dataUnlabeled.setClassIndex(dataUnlabeled.numAttributes() - 1);        
double classif = ibk.classifyInstance(dataUnlabeled.firstInstance());

Ответ 2

Вы увидите эту ошибку, когда вы классифицируете новый экземпляр, который не связан с набором данных. Вы должны связать каждый новый экземпляр, созданный с объектом Instances, используя setDataset.

//Make a place holder Instances
//If you already have access to one, you can skip this step
Instances dataset = new Instances("testdata", attr, 1);
dataset.setClassIndex(classIdx);

DenseInstance newInst = new DenseInstance(1.0,values);

//To associate your instance with Instances object, in this case dataset
newInst.setDataset(dataset); 

После этого вы можете классифицировать только что созданный экземпляр.

double classif = ibk.classifyInstance(newInst);

http://www.cs.tufts.edu/~ablumer/weka/doc/weka.core.Instance.html

Подробная ссылка на реализацию

Ответ 3

См. стр. 203 - 204 документации WEKA. Это очень помогло мне! (Руководство Weka - это файл pdf, который находится в вашей папке установки weka. Просто откройте файл doucmentation.html, и он укажет вам на руководство по pdf.)

Скопировать вложения некоторых фрагментов списков кодов главы 17 (Использование WEKA API/Создание наборов данных в памяти) должно помочь вам решить задачу.