在Scikit用户和开发人员邮件列表的帮助下,我终于得到了答案。我把我学到的东西放在这里,希望它也能帮助别人。
以上两个问题的答案是:是的。这是我从邮件列表中获得的示例代码:
params = [{'kernel':['poly'],'degree':[1,2,3],'gamma':[1/p,1,2],'coef0':[-1,0,1]},
{'kernel':['rbf'],'gamma':[1/p,1,2]},
{'kernel':['sigmoid'],'gamma':[1/p,1,2],'coef0':[-1,0,1]}]
需要注意两件事:
-
您可以列出一组参数,对于每组参数,您可以只放置参数组所需的内容。这意味着我们可以选择度量和相应的参数。这些参数是使用键命名的。
-
对于每个键,我们可以使用一个值列表-网格搜索将使用这些值的每个组合,并传递给相应的度量函数。
这仍然给我们留下了一个问题:如何将参数组合传递给度量。注意:并非所有指标都可以由算法使用,因此您必须手动设置这些指标。
我现在展示我上面要求的示例:
{'metric': ['wminkowski'],
'metric_params':[
{'w':np.array([2.0] * len(X.columns)),'p':1.0}, # L1
{'w':np.array([2.0] * len(X.columns)),'p':1.5},
{'w':np.array([2.0] * len(X.columns)),'p':2.0}, # L2
{'w':np.array([2.0] * len(X.columns)),'p':2.5},
{'w':np.array([2.0] * len(X.columns)),'p':3.5},
{'w':np.array([2.0] * len(X.columns)),'p':3.0}
],
'algorithm': ['brute', 'ball_tree'],
'n_neighbors': list(k_range), 'weights': weights, 'leaf_size': list(leaf_sizes) }
请注意以下事项:
-
'wminkowski'
仅适用于
['brute', 'ball_tree']
算法。
-
我们必须在
'metric_params'
为了枚举所有可能的参数组合(我还没有找到自动化的方法)。
-
在上面的例子中,我被迫使用numpy数组,因为转换不是隐式进行的(否则会出现异常)
任何人都知道一种更好的方法,请评论。