下面的程序使用了四种分类器,读入的文件是安装weka时自带的arff文件,我使用的是3.6.4版本的,需要另行下载libsvm.jar文件。对于最新版本3.7.*
package test;
import java.io.File;
import weka.classifiers.Classifier;
import weka.classifiers.bayes.NaiveBayes;
import weka.classifiers.functions.LibSVM;
import weka.classifiers.trees.J48;
import weka.classifiers.trees.RandomForest;
import weka.core.Instances;
import weka.core.converters.ArffLoader;
public class Test1 {
public static void main(String[] args) throws Exception {
//Classifier m_classifier = new RandomForest();
Classifier m_classifier = new J48();
//Classifier m_classifier = new NaiveBayes();
//Classifier m_classifier = new LibSVM();
File inputFile = new File(
"D://Program Files//Weka-3-6//data//cpu.with.vendor.arff");// 训练语料文件
ArffLoader atf = new ArffLoader();
try {
atf.setFile(inputFile);
Instances instancesTrain = atf.getDataSet(); // 读入训练文件
inputFile = new File(
"D://Program Files//Weka-3-6//data//cpu.with.vendor.arff");// 测试语料文件
atf.setFile(inputFile);
Instances instancesTest = atf.getDataSet(); // 读入测试文件
instancesTest.setClassIndex(0); // 设置分类属性所在行号(第一行为0号),instancesTest.numAttributes()可以取得属性总数
double sum = instancesTest.numInstances(), // 测试语料实例数
right = 0.0f;
instancesTrain.setClassIndex(0);
m_classifier.buildClassifier(instancesTrain); // 训练
for (int i = 0; i < sum; i++)// 测试分类结果
{
if (m_classifier.classifyInstance(instancesTest.instance(i)) == instancesTest
.instance(i).classValue())// 如果预测值和答案值相等(测试语料中的分类列提供的须为正确答案,结果才有意义)
{
right++;// 正确值加1
}
}
System.out.println("RandomForest classification precision:" + (right / sum));
//weka.core.SerializationHelper.write("b.model", m_classifier);//序列化weka模型
} catch (Exception e) {
e.printStackTrace();
}
}
}