代码之家  ›  专栏  ›  技术社区  ›  Ian Siñel

WEKA中的神经网络

  •  0
  • Ian Siñel  · 技术社区  · 7 年前

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

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

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

    在培训和测试期间,发现三种算法在准确性方面的排名如下:

    1. 神经网络-98%
    2. 朴素贝叶斯-90%
    3. J48-85%

    根据以上结果,我决定使用神经网络建立模型。我用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 回复  |  直到 7 年前
        1
  •  0
  •   Marcus    7 年前

    在我们在评论中进行了简短的交谈之后,我觉得很明显,你对自己的训练数据的估计过高了。这很可能是由于神经网络架构过于强大,无法解决您试图解决的问题。可以证明,任何函数都可以用具有足够自由度的神经网络来表示。神经网络没有找到一个很好的泛化解决方案,而是在训练过程中记忆训练数据,从而获得近乎完美的准确性。但一旦需要处理新数据,它就不能很好地处理,因为它没有找到合适的泛化规则。 为了解决这个问题,您必须减少NN的自由度。这可以通过减少每层中的层和节点数量来实现。尽量从只有1到2个节点很少的隐藏层开始。然后,不断增加节点和层,直到达到最佳性能。

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

    您可以找到有关此问题的进一步提示 here