WEKA中的神经网络

我有一个已经分类好的文本数据集,共有7个可用类别。

我在构建模型时使用了Waikato环境下的知识分析工具(WEKA)。此外,我还训练并测试了三种不同的算法,以确定哪种算法最适合我的数据集。

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

在训练和测试过程中,我发现了三种算法在准确性方面的排名如下:

  1. 神经网络 – 98%
  2. Naive Bayes – 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或2个隐藏层且节点很少的简单结构开始。然后,逐步增加节点和层数,直到达到最佳性能。

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

关于这个问题,你可以在这里找到更多提示 这里

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注