【问题标题】:Weka error msg - Not enough training instances with class labels (required: 1, provided: 0)!Weka 错误消息 - 没有足够的带有类标签的训练实例(必需:1,提供:0)!
【发布时间】:2014-08-28 08:14:11
【问题描述】:

我的 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)

我搜索了互联网,但我没有解决方案。 我很沮丧。 :(

【问题讨论】:

    标签: java machine-learning weka


    【解决方案1】:

    尝试在 createInstance 方法中将新实例添加到 associatedDataSet:

    associatedDataSet.add(instance); 
    

    【讨论】:

      【解决方案2】:

      按以下方式更改您的 addInstance 代码。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        相关资源
        最近更新 更多