Weka One-Class SVM: Как установить значение класса для прогнозирования? - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь обучить модель One-Class SVM, используя библиотеку weka. У меня проблемы с определением набора тестовых данных. Модель поддерживает только один унарный класс. Так как мне установить прогноз в наборе тестов?

Я пробовал несколько настроек, но некоторые заканчиваются ошибкой или бессмысленным распространением для выброса / нормального экземпляра.

    // define instances
    Instances trainSet = new Instances("OneClassSVMDataset",
            new ArrayList<Attribute>() {{
                add(new Attribute("value"));
                add(new Attribute("class"));
            }},0);
    trainSet.setClassIndex(1);

    Instances testSet = new Instances(trainSet);

    // training instance
    Instance trainInst = new DenseInstance(2);
    trainInst.setValue(0, 1);
    trainInst.setValue(1, 1);
    trainInst.setDataset(trainSet);

    // testing instance
    Instance testInst = new DenseInstance(2);
    testInst.setValue(0, 1);
    testInst.setDataset(testSet);


    // set instances as values 1 or 0 
    for (int i = 0; i < 20; i++) {
        trainInst.setValue(0, 1);
        trainSet.add(trainInst);
        trainInst.setValue(0, 0);
        trainSet.add(trainInst);
    }

    // this instance should be normal
    testInst.setValue(0, 0);
    testSet.add(testInst);
    // this instance should be normal
    testInst.setValue(0, 1);
    testSet.add(testInst);
    // this instance should be outlier
    testInst.setValue(0, -10);
    testSet.add(testInst);
    // this instance should be outlier
    testInst.setValue(0, 10);
    testSet.add(testInst);

    // convert class attribute to nominal
    NumericToNominal toNominal = new NumericToNominal();
    toNominal.setAttributeIndicesArray(new int[]{1});
    try {
        toNominal.setInputFormat(trainSet);
        trainSet = Filter.useFilter(trainSet, toNominal);
        testSet = Filter.useFilter(testSet, toNominal);
    } catch (Exception e) {
        e.printStackTrace();
    }

    // create One-Class SVM classifficator 
    LibSVM oneClassSVM = new LibSVM();
    oneClassSVM.setOptions(weka.core.Utils.splitOptions("-S 2 -K 2 -W 1 -V"));
    // train model
    oneClassSVM.buildClassifier(trainSet);

    // test model
    Evaluation eval = new Evaluation(trainSet);
    eval.evaluateModel(oneClassSVM, testSet);

    System.out.println(eval.toSummaryString());
    System.out.println(eval.toClassDetailsString());
    System.out.println(eval.toMatrixString());

Код ниже возвращает все экземпляры тестирования как «Игнорируемые неизвестные экземпляры класса»

Распределение по некоторым значениям (распределение в скобках): -1 (0,0); 0 (0,0); 1 (0,0); 2 (0,0); 0,3 (1,0); 1000 (0,0)

...