工作需要, 了解了一下 weka 的 java API, 主要是随机森林这一块, 刚开始学习, 记录下.
了解不多, 直接上 demo, 里面有一些注释说明:
- package weka;
- import java.io.File;
- import weka.classifiers.Classifier;
- import weka.classifiers.trees.RandomForest;
- import weka.core.Instances;
- import weka.core.SerializationHelper;
- import weka.core.converters.ArffLoader;
- public class demo {
- public static void main(String[] args) throws Exception {
- Classifier m_classifier = new RandomForest();
- File inputFile = new File("F:/java/weka/trainData.arff");// 训练语料文件
- ArffLoader atf = new ArffLoader();
- atf.setFile(inputFile);
- Instances instancesTrain = atf.getDataSet(); // 读入训练文件
- inputFile = new File("F:/java/weka/testData.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); // 训练
- System.out.println(m_classifier);
- // 保存模型
- SerializationHelper.write("LibSVM.model", m_classifier);// 参数一为模型保存文件, classifier4 为要保存的模型
- for(int i = 0;i<sum;i++)// 测试分类结果 1
- {
- if(m_classifier.classifyInstance(instancesTest.instance(i))==instancesTest.instance(i).classValue())// 如果预测值和答案值相等(测试语料中的分类列提供的须为正确答案, 结果才有意义)
- {
- right++;// 正确值加 1
- }
- }
- // 获取上面保存的模型
- Classifier classifier8 = (Classifier) weka.core.SerializationHelper.read("LibSVM.model");
- double right2 = 0.0f;
- for(int i = 0;i<sum;i++)// 测试分类结果 2 (通过)
- {
- if(classifier8.classifyInstance(instancesTest.instance(i))==instancesTest.instance(i).classValue())// 如果预测值和答案值相等(测试语料中的分类列提供的须为正确答案, 结果才有意义)
- {
- right2++;// 正确值加 1
- }
- }
- System.out.println(right);
- System.out.println(right2);
- System.out.println(sum);
- System.out.println("RandomForest classification precision:"+(right/sum));
- }
- }
来源: http://www.jianshu.com/p/9bada4120cfa