“SVM生成相同的输出值”

账单账单 成员职位:3.贡献我
2019年6月编辑 帮助
你好

我试图使用样本/过程/07中的SVMCluster模型对数据进行集群,但只从我的数据中获得1个集群。我将数据缩放为百分比,并希望使用窗口过程来检查一些客户历史,然后预测未来的购买行为。

我将模型更改为LibSVMLearner,并使用遗传参数优化器尝试找到可接受的参数。所有示例的输出(预测)都是相同的值。当我将svm聚类过程与LibSVM一起使用时,它确实会生成不同的预测值。

你能解释一下我做错了什么吗?我是否需要使用原始数据而不是百分比?

下面是一个修改后的RM样本,它生成了不同的预测值(为了简单起见,我使用了相同的数据进行训练和测试,只是为了得到一些结果),我的过程生成了相同的预测值和一些样本数据。我的过程也需要很长的时间来读取训练后的模型,但模型文件只有35K。模型存储是否存在可能导致问题的错误?

(这个职位可能适用http://rapid-i.com/rapidforum/index.php?PHPSESSID=4f6c22a9df5bbb0be3e6e41d1eb2c119&topic=490.0)

谢谢你!

数据:
https://www.dropbox.com/s/fs7up70iyr0ugbz/rapidsvm.csv

描述和两个流程示例
https://www.dropbox.com/s/nrntxs397uun95m/rapidproblem.txt

(我的过程超过了帖子的20k限制)

改编自07_EvolutionaryParameterOptimization的简单示例

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<过程version = " 5.3.005 " >
> <上下文
<输入/ >
<输出/ >
<宏/ >
> < /上下文

<p>这个过程也是一个参数优化过程,就像元组中讨论的第一个过程一样。在这种情况下,

采用进化方法搜索最佳参数组合。这种方法通常更合适,并导致更好的

结果没有定义要测试的参数组合(如网格搜索和二次参数优化)

方法)。;/ p>演化参数优化方法的参数定义方法与

其他参数优化运算符。用户必须定义一个冒号,而不是一个逗号分隔的参数列表

分隔对,用作特定参数的下界和上界。</p>> < /描述
<过程扩展= " true " >


< /操作符>

y = " 30 " / >

name="ParameterOptimization" width="90" x="380" y="30">
“参数”<列表键= >

< / >列表



<过程扩展= " true " >

name="IteratingPerformanceAverage" width="90" x="45" y="30">

<过程扩展= " true " >

x = " 112 " y = " 30 " >


<过程扩展= " true " >

name="LibSVMLearner" width="90" x="112" y="30">





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





> < /过程
<过程扩展= " true " >

x = " 45 " y = " 30 " >
<列出关键= " application_parameters " / >
< /操作符>

宽度="90" x="227" y="30"/>









> < /过程
< /操作符>

x = " 380 " y = " 120 " >


< /操作符>







> < /过程
< /操作符>


<列出关键= "日志" >



< / >列表
< /操作符>







> < /过程
< /操作符>

y = " 255 " >

< /操作符>

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














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

(/代码)
标记:

答案

  • MariusHelfMariusHelf RapidMiner认证专家、会员职位:1869年独角兽
    你好,

    您在流程设置中有两个错误,加上一些不太理想的操作员选择:

    1.你正在使用一个带有rbf核的SVM,这意味着除了C之外,你还必须优化伽马算子
    2.您正在为参数优化的每次迭代编写模型。这意味着最终文件包含*最后*参数组合的模型,而不是*最佳*参数组合的模型

    这些就是错误。下面是一些更多的提示:
    3.要在一个明确定义的范围内只优化一个或两个参数,不应该使用进化优化,而应该使用网格优化。在对数尺度上尝试C和gamma在1e-6到100之间的值。
    4.“读/写模型”已弃用。您不应该使用这些操作符将模型写入磁盘,而应该使用Store和Retrieve将模型写入/读取到存储库。

    要绕过第2点,不要使用Loop和Average操作符,而是对X-Validation使用更多的迭代。将其模型输出连接到优化操作符的结果(res)输出。这确保了最终最好的模型将被返回。
    作为参考,请查看所附的流程。

    最好的问候,
    马吕斯
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <过程version = " 5.3.007 " >
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文

    <p>这个过程也是一个参数优化过程,就像元组中讨论的第一个过程一样。在这种情况下,

    采用进化方法搜索最佳参数组合。这种方法通常更合适,并导致更好的

    结果没有定义要测试的参数组合(如网格搜索和二次参数优化)

    方法)。;/ p>演化参数优化方法的参数定义方法与

    其他参数优化运算符。用户必须定义一个冒号,而不是一个逗号分隔的参数列表

    分隔对,用作特定参数的下界和上界。</p>> < /描述
    <过程扩展= " true " >


    < /操作符>


    “参数”<列表键= >

    <参数键= " LibSVMLearner。γ“价值= "(0.0001;10;5、对数)" / >
    < / >列表
    <过程扩展= " true " >



    <过程扩展= " true " >






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





    > < /过程
    <过程扩展= " true " >

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










    > < /过程
    < /操作符>


    <列出关键= "日志" >




    < / >列表
    < /操作符>



    < /操作符>










    > < /过程
    < /操作符>


    < /操作符>

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














    > < /过程
    < /操作符>
    > < /过程
  • 账单账单 成员职位:3.贡献我
    马吕斯,
    谢谢你的建议。我已经根据你的样品更新了我的流程。对于所有的例子,我仍然得到一个值。

    标签行数预测(Label) attrib1-attrib7
    0.02 100.0 -0.010000000000000002 -0.00445 0.3857 -0.00159 0.017248 0.017248 -1.531244 -0.073051
    -0.02 101.0 -0.010000000000000002 0.023435 0.8366 0.009283 0.021341 0.026825 -1.970992 -0.096819
    -0.01 102.0 -0.010000000000000002 0.001783 0.9629 -2.64e-4 0.010065 0.010065 -1.028535 0.046995
    -0.03 103.0 -0.010000000000000002 0.001799 0.9545 -0.006372 0.011877 0.011877 -0.482728 -0.041898
    0.0 104.0 -0.010000000000000002 0.017011 0.802 -0.026941 0.057796 0.057796 2.960633 0.168071

    运行这个进程也有一个错误代码:
    SEVERE: com.rapidminer.operator.learner.functions.kernel.LibSVMModel的结果有多个可呈现的候选对象

    当我运行代码时也会出现此错误。

    我还能怎么补救呢?



    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <过程version = " 5.3.005 " >
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文

    <p>这个过程也是一个参数优化过程,就像元组中讨论的第一个过程一样。在这种情况下,使用进化方法来搜索最佳参数组合。这种方法通常更合适,并且在不定义应该测试的参数组合(如网格搜索和二次参数优化方法)的情况下产生更好的结果。演化参数优化方法的参数定义方式与其他参数优化算子相同。用户必须定义一个冒号分隔的对,作为特定参数的下界和上界,而不是应该检查的逗号分隔的参数列表。> < /描述

    <过程扩展= " true " >




    <列出关键= "注释" >

    < / >列表

    <列出关键= " data_set_meta_data_information " >










    < / >列表
    < /操作符>





    < /操作符>



    < /操作符>







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

    “参数”<列表键= >

    <参数键= " SVMOptimize。γ“价值= "(0.0001;100;5;对数)" / >
    < / >列表

    <过程扩展= " true " >



    <过程扩展= " true " >






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





    > < /过程
    <过程扩展= " true " >

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










    > < /过程
    < /操作符>






    > < /过程
    < /操作符>

    <列出关键= " name_map " >

    < / >列表
    < /操作符>




    <列出关键= "注释" >

    < / >列表

    <列出关键= " data_set_meta_data_information " >










    < / >列表
    < /操作符>




    < /操作符>



    < /操作符>

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


















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


  • MariusHelfMariusHelf RapidMiner认证专家、会员职位:1869年独角兽
    你好,

    在参数优化之前执行svm学习器。在此流程设置中,连接本身并不定义唯一的流程顺序,因此您必须手动调整它。为此,通过单击带有蓝色箭头和问号的图标进入过程排序模式,并调整过程顺序,使优化和参数设置在学习器之前执行。

    最好的问候,
    马吕斯
  • 账单账单 成员职位:3.贡献我
    马吕斯,

    我根据你的建议更新了模型,但每个条目的输出值仍然相同。我创建了一个简单的过程来训练svm,然后使用相同的数据进行预测。它生成相同的输出值。

    我还在R中创建了相同的基本过程,它生成的输出预测接近原始值。

    我确信解决方案很简单,但从搜索论坛网站寻找可能的解决方案并使用R参数,我仍然得到Rapidminer中所有预测的相同值。

    还有其他我可以测试的想法吗?谢谢

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <过程version = " 5.3.007 " >
    > <上下文
    <输入/ >
    <输出/ >
    <宏/ >
    > < /上下文

    <p>这个过程也是一个参数优化过程,就像元组中讨论的第一个过程一样。在这种情况下,使用进化方法来搜索最佳参数组合。这种方法通常更合适,并且在不定义应该测试的参数组合(如网格搜索和二次参数优化方法)的情况下产生更好的结果。演化参数优化方法的参数定义方式与其他参数优化算子相同。用户必须定义一个冒号分隔的对,作为特定参数的下界和上界,而不是应该检查的逗号分隔的参数列表。> < /描述

    <过程扩展= " true " >




    <列出关键= "注释" >

    < / >列表

    <列出关键= " data_set_meta_data_information " >










    < / >列表
    < /操作符>





    < /操作符>







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

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











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




    ##复制数据文件rapidsvm.csv到c:\rapid .csv
    # #
    库(e1071)
    读取和准备数据
    setwd (c: \ \快速)
    Custdata <- read。table('rapidsvm.csv', header=T, dec='。', sep = ',', na.strings=c('XXXXXXX'))
    Rownames (custdata) <- custdata$rownbr
    头(custdata)
    custdata$custid <- NULL
    custdata$rownumber <- NULL
    寻找最佳SVM参数
    ## e1071.pdf,页49-55
    Tunedsvm <- tune.svm(label~。, data = custdata, type='eps-regression', gamma = 2^(4:6), cost = 2^(1:2))
    总结(tunedsvm)
    tund。Gamma <- tunedsvm$best.parameters[[1]]
    tund。Cost <- tunedsvm$best.parameters[[2]]
    在模型中使用最佳参数
    svm模型<- svm(label ~ ., data = custdata, type='eps-regression', gamma = tund)Gamma, cost = tnd .cost)
    ##比较原始和支持向量机预测值
    Pred <-拟合(svmmodel)
    比较<- as.data.frame(custdata[1:20,'label'])
    Colnames (compare) <- 'orig_value'
    比较$svm_pred <- round(pred[1:20], digits = 3)
    比较


  • MariusHelfMariusHelf RapidMiner认证专家、会员职位:1869年独角兽
    你是如何优化支持向量机的?从哪个过程中得到C=2和γ =63的值?绝对不是从你上面发布的过程!这些值不会在优化参数操作符中进行测试。
    此外,在上述过程中,您只使用2-Fold交叉验证来优化参数。尝试增加折叠的次数以获得更好的效果!

    最好的问候,
    马吕斯
登录注册置评。