先来看一下WeKa(Waikato Environment for Knowledge Analysis),它是一个流行的Java机器学习库,它主要使用纯Java代码编写。Weka的设计哲学是提供一个简单、便携且易于使用的机器学习环境,而不需要依赖于Java以外的其他编程语言或工具。Weka主要专注于传统的机器学习算法,它提供了广泛的算法用于分类、回归、聚类、关联规则学习等任务。今天用它来实现决策树:
1 首先引入pom依赖, 最新版本3.8.6
<dependency>
<groupId>nz.ac.waikato.cms.weka</groupId>
<artifactId>weka-stable</artifactId>
<version>3.8.6</version>
</dependency>
2 创建一个数据集用来训练,格式为.arff
@RELATION decision_tree_example
@ATTRIBUTE age NUMERIC
@ATTRIBUTE salary NUMERIC
@ATTRIBUTE has_degree {true, false}
@ATTRIBUTE class {Yes, No}
@DATA
25, 30000, true, No
30, 40000, false, No
22, 20000, true, Yes
35, 60000, false, No
28, 25000, true, Yes
40, 80000, false, No
23, 15000, true, Yes
31, 35000, false, Yes
3 代码实现
DataSource dataSource = new DataSource("decision_tree.arff");
Instances dataset = dataSource.getDataSet();
J48 tree = new J48();
dataset.setClassIndex(dataset.numAttributes() - 1);
tree.buildClassifier(dataset);
System.out.println(tree);
Evaluation eval = new Evaluation(dataset);
eval.evaluateModel(tree, dataset);
// System.out.println(eval.toSummaryString("\nModel evaluation:\n", false));
Instance newInstance = new DenseInstance(1.0, new double[]{25.0, 30000.0, 1.0});
//setDataset方法确保了新实例的属性值能够按照与训练数据集中相同的方式被理解和处理
newInstance.setDataset(dataset);
// 使用模型进行预测
double predictedClass = tree.classifyInstance(newInstance);
// 打印预测结果
System.out.println("Predicted class for the new instance: " + dataset.classAttribute().value((int) predictedClass));
4 Instance说明
DenseInstance和SparseInstance是两种不同的实例(Instance)表示方式,它们用于存储和处理数据集中的数据点(即实例)。这两种实例的主要区别在于它们存储数据的方式,这会影响到内存的使用和某些操作的效率。
- 如果你的数据集属性大多是非零的,使用DenseInstance会更有效率,因为它提供了更快的属性访问速度。
- 如果你的数据集包含许多零值或缺失值,特别是当数据集很大时,使用SparseInstance可以节省大量内存。
5 模型保存与加载
- SerializationHelper.write("abc.model", tree);
- J48 loadedTree = (J48) SerializationHelper.read(modelFilePath);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。