WEKA中的神经网络

时间:2018-03-13 06:43:59

标签: machine-learning neural-network weka text-classification

我有一个已经分类的文本数据集。我有7个课程。

我使用(怀卡托环境知识分析)WEKA来构建模型。此外,我还训练并测试了3种不同的算法,以确定哪种算法最适合我的数据集。

我尝试了Naive Bayes,J48和Neural Networks(SMO),这些都可以在WEKA的机器学习环境中使用。

在训练和测试期间,通过以下方式找出三种算法在准确性方面的排名:

  1. 神经网络 - 98%
  2. 朴素贝叶斯 - 90%
  3. J48 - 85%
  4. 根据上述结果,我决定使用神经网络并构建模型。我在JAVA中创建了一个应用程序并加载了由WEKA构建的神经网络模型。

    但是,我的问题是,模型无法正确预测新数据。我有点困惑,因为在训练和测试期间我获得了高精度,但在部署期间,准确率仅为40%。

    我尝试在C#中执行此操作并获得相同的结果。 下面是我使用的示例代码。

       Instances test = null; 
       DataSource source = new DataSource("C:\\Users\\Ian\\Desktop\\FINAL\\testdataset.arff");
       test = source.getDataSet();
       test.setClassIndex(1); 
    
       FilteredClassifier cl1 = (FilteredClassifier) weka.core.SerializationHelper.read("C:\\FINAL\\NeuralNetworks.model");        
       Evaluation evaluation = new Evaluation(test);      
       evaluation.evaluateModel(cl1,test);
       System.out.println("Results:" + evaluation.toSummaryString());   
    
    
        for (int i = 0; i < test.numInstances(); i++) {
            String trueClassLabel = test.instance(i).toString(test.classIndex());
            double predictionIndex =cl1.classifyInstance(test.instance(i));
    
            String predictedClassLabel;
            predictedClassLabel = test.classAttribute().value((int) predictionIndex );
            System.out.println((i+1) + "\t" + trueClassLabel + "\t" + predictedClassLabel);
        }
    

    任何建议你认为我做错了什么?

1 个答案:

答案 0 :(得分:0)

在评论中进行简短的聊天后,我觉得你的训练数据过于丰富。这很可能是由神经网络架构引起的,这种架构对于您试图解决的问题来说太过强大了。可以证明,任何函数都可以由具有足够自由度的神经网络来表示。 NN没有找到一个很好的推广解决方案,而是在训练期间记住了训练数据,从而获得了近乎完美的准确性。但是,只要它必须处理新数据,它就不能很好地完成,因为它没有找到适当的泛化规则。 为了解决这个问题,你必须降低你的NN的自由度。这可以通过减少每层中的层数和节点数来实现。尝试从只有1或2个隐藏层开始,只有很少的节点。然后,继续增加节点和层,直到达到最佳性能。

重要提示:始终使用独立的测试集测量性能,而不是使用您使用相同的数据来测量模型。

您可以在此问题上找到一些进一步的提示here