Weka决策树Java列表

伊戈尔

我想创建一个决策树并将其分解为列表(名称,符号,值)。我用以下代码制作了树:

        //Get File
        BufferedReader reader = new BufferedReader(new FileReader(PATH + "TempArffFile.arff"));

        //Get the data
        Instances data = new Instances(reader);
        reader.close();

        //Setting class attribute 
        data.setClassIndex(data.numAttributes() - 1);

        //Make tree
        J48 tree = new J48();
        String[] options = new String[1];
        options[0] = "-U"; 
        tree.setOptions(options);
        tree.buildClassifier(data);

        //Print tree
        System.out.println(tree);

现在我需要将其分解为数组,我该怎么做?

示例:我得到这棵树:

title <= 1: bad (4.0)
title > 1
|   positionMatch <= 1
|   |   countryCode <= 1: good (3.0/1.0)
|   |   countryCode > 1: bad (8.0/3.0)
|   positionMatch > 1: good (4.0/1.0)

所以我想从那棵树上得到4个列表:

  • 标题(<= 1)->错误
  • title(> 1)-> position(<= 1)-> countryCode(<= 1)-> good
  • title(> 1)-> position(<= 1)-> countryCode(> 1)->错误
  • 标题(> 1)->位置(> 1)->好

我怎样才能做到这一点 ?

用户

不太好,但是可能更好然后什么都没有...也许它会给你一个主意。

    public static void split(String tree){

    String[] lines = tree.split("\n");
    List<List<String>> lists = new ArrayList<List<String>>(); 
    for(String line : lines){
        List<String> temp = new ArrayList<String>();
        while(line.indexOf("|") != -1){
            temp.add("|");
            line = line.replaceFirst("\\|", "");
        }
        temp.add(line.trim());
        lists.add(temp);
    }

    for(int i = 0; i < 3; i++){
        lists.remove(0);
    }
    for(int i = 0; i < 4; i++){
        lists.remove(lists.size()-1);
    }
    List<String> substitutes = new ArrayList<String>();

    for(List<String> list : lists){
        for(int i = 0; i < list.size(); i++){
            if(!list.get(i).contains(":") && !list.get(i).equals("|") && !substitutes.contains(list.get(i))){
                substitutes.add(list.get(i));
            }
        }
    }
    for(List<String> list : lists){
        for(int i = 0; i < list.size(); i++){
            if(list.get(i).equals("|")){
                list.set(i, substitutes.get(i));
            }
        }
    }
    StringBuilder sb = new StringBuilder();
    for(List<String> list : lists){
        String line = "";
        for(String s : list){
            line = line+" "+s;
        }
        if(line.endsWith(")")){
            sb.append(line+"\n");
        }
    }
    System.out.println(sb.toString());
}

输入

J48未修剪的树

花瓣宽度<= 0.6:鸢尾(50.0)

花瓣宽度> 0.6

| 花瓣宽度<= 1.7

| | 花瓣长度<= 4.9:鸢尾花(48.0 / 1.0)

| | 花瓣长度> 4.9

| | | 花瓣宽度<= 1.5:鸢尾(3.0)

| | | 花瓣宽度> 1.5:鸢尾花(3.0 / 1.0)

| 花瓣宽度> 1.7:鸢尾(46.0 / 1.0)

叶数:5

树的大小:9

输出:

花瓣宽度<= 0.6:鸢尾(50.0)

花瓣宽度> 0.6花瓣宽度<= 1.7花瓣长度<= 4.9:鸢尾花(48.0 / 1.0)

花瓣宽度> 0.6花瓣宽度<= 1.7花瓣长度> 4.9花瓣宽度<= 1.5:鸢尾(3.0)

花瓣宽度> 0.6花瓣宽度<= 1.7花瓣长度> 4.9花瓣宽度> 1.5:鸢尾花(3.0 / 1.0)

花瓣宽度> 0.6花瓣宽度> 1.7:鸢尾(46.0 / 1.0)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章