Search in sources :

Example 1 with Result

use of meka.core.Result in project dkpro-tc by dkpro.

the class WekaResultsTest method testWekaResultsMultiLabel.

@Test
public void testWekaResultsMultiLabel() throws Exception {
    BR cl = new BR();
    cl.setOptions(new String[] { "-W", J48.class.getName() });
    Instances testData = WekaUtils.makeOutcomeClassesCompatible(multiLabelTrainData, multiLabelTestData, true);
    Instances trainData = WekaUtils.removeInstanceId(multiLabelTrainData, true);
    testData = WekaUtils.removeInstanceId(testData, true);
    cl.buildClassifier(trainData);
    Result eval = WekaUtils.getEvaluationMultilabel(cl, trainData, testData, "0.2");
    assertEquals(16.0, eval.L, 0.01);
    assertEquals(0.0, (Double) Result.getStats(eval, "1").get("Exact match"), 0.01);
}
Also used : BR(meka.classifiers.multilabel.BR) Instances(weka.core.Instances) J48(weka.classifiers.trees.J48) Result(meka.core.Result) Test(org.junit.Test)

Example 2 with Result

use of meka.core.Result in project dkpro-tc by dkpro.

the class WekaTestTask method execute.

@Override
public void execute(TaskContext aContext) throws Exception {
    boolean multiLabel = learningMode.equals(Constants.LM_MULTI_LABEL);
    File arffFileTrain = WekaUtils.getFile(aContext, TEST_TASK_INPUT_KEY_TRAINING_DATA, Constants.FILENAME_DATA_IN_CLASSIFIER_FORMAT, AccessMode.READONLY);
    File arffFileTest = WekaUtils.getFile(aContext, TEST_TASK_INPUT_KEY_TEST_DATA, Constants.FILENAME_DATA_IN_CLASSIFIER_FORMAT, AccessMode.READONLY);
    Instances trainData = WekaUtils.getInstances(arffFileTrain, multiLabel);
    Instances testData = WekaUtils.getInstances(arffFileTest, multiLabel);
    // do not balance in regression experiments
    if (!learningMode.equals(Constants.LM_REGRESSION)) {
        testData = WekaUtils.makeOutcomeClassesCompatible(trainData, testData, multiLabel);
    }
    Instances copyTestData = new Instances(testData);
    trainData = WekaUtils.removeInstanceId(trainData, multiLabel);
    testData = WekaUtils.removeInstanceId(testData, multiLabel);
    // FEATURE SELECTION
    if (!learningMode.equals(Constants.LM_MULTI_LABEL)) {
        if (featureSearcher != null && attributeEvaluator != null) {
            AttributeSelection attSel = WekaUtils.featureSelectionSinglelabel(aContext, trainData, featureSearcher, attributeEvaluator);
            File file = WekaUtils.getFile(aContext, "", WekaTestTask.featureSelectionFile, AccessMode.READWRITE);
            FileUtils.writeStringToFile(file, attSel.toResultsString(), "utf-8");
            if (applySelection) {
                Logger.getLogger(getClass()).info("APPLYING FEATURE SELECTION");
                trainData = attSel.reduceDimensionality(trainData);
                testData = attSel.reduceDimensionality(testData);
            }
        }
    } else {
        if (attributeEvaluator != null && labelTransformationMethod != null && numLabelsToKeep > 0) {
            Remove attSel = WekaUtils.featureSelectionMultilabel(aContext, trainData, attributeEvaluator, labelTransformationMethod, numLabelsToKeep);
            if (applySelection) {
                Logger.getLogger(getClass()).info("APPLYING FEATURE SELECTION");
                trainData = WekaUtils.applyAttributeSelectionFilter(trainData, attSel);
                testData = WekaUtils.applyAttributeSelectionFilter(testData, attSel);
            }
        }
    }
    // build classifier
    Classifier cl = WekaUtils.getClassifier(learningMode, classificationArguments);
    // file to hold prediction results
    File evalOutput = WekaUtils.getFile(aContext, "", evaluationBin, AccessMode.READWRITE);
    // evaluation & prediction generation
    if (multiLabel) {
        // we don't need to build the classifier - meka does this
        // internally
        Result r = WekaUtils.getEvaluationMultilabel(cl, trainData, testData, threshold);
        WekaUtils.writeMlResultToFile(new MultilabelResult(r.allTrueValues(), r.allPredictions(), threshold), evalOutput);
        testData = WekaUtils.getPredictionInstancesMultiLabel(testData, cl, WekaUtils.getMekaThreshold(threshold, r, trainData));
        testData = WekaUtils.addInstanceId(testData, copyTestData, true);
    } else {
        // train the classifier on the train set split - not necessary in multilabel setup, but
        // in single label setup
        cl.buildClassifier(trainData);
        weka.core.SerializationHelper.write(evalOutput.getAbsolutePath(), WekaUtils.getEvaluationSinglelabel(cl, trainData, testData));
        testData = WekaUtils.getPredictionInstancesSingleLabel(testData, cl);
        testData = WekaUtils.addInstanceId(testData, copyTestData, false);
    }
    // Write out the prediction - the data sink expects an .arff ending file so we game it a bit
    // and rename the file afterwards to .txt
    File predictionFile = WekaUtils.getFile(aContext, "", Constants.FILENAME_PREDICTIONS, AccessMode.READWRITE);
    File arffDummy = new File(predictionFile.getParent(), "prediction.arff");
    DataSink.write(arffDummy.getAbsolutePath(), testData);
    FileUtils.moveFile(arffDummy, predictionFile);
}
Also used : Instances(weka.core.Instances) AttributeSelection(weka.attributeSelection.AttributeSelection) MultilabelResult(org.dkpro.tc.ml.weka.util.MultilabelResult) Remove(weka.filters.unsupervised.attribute.Remove) Classifier(weka.classifiers.Classifier) File(java.io.File) MultilabelResult(org.dkpro.tc.ml.weka.util.MultilabelResult) Result(meka.core.Result)

Aggregations

Result (meka.core.Result)2 Instances (weka.core.Instances)2 File (java.io.File)1 BR (meka.classifiers.multilabel.BR)1 MultilabelResult (org.dkpro.tc.ml.weka.util.MultilabelResult)1 Test (org.junit.Test)1 AttributeSelection (weka.attributeSelection.AttributeSelection)1 Classifier (weka.classifiers.Classifier)1 J48 (weka.classifiers.trees.J48)1 Remove (weka.filters.unsupervised.attribute.Remove)1