package chap4.java.science.data;

import java.util.Random;

import weka.classifiers.Evaluation;
import weka.classifiers.bayes.NaiveBayes;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;

public class WekaCVTest {
	Instances iris = null;
	NaiveBayes nb;

	public void loadArff(String arffInput){
		DataSource source = null;
		try {
			source = new DataSource(arffInput);
			iris = source.getDataSet();
			if (iris.classIndex() == -1)
				iris.setClassIndex(iris.numAttributes() - 1);
		} catch (Exception e1) {
		}
	}

	public void generateModel(){
		nb = new NaiveBayes();
		try {
			nb.buildClassifier(iris);
		} catch (Exception e) {

		}
	}

	public void saveModel(String modelPath){
		try {
			weka.core.SerializationHelper.write(modelPath, nb);
		} catch (Exception e) {
		}
	}

	public void crossValidate(){
		Evaluation eval = null;
		try {
			eval = new Evaluation(iris);
			eval.crossValidateModel(nb, iris, 10, new Random(1));
			System.out.println(eval.toSummaryString());
		} catch (Exception e1) {
		}	
	}
	
	public static void main(String[] args){
		WekaCVTest test = new WekaCVTest();
		test.loadArff("C:/Program Files/Weka-3-6/data/iris.arff");
		test.generateModel();
		test.saveModel("c:/nb.model");
		test.crossValidate();
	}
}