Использовать данные из вектора модели (с несколькими атрибутами) без создания файла ARFF в WEKA API в JAVA - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь подготовить некоторые данные, которые у меня есть, в двух векторах моего модельного класса для обучения для классификации (один для поезда, а другой для теста) с использованием WEKA API в Java.Есть ли способ, которым я могу расположить свои данные таким образом, чтобы мне не нужно было создавать файл * .ARFF?

Мой класс модели состоит из шести атрибутов L1 (String), L2 (String), A (double), B (double), C (double), D (double), Station (String)

Каждая строка будет выглядеть так, где traindata - это вектор:

for(int i=0; i<traindata.size(); i++) {
    double[] row = new double[] { traindata.get(i).getL1(),traindata.get(i).getL2(),traindata.get(i).getA(), traindata.get(i).getB(), traindata.get(i).getC(), traindata.get(i).getD(), traindata.get(i).getStation() };
}

И их большая коллекция.

Кто-нибудь может мне помочь, пожалуйста?

1 Ответ

0 голосов
/ 06 марта 2019

Для обучения классификатора в Weka вам нужен объект Instances.Объект Instances содержит как структуру ваших данных, так и каждую Instance ваших данных.Файл ARFF является сериализованной версией объекта Instances.Instance - это просто структура, которая содержит пример / экземпляр ваших данных.

Чтобы вы могли создать Instances объект, заполните его Instance s.Вот простой код:

// create attributes. For nominal attributes list all possible values
ArrayList<Attribute> attributes = new ArrayList<Attribute>();
attributes.add(new Attribute("L1", new ArrayList<String>(Arrays.AsList("L1_val1", "L1_val2", ...)));
attributes.add(new Attribute("L2", new ArrayList<String>(Arrays.AsList("L2_val1", "L2_val2", ...)));
attributes.add(new Attribute("A"));
attributes.add(new Attribute("B"));
attributes.add(new Attribute("C"));
attributes.add(new Attribute("D"));
attributes.add(new Attribute("Station", new ArrayList<String>(Arrays.AsList("S1", "S2", ...)));

//create Instances
Instances ins = new Instances(name, attributes, traindata.size());

//create Instance
for(int i=0; i<traindata.size(); i++) {
    String L1 = traindata.get(i).getL1();
    String L2 = traindata.get(i).getL2();
    String station = traindata.get(i).getStation();

    double[] row = new double[] { 
        attributes.get(0).indexOfValue(L1), //convert string to double - index of L1
        attributes.get(1).indexOfValue(L2), //convert string to double - index of L2
        traindata.get(i).getA(), 
        traindata.get(i).getB(), 
        traindata.get(i).getC(), 
        traindata.get(i).getD(), 
        attributes.get(1).indexOfValue(station), //convert string to double  
     };
    Instance instance = new DenseInstance(weight, row);
    instances.add(instance);
 }

//build classifier
classifier.buildClassifier(instances);
...