【问题标题】:Classifying one instance in Weka using NaiveBayes Classifier使用 NaiveBayes 分类器对 Weka 中的一个实例进行分类
【发布时间】:2012-02-14 00:54:02
【问题描述】:

我想知道是否有办法使用朴素贝叶斯训练模型,然后将其应用于单个记录。我是 weka 的新手,所以我不知道这是否可能。另外,有没有办法将分类器输出存储在文件中?

【问题讨论】:

    标签: data-mining classification weka


    【解决方案1】:

    答案是肯定的,因为朴素贝叶斯是一种基于简单概率贝叶斯定理的模型,可用于分类挑战。

    对于使用朴素贝叶斯和其他分类器的分类,您需要首先使用样本数据集训练模型,一旦训练,模型就可以应用于任何记录。

    当然,使用这种方法时总会存在错误概率,但这主要取决于样本的质量和数据集的属性。

    我没有直接使用 Weka,而是作为 Rapid Miner 的扩展,但原则必须适用。训练模型后,您应该能够查看/打印模型参数。

    【讨论】:

    • 您好,我也需要这种类型的分类。现在我正在构建分类。但是我不知道如何解析单个记录并获得类值的概率。
    【解决方案2】:

    我目前正在使用 java 寻找相同的答案。

    我创建了一个 arff 文件,其中包含训练日期,并以程序 http://weka.wikispaces.com/file/view/WekaDemo.java 为例来训练和评估分类器。

    我仍然需要弄清楚如何在 java 中保存和加载模型以及(更重要的是)如何针对单个记录进行测试。

    WekaDemo.java

     ...
     public void execute() throws Exception {
        // run filter
        m_Filter.setInputFormat(m_Training);
        Instances filtered = Filter.useFilter(m_Training, m_Filter);
    
        // train classifier on complete file for tree
        m_Classifier.buildClassifier(filtered);
    
        // 10fold CV with seed=1
        m_Evaluation = new Evaluation(filtered);
        m_Evaluation.crossValidateModel(
            m_Classifier, filtered, 10, m_Training.getRandomNumberGenerator(1));
        //TODO Save model
        //TODO Load model
        //TODO Test against a single information
      }
      ...
    

    编辑 1:

    这里解释了保存和加载模型:How to test existing model with new instance in weka, using java code?

    【讨论】:

      【解决方案3】:

      http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Classification-Classifying%20instances 中有一个快速分类单个实例的方法。

      //load model (saved from user interface)
      Classifier tree = (Classifier) weka.core.SerializationHelper.read("/some/where/j48.model");
      
      // load unlabeled data
      Instances unlabeled = new Instances( new BufferedReader(new FileReader("/some/where/unlabeled.arff")));
      
      // set class attribute
      unlabeled.setClassIndex(unlabeled.numAttributes() - 1);
      // create copy
      Instances labeled = new Instances(unlabeled);
      
      // label instances
      for (int i = 0; i < unlabeled.numInstances(); i++) {
        double clsLabel = tree.classifyInstance(unlabeled.instance(i));
        labeled.instance(i).setClassValue(clsLabel);
        System.out.println(clsLabel + " -> " + unlabeled.classAttribute().value((int) clsLabel));
        double[] dist =tree.distributionForInstance(unlabeled.instance(i))
        for(int j=0; j<dist.length;j++){
          System.print(unlabeled.classAttribute().value(j)+": " +dist[j]);
        }
      }
      

      编辑此方法不训练、评估和保存模型。这是我通常使用 weka gui 做的事情。 (http://weka.wikispaces.com/Serialization) 此方法在示例中使用带有名义类的树类型模型,但应该很容易将其转换为朴素贝叶斯示例。

      【讨论】:

        猜你喜欢
        • 2015-02-01
        • 2011-11-04
        • 2012-10-13
        • 2019-06-04
        • 2015-01-21
        • 2021-07-24
        • 2012-03-22
        • 2014-05-19
        • 2017-05-04
        相关资源
        最近更新 更多