Построение и оценка FilteredClassifier в Weka Java API - PullRequest
1 голос
/ 12 марта 2020

У меня проблема с Weka Java API, когда я пытаюсь построить и оценить модель классификации (NaiveBayesUpdateable). Также CSV-файлы использовались в качестве набора данных для обучения и тестирования с идентификаторами столбцов, Class и Text (набор данных Supervised). Код, используемый в настоящее время:

        String absAddressTrain = "MedhelpTrainDataset.csv";
        String absAddressTest = "MedhelpTestDataset.csv";

        //Reading the trained dataset
        File inputFileTrain = new File(absAddressTrain);//Training corpus file  
        CSVLoader sourceTrain = new CSVLoader();   
        sourceTrain.setFile(inputFileTrain);  
        Instances dataTrain = sourceTrain.getDataSet(); // Read in training documents 
        dataTrain.setClassIndex(dataTrain.numAttributes() - 1);
        LOG.info("Instances : " + dataTrain.toString());

        //Reading the test dataset
        File inputFileTest = new File(absAddressTest);//Training corpus file  
        CSVLoader sourceTest = new CSVLoader();   
        sourceTest.setFile(inputFileTest);  
        Instances dataTest = sourceTest.getDataSet(); // Read in training documents 
        dataTest.setClassIndex(dataTest.numAttributes() - 1);
        LOG.info("Instances : " + dataTest.toString());

        //the base classifier
        NaiveBayesUpdateable nb = new NaiveBayesUpdateable();

        //the filter
        StringToWordVector filter = new StringToWordVector();
        filter.setInputFormat(dataTrain);
        filter.setIDFTransform(true);
        LovinsStemmer stemmer = new LovinsStemmer();
        filter.setStemmer(stemmer);
        filter.setLowerCaseTokens(true);

        StringToWordVector filter2 = new StringToWordVector();
        filter2.setInputFormat(dataTest);
        filter2.setIDFTransform(true);
        LovinsStemmer stemmer2 = new LovinsStemmer();
        filter2.setStemmer(stemmer2);
        filter2.setLowerCaseTokens(true);

        //Create the FilteredClassifier object
        FilteredClassifier fc = new FilteredClassifier();
        //specify filter
        fc.setFilter(filter);
        //specify base classifier
        fc.setClassifier(nb);
        //Build the meta-classifier
        fc.buildClassifier(dataTrain);

        LOG.info("Tree : " + nb);

        Evaluation eval = new Evaluation(dataTrain);
        eval.evaluateModel(fc, dataTest);

        LOG.info(eval.toSummaryString("\nResults\n======\n", false));
        LOG.info("F-measure : "+eval.weightedFMeasure());
        LOG.info("precision : "+eval.weightedPrecision());
        LOG.info("recall : "+eval.weightedRecall());

При запуске этого фрагмента кода была получена следующая ошибка:

Thu Mar 12 11:40:55 MUT 2020
There was an unexpected error (type=Internal Server Error, status=500).
Index 1230 out of bounds for length 1230
java.lang.ArrayIndexOutOfBoundsException: Index 1230 out of bounds for length 1230
    at weka.classifiers.evaluation.Evaluation.updateMargins(Evaluation.java:4488)
    at weka.classifiers.evaluation.Evaluation.updateStatsForClassifier(Evaluation.java:4268)
    at weka.classifiers.evaluation.Evaluation.evaluationForSingleInstance(Evaluation.java:1905)
    at weka.classifiers.evaluation.Evaluation.evaluationForSingleInstance(Evaluation.java:1959)
    at weka.classifiers.evaluation.Evaluation.evaluateModelOnceAndRecordPrediction(Evaluation.java:1999)
    at weka.classifiers.evaluation.Evaluation.evaluateModel(Evaluation.java:1874)
    at mu.socialMedia.mining.building_model.BuildingModel.buildTweetsModel2(BuildingModel.java:286)
    at mu.socialMedia.mining.controller.rest.restController.buildTweetsModel2(restController.java:338)...

Что я делаю неправильно?

Любой ответ высоко ценится. ТНХ

...