Классификация одного экземпляра в Weka с использованием классификатора NaiveBayes - PullRequest
1 голос
/ 19 января 2012

Мне было интересно, есть ли способ обучить модель с использованием Наивного Байеса, а затем применить это к одной записи. Я новичок в weka, поэтому я не знаю, возможно ли это. Кроме того, есть ли способ сохранить выходные данные классификатора в файле?

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Ответ - да, поскольку Наивный байесовский метод - это модель, основанная на простой вероятностной теореме Байеса, которая может использоваться для задач классификации.

Для классификации с использованием Наивного Байеса и других классификаторов необходимо сначала обучить модель с помощью выборочного набора данных, после того как обученная модель может быть применена к любой записи.

Конечно, всегда будет вероятность ошибки при использовании этого подхода, но это зависит в основном от качества вашей выборки и свойств вашего набора данных.

Я не использовал Weka напрямую, но как расширение для Rapid Miner, но принципы должны применяться. После обучения модели вы сможете увидеть / распечатать параметры модели.

0 голосов
/ 19 апреля 2013

В 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) Этот метод использует модель типа дерева в примере с номинальным классом, но это должно быть легко преобразовано в наивный байесовский пример.

0 голосов
/ 20 января 2012

В настоящее время я ищу тот же ответ, используя java.

Я создал файл arff, который содержит дату обучения, и использовал программу http://weka.wikispaces.com/file/view/WekaDemo.java в качестве примера для обучения и оценкиclassifer.

Мне все еще нужно выяснить, как сохранить и загрузить модель в 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:

Сохранение и загрузка модели объясняется здесь: Как протестировать существующую модель с новым экземпляром в Weka, используя код Java?

...