我正在使用SVM Rank,它有多个参数,调整这些参数会得到不同的结果。是否有某种机制可以根据验证集上的最佳结果来调整并获得最佳参数?
以下是不同的参数:
Learning Options: -c float -> C: 训练误差与边界之间的权衡(默认值 0.01) -p [1,2] -> 用于松弛变量的L范数。使用1为L1范数,使用2为平方松弛。(默认值 1) -o [1,2] -> 用于损失的重新缩放方法。 1: 松弛重新缩放 2: 边界重新缩放 (默认值 2) -l [0..] -> 要使用的损失函数。 0: 零/一损失 ?: 请参见下面的特定应用选项 (默认值 1)Optimization Options (see [2][5]): -w [0,..,9] -> 结构学习算法的选择(默认值 3): 0: 在[2]中描述的n-slack算法 1: 带有收缩启发式的n-slack算法 2: 在[5]中描述的1-slack算法(原始形式) 3: 在[5]中描述的1-slack算法(对偶形式) 4: 在[5]中描述的1-slack算法(对偶形式)带有约束缓存 9: svm_struct_learn_custom.c中的自定义算法 -e float -> epsilon: 允许的终止标准容差 (默认值 0.001000) -k [1..] -> 在重新计算QP解之前累积的新约束数量 (默认值 100) (仅用于-w 0和1) -f [5..] -> 为每个示例缓存的约束数量 (默认值 5)(与-w 4一起使用) -b [1..100] -> 当无法从当前缓存构建违反epsilon的约束时, 用于刷新缓存的训练集百分比 (默认值 100%)(与-w 4一起使用)SVM-light Options for Solving QP Subproblems (see [3]): -n [2..q] -> 在每次svm-light迭代中进入工作集的新变量数量 (默认值 n = q)。 将n设置为小于q以防止锯齿状移动。 -m [5..] -> 用于内核评估的svm-light缓存大小(以MB为单位) (默认值 40)(仅用于-w 1与内核) -h [5..] -> 变量需要在多少次svm-light迭代中保持最优状态 才能被考虑收缩(默认值 100) -# int -> 如果在该数量的迭代后没有进展, 终止svm-light QP子问题优化。 (默认值 100000)Kernel Options: -t int -> 内核函数类型: 0: 线性(默认值) 1: 多项式 (s a*b+c)^d 2: 径向基函数 exp(-gamma ||a-b||^2) 3: 双曲正切函数 tanh(s a*b + c) 4: 从kernel.h中定义的用户自定义内核 -d int -> 多项式内核中的参数d -g float -> rbf内核中的参数gamma -s float -> 双曲正切/多项式内核中的参数s -r float -> 双曲正切/多项式内核中的参数c -u string -> 用户定义内核的参数
回答:
这被称为网格搜索。我不知道你是否熟悉python和scikit-learn,但无论如何,我认为他们的描述和示例非常好,且与语言无关。
基本上,你为每个参数指定一些你感兴趣的值(或从中随机抽样的区间,参见随机搜索),然后对于每种设置组合,使用交叉验证(通常是k折交叉验证)来计算模型在这些设置下的表现。表现最佳的组合会被返回(scikit-learn实际上可以返回组合的排名)。
请注意,这可能需要很长时间。你应该根据你的问题对一些参数有相当的把握。例如,对于文本分类,你应该只选择线性内核,对于其他问题,你可能会想要rbf
等。不要将所有参数都交给网格搜索,尽可能根据你对算法和手头问题的了解来决定更多的参数。