• 大小: 7KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: Java
  • 标签: C4.5  决策树  

资源简介

资源含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.xml
     文件         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\

评论

共有 条评论