资源简介
资源含Java实现的C4.5决策树代码,以及测试数据。实现了C4.5的绝大部分功能,但关于连续变量和确实变量并未详加讨论。但是相关的函数已经提供,读者可以很容易借此实现。
代码片段和文件信息
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.linkedList;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.lang.Math.*;
public class DecisionTree {
// 同时保留训练集和测试集的数据在模型中,防止训练集和测试集的列顺序不同
private ArrayList train_AttributeName = new ArrayList(); // 存储训练集属性的名称
private ArrayList> train_attributeValue = new ArrayList>(); // 存储训练集每个属性的取值
private ArrayList predictAttribute = new ArrayList(); // 存储测试集属性的名称
private ArrayList> predict_attributeValue = new ArrayList>(); // 存储测试集每个属性的取值
private ArrayList trainData = new ArrayList(); // 训练集数据 ,即arff文件中的data字符串
private ArrayList predictData = new ArrayList(); // 测试集数据
public static final String patternString = “@attribute(.*)[{](.*?)[}]“;
//正则表达,其中*? 表示重复任意次,但尽可能少重复,防止匹配到更后面的“}“符号
private int decatt; // 决策变量在属性集中的索引(即类标所在列)
private InfoGain infoGain;
private TreeNode root;
public void train(String data_path String targetAttr){
//模型初始化操作
read_trainARFF(new File(data_path));
//printData();
setDec(targetAttr);
infoGain=new InfoGain(trainData decatt);
//拼装行与列
linkedList ll=new linkedList(); //linkList用于增删比ArrayList有优势
for(int i = 0; i< train_AttributeName.size(); i++){
if(i!=decatt) ll.add(i); //防止类别变量不在最后一列发生错误
}
ArrayList al=new ArrayList();
for(int i=0;i al.add(i);
}
//构建决策树
root = buildDT(“root“ “null“ al ll);
//剪枝
cutBranch(root);
}
/**
* 构建决策树
* @param fatherName 节点名称
* @param fatherValue 节点值
* @param subset 数据行子集
* @param subset 数据列子集
* @return 返回根节点
*/
public TreeNode buildDT(String fatherName String fatherValue ArrayList subsetlinkedList selatt){
TreeNode node=new TreeNode();
Map targetNum = infoGain.get_AttributeNum(subsetdecatt);//计算类-频率
String targetValue=infoGain.get_targetValue(targetNum);//判定分类
node.setTargetNum(targetNum);
node.setAttributeName(fatherName);
node.setAttributeValue(fatherValue);
node.setTargetValue(targetValue);
//终止条件为类标单一/树深度达到特征长度(还有可能是信息增益率不存在)
if (infoGain.isPure(targetNum) | selatt.isEmpty() ) {
node.setNodeType(“leafNode“);
return node;
}
int maxIndex = infoGain.getGainRatioMax(subsetselatt);
selatt.remove(new Integer(maxIndex)); //这样可以remove object
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 366 2018-02-27 14:10 files\Tree.xm
文件 599 2018-02-24 16:02 files\train.arff
目录 0 2018-02-27 14:42 src\
文件 11311 2018-02-27 14:41 src\DecisionTree.java
文件 4689 2018-02-27 14:18 src\InfoGain.java
文件 1806 2018-02-24 15:48 src\MathUtils.java
文件 1793 2018-02-27 14:42 src\TreeNode.java
目录 0 2018-02-27 14:10 files\
- 上一篇:用Jena解析owl
- 下一篇:ID3决策树含预测函数
评论
共有 条评论