“SVM生成相同的输出值”
你好
我试图使用样本/过程/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的简单示例
我试图使用样本/过程/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 " / >
< /操作符>
> < /过程
< /操作符>
> < /过程
(/代码)
标记:
0
答案
您在流程设置中有两个错误,加上一些不太理想的操作员选择:
1.你正在使用一个带有rbf核的SVM,这意味着除了C之外,你还必须优化伽马算子
2.您正在为参数优化的每次迭代编写模型。这意味着最终文件包含*最后*参数组合的模型,而不是*最佳*参数组合的模型
这些就是错误。下面是一些更多的提示:
3.要在一个明确定义的范围内只优化一个或两个参数,不应该使用进化优化,而应该使用网格优化。在对数尺度上尝试C和gamma在1e-6到100之间的值。
4.“读/写模型”已弃用。您不应该使用这些操作符将模型写入磁盘,而应该使用Store和Retrieve将模型写入/读取到存储库。
要绕过第2点,不要使用Loop和Average操作符,而是对X-Validation使用更多的迭代。将其模型输出连接到优化操作符的结果(res)输出。这确保了最终最好的模型将被返回。
作为参考,请查看所附的流程。
最好的问候,
马吕斯
谢谢你的建议。我已经根据你的样品更新了我的流程。对于所有的例子,我仍然得到一个值。
标签行数预测(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的结果有多个可呈现的候选对象
当我运行代码时也会出现此错误。
我还能怎么补救呢?
在参数优化之前执行svm学习器。在此流程设置中,连接本身并不定义唯一的流程顺序,因此您必须手动调整它。为此,通过单击带有蓝色箭头和问号的图标进入过程排序模式,并调整过程顺序,使优化和参数设置在学习器之前执行。
最好的问候,
马吕斯
我根据你的建议更新了模型,但每个条目的输出值仍然相同。我创建了一个简单的过程来训练svm,然后使用相同的数据进行预测。它生成相同的输出值。
我还在R中创建了相同的基本过程,它生成的输出预测接近原始值。
我确信解决方案很简单,但从搜索论坛网站寻找可能的解决方案并使用R参数,我仍然得到Rapidminer中所有预测的相同值。
还有其他我可以测试的想法吗?谢谢
此外,在上述过程中,您只使用2-Fold交叉验证来优化参数。尝试增加折叠的次数以获得更好的效果!
最好的问候,
马吕斯