2017-06-09 1 views
0

J'ai utilisé l'interface graphique de Weka pour entraîner et tester un fichier (faire des prédictions), mais je ne peux pas faire la même chose avec l'API. L'erreur que je reçois dit qu'il y a un nombre différent d'attributs dans le train et les fichiers de test. Dans l'interface graphique, ceci peut être résolu en cochant "Prédictions de sortie".Prédictions de sortie Weka

Comment faire quelque chose de similaire en utilisant l'API? Connaissez-vous des échantillons là-bas?

import weka.classifiers.bayes.NaiveBayes; 
import weka.classifiers.meta.FilteredClassifier; 
import weka.classifiers.trees.J48; 
import weka.core.Instances; 
import weka.core.converters.ConverterUtils.DataSource; 
import weka.filters.Filter; 
import weka.filters.unsupervised.attribute.NominalToBinary; 
import weka.filters.unsupervised.attribute.Remove; 

public class WekaTutorial 
{ 

    public static void main(String[] args) throws Exception 
    { 
    DataSource trainSource = new DataSource("/tmp/classes - edited.arff"); // training 
    Instances trainData = trainSource.getDataSet(); 

    DataSource testSource = new DataSource("/tmp/classes_testing.arff"); 
    Instances testData = testSource.getDataSet(); 

    if (trainData.classIndex() == -1) 
    { 
     trainData.setClassIndex(trainData.numAttributes() - 1); 
    } 

    if (testData.classIndex() == -1) 
    { 
     testData.setClassIndex(testData.numAttributes() - 1); 
    }  

    String[] options = weka.core.Utils.splitOptions("weka.filters.unsupervised.attribute.StringToWordVector -R first-last -W 1000 -prune-rate -1.0 -N 0 -stemmer weka.core.stemmers.NullStemmer -M 1 " 
      + "-tokenizer \"weka.core.tokenizers.WordTokenizer -delimiters \" \\r\\n\\t.,;:\\\'\\\"()?!\""); 

    Remove remove = new Remove(); 
    remove.setOptions(options); 
    remove.setInputFormat(trainData); 

    NominalToBinary filter = new NominalToBinary(); 

    NaiveBayes nb = new NaiveBayes(); 

    FilteredClassifier fc = new FilteredClassifier(); 
    fc.setFilter(filter); 
    fc.setClassifier(nb); 
    // train and make predictions 
    fc.buildClassifier(trainData); 

    for (int i = 0; i < testData.numInstances(); i++) 
    { 
     double pred = fc.classifyInstance(testData.instance(i)); 
     System.out.print("ID: " + testData.instance(i).value(0)); 
     System.out.print(", actual: " + testData.classAttribute().value((int) testData.instance(i).classValue())); 
     System.out.println(", predicted: " + testData.classAttribute().value((int) pred)); 
    } 

    } 

} 

Erreur:
Exception in thread "main" java.lang.IllegalArgumentException: Src and Dest differ in # of attributes: 2 != 17152

Cela n'a pas été un problème pour l'interface graphique.

enter image description here

+1

Avez-vous appliqué des filtres? Si oui, cela pourrait vous aider https://stackoverflow.com/questions/33337500/training-and-test-data-have-different-number-of-attributes-that-gave-an-error-tr – dram

Répondre

2

Vous devez vous assurer que les catégories dans les jeux de trains et de test sont compatibles, essayez de

  • combiner train et ensembles de test
  • Liste item
  • prétraiter les
  • sauver les comme arff
  • ouvrir deux fichiers vides
  • copie l'en-tête du haut à la ligne « @data »
  • copie dans la formation mis en premier fichier et d'essai en deuxième fichier
+0

Je ' J'ai pris les fichiers .arff traités que j'ai utilisés dans l'interface graphique et essayé de prédire l'utilisation de l'API. – Buffalo