Сообщение об ошибке Weka - Недостаточно обучающих экземпляров с метками классов (требуется: 1, предоставлено: 0)!

Мой код Weka не работает.
Я не знаю, как исправить ошибку.
Дайте мне совет,
(я использовал weka.jar (версия 3.6.11))

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.functions.RBFNetwork;
import weka.clusterers.FarthestFirst;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;


public class WEKATutorial {

    public static void main(String[] args) throws Exception {
        WEKATutorial wekaTut = new WEKATutorial();
        wekaTut.executeWekaTutorial();
    }

    private void executeWekaTutorial() throws Exception {
        FastVector allAttributes = createAttributes();  
        Instances learningDataset = createLearningDataSet(allAttributes);   
        Classifier predictiveModel = learnPredictiveModel(learningDataset); 
        Evaluation evaluation = evaluatePredictiveModel(predictiveModel, learningDataset);  

        System.out.println(evaluation.toSummaryString());   
        predictUnknownCases(learningDataset, predictiveModel);  
    }

    private FastVector createAttributes() {
        Attribute ageAttribute = new Attribute("age");  

        FastVector genderAttributeValues = new FastVector(2);
        genderAttributeValues.addElement("male");
        genderAttributeValues.addElement("female");

        Attribute genderAttribute = new Attribute("gender", genderAttributeValues); 
        Attribute numLoginsAttribute = new Attribute("numLogins");

        FastVector allAttributes = new FastVector(3);   
        allAttributes.addElement(ageAttribute);
        allAttributes.addElement(genderAttribute);
        allAttributes.addElement(numLoginsAttribute);
        return allAttributes;
    }


    private Instances createLearningDataSet(FastVector allAttributes) {
        Instances trainingDataSet = new Instances("wekaTutorial", allAttributes, 4);    
        trainingDataSet.setClassIndex(2);   
        addInstance(trainingDataSet, 20., "male", 5);
        addInstance(trainingDataSet, 30., "female", 2);
        addInstance(trainingDataSet, 40., "male", 3);
        addInstance(trainingDataSet, 35., "female", 4);
        return trainingDataSet;
    }

    private void addInstance(Instances trainingDataSet, double age, String gender, int numLogins) {
        Instance instance = createInstance(trainingDataSet, age, gender, numLogins);
    }

    private Instance createInstance(Instances associatedDataSet, double age, String gender, int numLogins) {
        Instance instance = new Instance(3);
        instance.setDataset(associatedDataSet);
        instance.setValue(0, age);
        instance.setValue(1, gender);
        instance.setValue(2, numLogins);
        return instance;
    }

    private Classifier learnPredictiveModel(Instances learningDataset) throws Exception {
        Classifier classifier = getClassifier();    
        classifier.buildClassifier(learningDataset);    
        return classifier;
    }


    private Classifier getClassifier() {
        RBFNetwork rbfLearner = new RBFNetwork();   
        FarthestFirst EM_Learner = new FarthestFirst();
        rbfLearner.setNumClusters(2);
        return  rbfLearner;
    }


    private Evaluation evaluatePredictiveModel(Classifier classifier, Instances learningDataset) throws Exception {
        Evaluation learningSetEvaluation = new Evaluation(learningDataset); 
        learningSetEvaluation.evaluateModel(classifier, learningDataset);   
        return learningSetEvaluation;
    }


    private void predictUnknownCases(Instances learningDataset, Classifier predictiveModel) throws Exception {
        Instance testMaleInstance = createInstance(learningDataset, 32., "male", 0);
        Instance testFemaleInstance = createInstance(learningDataset, 32., "female", 0);
        double malePrediction = predictiveModel.classifyInstance(testMaleInstance);
        double femalePrediction = predictiveModel.classifyInstance(testFemaleInstance);

        System.out.println("Predicted number of logins [age=32]: ");
        System.out.println("\tMale = " + malePrediction);
        System.out.println("\tFemale = " + femalePrediction);
    }

}


Ниже приводится сообщение об ошибке.

Exception in thread "main" weka.core.WekaException: weka.classifiers.functions.Logistic: Not enough training instances with class labels (required: 1, provided: 0)!
    at weka.core.Capabilities.test(Capabilities.java:1138)
    at weka.core.Capabilities.test(Capabilities.java:1023)
    at weka.core.Capabilities.testWithFail(Capabilities.java:1302)
    at weka.classifiers.functions.RBFNetwork.buildClassifier(RBFNetwork.java:153)
    at WEKATutorial.learnPredictiveModel(WEKATutorial.java:81)
    at WEKATutorial.executeWekaTutorial(WEKATutorial.java:24)
    at WEKATutorial.main(WEKATutorial.java:18)

Я искал в Интернете, но у меня нет решения. Я очень подавлен. :(


person Westporch    schedule 22.08.2014    source источник


Ответы (2)


попробуйте добавить свои новые экземпляры в связанныйDataSet в методе createInstance:

associatedDataSet.add(instance); 
person Ehsan    schedule 27.08.2014

Измените код addInstance следующим образом.

private void addInstance(Instances trainingDataSet, double age, String gender, int numLogins) {
    Instance instance = createInstance(trainingDataSet, age, gender, numLogins);
    trainingDataSet.add(instance);
}
person Atilla Ozgur    schedule 28.08.2014