2016-06-22 24 views
0

bin ziemlich neu zu weka Programmierung. Ich habe einen einfachen Bayes-Klassifikator codiert. hier ist der Code:Weka Classifier funktioniert nicht

public static void main(String[] args) throws Exception { 
    Attribute Attribute1 = new Attribute("firstNumeric"); 
    Attribute Attribute2 = new Attribute("secondNumeric"); 

    // Declare a nominal attribute along with its values 
    ArrayList<String> fvNominalVal = new ArrayList(3); 
    fvNominalVal.add("blue"); 
    fvNominalVal.add("gray"); 
    fvNominalVal.add("black"); 
    Attribute Attribute3 = new Attribute("aNominal", fvNominalVal); 

    // Declare the class attribute along with its values 
    ArrayList<String> fvClassVal = new ArrayList(2); 
    fvClassVal.add("positive"); 
    fvClassVal.add("negative"); 
    Attribute ClassAttribute = new Attribute("theClass", fvClassVal); 

    // Declare the feature vector 
    ArrayList<Attribute> fvWekaAttributes = new ArrayList(4); 
    fvWekaAttributes.add(Attribute1); 
    fvWekaAttributes.add(Attribute2); 
    fvWekaAttributes.add(Attribute3); 
    fvWekaAttributes.add(ClassAttribute); 

    // Create an empty training set 
    Instances isTrainingSet = new Instances("Rel", fvWekaAttributes, 10); 
    // Set class index 
    isTrainingSet.setClassIndex(3); 

    // Create the instance 
    Instance ex1 = new DenseInstance(4); 
    ex1.setValue((Attribute) fvWekaAttributes.get(0), 1.0); 
    ex1.setValue((Attribute) fvWekaAttributes.get(1), 5.5); 
    ex1.setValue((Attribute) fvWekaAttributes.get(2), "gray"); 
    ex1.setValue((Attribute) fvWekaAttributes.get(3), "positive"); 

    Instance ex2 = new DenseInstance(4); 
    ex1.setValue((Attribute) fvWekaAttributes.get(0), 1.0); 
    ex1.setValue((Attribute) fvWekaAttributes.get(1), 5.5); 
    ex1.setValue((Attribute) fvWekaAttributes.get(2), "blue"); 
    ex1.setValue((Attribute) fvWekaAttributes.get(3), "negative"); 

    // add the instance 
    isTrainingSet.add(ex1); 
    isTrainingSet.add(ex2); 

    // Create a naïve bayes classifier 
    Classifier cModel = (Classifier) new NaiveBayes(); 
    cModel.buildClassifier(isTrainingSet); 

    Instance testData = new DenseInstance(4); 
    testData.setValue((Attribute) fvWekaAttributes.get(0), 1.0); 
    testData.setValue((Attribute) fvWekaAttributes.get(1), 5.5); 
    testData.setValue((Attribute) fvWekaAttributes.get(2), "gray"); 

    Instances testDataSet = new Instances("Rel", fvWekaAttributes, 1); 
    testDataSet.setClassIndex(3); 
    testDataSet.add(testData); 

    double[] a = cModel.distributionForInstance(testDataSet.firstInstance()); 
    for(int i=0;i<a.length;i++){ 
     System.out.println(a[i]); 
    } 
} 

aber das Ergebnis scheint nicht wahr zu sein. hier ist das Ergebnis:

6.702810252023562E-151

1,0

auch wenn ich Testdaten auf diese geändert:

testData.setValue((Attribute) fvWekaAttributes.get(0), 1.0); 
testData.setValue((Attribute) fvWekaAttributes.get(1), 5.5); 
testData.setValue((Attribute) fvWekaAttributes.get(2), "blue"); 

das Ergebnis fast dieses ist. wie folgt:

3.351405126011781E-151

1,0

Dank fortschrittlicher.

Antwort

1

Meiner Meinung nach ist das Problem, dass Sie nur zwei Instanzen im Trainingssatz haben, und der naiv baies classifier kann daraus kein wertvolles Modell lernen. Das ist der Grund, warum Sie ein Konfusionsergebnis erhalten haben. Versuchen Sie, mindestens 100 oder mehr Train-Instanzen zu generieren, oder finden Sie hier einige Beispieldatensätze, um zu erfahren, wie Sie ML-Methoden anwenden: http://storm.cis.fordham.edu/~gweiss/data-mining/datasets.html