【问题标题】:Not able to apply trained model to classify testdata using Weka in Java无法在 Java 中使用 Weka 应用经过训练的模型对测试数据进行分类
【发布时间】:2018-04-03 13:30:05
【问题描述】:

我正在使用 Weka 进行文本分类。我使用 Weka GUI 创建了一个 NaiveBayes 模型,并保存了该模型,然后尝试使用该模型对训练集的实例进行分类。这是我的代码:

        Classifier clsClassifier = (Classifier) weka.core.SerializationHelper.read("Source/test/80percentModel.model");
        StringToWordVector filter = new StringToWordVector();

        BufferedReader reader = new BufferedReader(
                new FileReader("Source/test/clt.train.arff"));
        Instances trainingData = new Instances(reader);
        reader.close();
        trainingData.setClassIndex(trainingData.numAttributes() - 1);
        filter.setInputFormat(trainingData);


        BufferedReader reader2 = new BufferedReader(
                new FileReader("Source/test/clt.test.arff"));
        Instances testingData = new Instances(reader2);
        reader2.close();
        testingData.setClassIndex(testingData.numAttributes() - 1);

        testingData = Filter.useFilter(testingData, filter);
        System.out.println(testingData.numInstances());
        for (int j = 0; j < testingData.numInstances(); j++) {
            double res = clsClassifier.classifyInstance(testingData.get(j));
            System.out.println(testingData.classAttribute().value((int)res));
        }

我收到以下错误:

java.lang.IllegalArgumentException:Src 和 Dest 的属性数不同:1 != 1781 在 weka.core.RelationalLocator.copyRelationalValues(RelationalLocator.java:87) 在 weka.filters.Filter.copyValues(Filter.java:405) 在 weka.filters.Filter.push(Filter.java:326) 在 weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:655) 在 weka.classifiers.meta.FilteredClassifier.filterInstance(FilteredClassifier.java:672) 在 weka.classifiers.meta.FilteredClassifier.distributionForInstance(FilteredClassifier.java:699) 在 weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:173) 在 test.WekaClassification.main(WekaClassification.java:66)

我不太明白我在这里做错了什么。为什么属性数量不匹配?这是在 testData 集中应用训练模型的正确方法吗?

【问题讨论】:

  • 您能否更新一下您的训练和测试数据样本?仅举几个例子。 Weka 要求测试数据与训练数据具有完全相同的属性。
  • 训练数据是:使用#而不是@(因为@用于在回复时引用用户)#relation 'myrelationName' #attribute myText string #attribute myclass {fireperformance,地震,原材料,湿度、市场、振动} #data 'someText',vibration 'someText',fireperformance 'someText', 地震 ______________________________ Testdata #relation 'myrelationName' #attribute myText string #attribute myclass {fireperformance,地震,原材料,湿度,市场,振动} #data 'someText',? 'someText',? 'someText', ?

标签: java weka naivebayes


【解决方案1】:

有一些可能性,但您的错误表明您的训练数据集和数据集中的属性数量不相等。它们必须完全采用相同的格式、类型和值。测试文件还应该具有标签属性的值。检查在 Weka GUI 中是否出现相同的错误? StringToWordVector 可能无法以负担得起的方式过滤。通过查看内容检查其输出。

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2017-10-12
    • 2020-07-04
    • 2020-05-04
    • 1970-01-01
    • 2021-09-26
    • 2014-11-25
    • 2020-12-18
    • 2016-04-04
    相关资源
    最近更新 更多