“循环遍历2个属性的所有组合”

MuehliManMuehliMan 成员职位:85大师
2019年6月编辑 帮助
你好再次,

我再次向社区寻求帮助,因为我的智慧已经到了尽头。下面是代码应该做什么的简短描述:
读取输入->预处理+数据准备->循环2个属性的组合->为所有组合构建和评估决策树->将属性和特征名称写入日志,然后写入csv
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<过程version = " 5.0 " >
> <上下文
<输入/ >
<输出/ >
<宏/ >
> < /上下文






< /操作符>



< /操作符>



< /操作符>




< /操作符>


< /操作符>


< /操作符>








< /操作符>

<列出关键= " function_descriptions " >

< / >列表
< /操作符>






< /操作符>





> < /过程


<列出关键= " application_parameters " / >

< /操作符>




< /操作符>









> < /过程
< /操作符>


<列出关键= "日志" >






< / >列表


< /操作符>





> < /过程
< /操作符>


<参数键=“csv_file”值= " % {path} \ %{集}_ %{}子集_fs_2_atts.csv " / >
< /操作符>










> < /过程
< /操作符>
> < /过程
但不幸的是,它在一段时间后停止了,导致整个程序崩溃。我不知道我是否在工作流程中犯了错误,或者它使用了太多的内存。也许你们中有人能给我点建议。
标记:

答案

  • MuehliManMuehliMan 成员职位:85大师
    我只是想补充一点,它会冻结进程计时器很长时间。所以也许它只是使用了太多的内存,以至于几乎没有留给程序本身的内存了。是否可以选择只使用90%的可用内存来为程序本身保留一些东西?

    欢呼,
    马库斯
  • 土地土地 RapidMiner认证分析师,RapidMiner认证专家,成员职位:2531年独角兽
    你好马库斯,
    这是不可能的,否则我们很久以前就会这么做了:)我认为你需要更多的内存或者测试树本身是否有问题。
    顺便说一下:您正在生成一个tree_depth宏,但不要将其用于树的构造…

    问候,
    塞巴斯蒂安。
  • MuehliManMuehliMan 成员职位:85大师
    嘿,塞巴斯蒂安,

    你说得对。树深是不需要的,因为它总是2个属性。我认为在每次迭代中编写/存储日志是一个坏主意,对吗?当它删除所有模型和视图时,释放内存会有帮助吗?
    如何在循环中更新日志,并在迭代完成后才写入日志?
    线程“AWT-EventQueue-0”异常java.lang.OutOfMemoryError: GC开销限制超出
    线程“AWT-EventQueue-0”异常
    总的来说,这个消息听起来不太好。此消息不是从一开始就出现,而是在一段时间后出现,很可能是在Process计时器完全冻结时。

    欢呼,
    马库斯
  • 土地土地 RapidMiner认证分析师,RapidMiner认证专家,成员职位:2531年独角兽
    你好马库斯,
    的确,这个消息听起来并不好。但据我所知,你的属性是数字的,不是吗?这很重要,因为树可以对多个拆分使用数值属性。因此,在最坏的情况下,深度可能等于示例的数量,这肯定会导致内存不足的异常…

    释放内存操作符不会释放在java抛出内存不足异常之前不会被释放的任何内容。

    问候,
    塞巴斯蒂安。
  • MuehliManMuehliMan 成员职位:85大师
    亲爱的塞巴斯蒂安,

    是的,我的属性是数字。为了避免树在一个拆分中只放置一个示例,我打算使用每个拆分特性的最小示例,并将最大树深设置得更低。
    我试图通过将日志写入内存而不是硬盘驱动器来修改工作流程,但它并没有太大变化。这是我目前正在使用的版本。
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <过程version = " 5.0 " >
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文











    < /操作符>



    < /操作符>



    < /操作符>



    < /操作符>















    < /操作符>



    < /操作符>



    < /操作符>













    < /操作符>



    < /操作符>



    < /操作符>













    < /操作符>

    <列出关键= " function_descriptions " >

    < / >列表

    < /操作符>





















    < /操作符>





    > < /过程


    <列出关键= " application_parameters " / >

    < /操作符>

























    < /操作符>









    > < /过程
    < /操作符>

    <参数键= "文件名" value = " % {path} \ %{集}_ %{}子集_fs_2_atts.log " / >
    <列出关键= "日志" >






    < / >列表




    < /操作符>






    < /操作符>








    > < /过程
    < /操作符>




    < /操作符>



    < /操作符>














    > < /过程
    < /操作符>
    > < /过程

    运行一段时间后,日志显示每次迭代:
    线程“AWT-EventQueue-0”异常
    javax.swing.text.BoxView.updateLayoutArray (BoxView.java: 196)
    javax.swing.text.BoxView.replace (BoxView.java: 168)
    javax.swing.text.View.updateChildren (View.java: 1095)
    javax.swing.text.View.insertUpdate (View.java: 679)
    javax.swing.plaf.basic.BasicTextUI RootView.insertUpdate美元(BasicTextUI.java: 1590)
    javax.swing.plaf.basic.BasicTextUI UpdateHandler.insertUpdate美元(BasicTextUI.java: 1849)
    javax.swing.text.AbstractDocument.fireInsertUpdate (AbstractDocument.java: 185)
    javax.swing.text.AbstractDocument.handleInsertString (AbstractDocument.java: 734)
    javax.swing.text.AbstractDocument.insertString (AbstractDocument.java: 693)
    com.rapidminer.gui.tools.LoggingViewer.append (LoggingViewer.java: 300)
    com.rapidminer.gui.tools.LoggingViewer.access 000美元(LoggingViewer.java: 83)
    在com.rapidminer.gui.tools.LoggingViewer $ 2 $ 1.运行(LoggingViewer.java: 186)
    java.awt.event.InvocationEvent.dispatch (InvocationEvent.java: 209)
    java.awt.EventQueue.dispatchEvent (EventQueue.java: 597)
    java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java: 269)
    java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java: 184)
    java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java: 174)
    java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java: 169)
    java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java: 161)
    java.awt.EventDispatchThread.run (EventDispatchThread.java: 122)
    我还尝试用较低数量的属性运行它(如100随机由“生成数据”),它似乎在那里工作。如果有经验的人可以帮助我,我只是不知道错误在哪里。

    最好的问候,
    马库斯
  • 黑线鳕黑线鳕 成员职位:849Maven
    你好马库斯,

    我认为你的代码卡住了猫,因为它一直在内存中存储额外的日志副本。下面是选择所有属性对并记录其分类性能的代码,希望您已经了解了。
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <过程version = " 5.0 " >
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文




    < /操作符>






    <列出关键= " application_parameters " / >
    < /操作符>

    <列出关键= " class_weights " / >
    < /操作符>

    <列出关键= "日志" >


    < / >列表
    < /操作符>







    > < /过程
    < /操作符>





    > < /过程
    < /操作符>
    > < /过程
  • MuehliManMuehliMan 成员职位:85大师
    感谢您的工作流程!

    因此,使用交叉验证(X-Val),我会将性能评估与验证的平均输出连接起来,然后将X-Validation的输出与日志操作符连接起来,对吧?

    但是,如何将日志写入文件(作为数据或更好的示例文件),而不需要每一步都这样做呢?

    我同意,每次迭代都写一份日志文件副本会扼杀进程。但我仍然需要这个搜索结果保存在某个地方。

    欢呼,
    马库斯
  • 黑线鳕黑线鳕 成员职位:849Maven
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <过程version = " 5.0 " >
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文




    < /操作符>






    <列出关键= " application_parameters " / >
    < /操作符>

    <列出关键= " class_weights " / >
    < /操作符>

    <列出关键= "日志" >


    < / >列表
    < /操作符>







    > < /过程
    < /操作符>







    > < /过程
    < /操作符>
    > < /过程
登录注册置评。