From: Aaron A. <aa...@cb...> - 2010-04-26 21:27:31
|
Great to hear that your able to edit and compile the code! Can you send me the *output.tree file from the run? I'm interested to see what kind of splitters the algorithm is using for your data. The types of splitter are given in src/jboost/learners/Summary.java public static final char EQUALITY = 1; public static final char LESS_THAN = 2; public static final char CONTAINS_ABSTAIN = 3; public static final char CONTAINS_NOABSTAIN = 4; makePythonCode currently only works with EQUALITY and LESS_THAN. I'm not actually familiar with the other two splitters. Another easy way to check what splitters are being used is to output the following prior to the case statement: System.out.println("Splitter summary: " + summary.type) We should be able to get an exact diagnosis this way. Assuming this is the problem, it looks like there is some example code for how to handle CONTAINS_ABSTAIN and CONTAINS_NOABSTAIN at lines 859-885 in String makeCode(SplitterNode sn, String tab). Aaron On Mon, 26 Apr 2010, Julien Hénot wrote: > Hi aaron, > > Thanks for your answer ! > > I have changed the code of makePythonCode as you recommend, but I still have > an error: > See the error message : > > Exception occured while attempting to write Python code > Message:java.lang.RuntimeException: Type of split not allowed > java.lang.RuntimeException: Type of split not allowed > at jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:716) > at jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:691) > at jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:705) > at jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:691) > at jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:713) > at jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:691) > at jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:705) > at jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:691) > at jboost.atree.AlternatingTree.toPython(AlternatingTree.java:654) > at jboost.controller.Controller.generateCode(Controller.java:694) > at > jboost.controller.Controller.outputLearningResults(Controller.java:273) > at jboost.controller.Controller.main(Controller.java:91) > > > For this line : 1064 ((Integer)summary.val) + ":\n"; > I tried different casting, but I have still an error. > > Thanks in advance. > > Regards, > Julien. > > > 2010/4/23 Aaron Arvey <aa...@cb...> > > > Hi Julien, > > > > First, thanks for the detailed error message. > > > > While I'm no longer a main developer (and so I won't edit the public > > repository), it looks like the problem is a simple typo. > > > > In AlternatingTree.java, there should be code that looks like this (line > > numbers may not match up): > > > > 1051 private String makePythonCode(SplitterNode sn, String tab) { > > 1052 String code = ""; > > 1053 > > 1054 Summary summary=sn.splitter.getSummary(); > > 1055 > > 1056 code += tab + (allDefined > > 1057 ? " " > > 1058 : "if def(" + (summary.index+1) + "):") > > 1059 + " # " + sn.id + "\n"; > > 1060 String stab = (allDefined ? tab : tab); > > 1061 switch(summary.type) { > > 1062 case Summary.EQUALITY: > > 1063 code += stab + "if self.get_data_value(x,'" + > > ad[(summary.index)].getAttributeName() + "') == " + > > 1064 ((Integer)summary.val) + ":\n"; > > 1065 code += makeMatlabCode(sn.predictorNodes[0], stab + "\t"); > > 1066 code += stab + "else:\n"; > > 1067 code += makeMatlabCode(sn.predictorNodes[1], stab + "\t"); > > 1068 break; > > 1069 case Summary.LESS_THAN: > > 1070 code += stab + "if self.get_data_value(x,'" + > > ad[(summary.index)].getAttributeName() + "') <= " + > > 1071 ((Double) summary.val) + ":\n"; > > 1072 code += makePythonCode(sn.predictorNodes[0], stab + "\t"); > > 1073 code += stab + "else:\n"; > > 1074 code += makePythonCode(sn.predictorNodes[1], stab + "\t"); > > 1075 break; > > 1076 default: > > 1077 throw new RuntimeException("Type of split not allowed"); > > 1078 } > > 1079 > > 1080 return code; > > 1081 } > > > > > > Notice the three lines: > > > > 1065 code += makeMatlabCode(sn.predictorNodes[0], stab + "\t"); > > 1066 code += stab + "else:\n"; > > 1067 code += makeMatlabCode(sn.predictorNodes[1], stab + "\t"); > > > > These calls should be changed to recursively call the Python method > > whereas they are currently calling the matlab method: > > > > 1065 code += makePythonCode(sn.predictorNodes[0], stab + "\t"); > > 1066 code += stab + "else:\n"; > > 1067 code += makePythonCode(sn.predictorNodes[1], stab + "\t"); > > > > You may also have to change the line > > > > 1064 ((Integer)summary.val) + ":\n"; > > > > So that it can handle strings (though the strings may be converted to > > integers, and this may be easier to edit once the python code has been > > outputted using a dictionary, etc). I don't remember the exact internal > > string representation, but you can email again if you have further > > problems. > > > > Running 'ant jar' or 'ant dist' in the top directory will compile the code > > (make sure the file 'JBOOST_DIR/dist/jboost.jar' has been updated). > > > > Aaron > > > > > > > > On Fri, 23 Apr 2010, Julien Hénot wrote: > > > > > Hi all, > > > > > > I am a new user of JBoost and I'm very enthusiastic and happy to use it. > > > It's really simple to start and I succeed easily in having some good > > > results. > > > > > > I would ask you a little question. > > > > > > When I run my Jboost command with generation of python code, I have this > > > exception : > > > > > > Exception occured while attempting to write Python code > > > Message:java.lang.RuntimeException: Type of split not allowed > > > java.lang.RuntimeException: Type of split not allowed > > > at > > jboost.atree.AlternatingTree.makeMatlabCode(AlternatingTree.java:780) > > > at > > jboost.atree.AlternatingTree.makeMatlabCode(AlternatingTree.java:751) > > > at > > jboost.atree.AlternatingTree.makeMatlabCode(AlternatingTree.java:765) > > > at > > jboost.atree.AlternatingTree.makeMatlabCode(AlternatingTree.java:751) > > > at > > jboost.atree.AlternatingTree.makeMatlabCode(AlternatingTree.java:775) > > > at > > jboost.atree.AlternatingTree.makeMatlabCode(AlternatingTree.java:751) > > > at > > jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:705) > > > at > > jboost.atree.AlternatingTree.makePythonCode(AlternatingTree.java:691) > > > at jboost.atree.AlternatingTree.toPython(AlternatingTree.java:654) > > > at jboost.controller.Controller.generateCode(Controller.java:694) > > > at > > > jboost.controller.Controller.outputLearningResults(Controller.java:273) > > > at jboost.controller.Controller.main(Controller.java:91) > > > > > > > > > Have you an idea ? I look the code but I did not succeed to fix the > > problem. > > > > > > I have different types of value in my spec file : number, text, and > > finite > > > (none,same,not) > > > > > > Thanks in advance, > > > > > > Regards, > > > Julien Henot > > > > > > |