Scikit-learn:我们如何定义网格搜索的距离度量参数

时间:2016-06-20 14:05:35

标签: parameters scikit-learn distance metrics grid-search

我有以下代码片段尝试进行网格搜索,其中一个网格参数是用于KNN算法的距离度量。如果我使用" wminkowski"," seuclidean"或者" mahalanobis"距离指标。

# Define the parameter values that should be searched
k_range    = range(1,31)
weights    = ['uniform' , 'distance']
algos      = ['auto', 'ball_tree', 'kd_tree', 'brute']
leaf_sizes = range(10, 60, 10)    
metrics = ["euclidean", "manhattan", "chebyshev", "minkowski", "mahalanobis"]

param_grid = dict(n_neighbors = list(k_range), weights = weights, algorithm = algos, leaf_size = list(leaf_sizes), metric=metrics)
param_grid

# Instantiate the algorithm
knn = KNeighborsClassifier(n_neighbors=10)

# Instantiate the grid
grid = GridSearchCV(knn, param_grid=param_grid, cv=10, scoring='accuracy', n_jobs=-1)

# Fit the models using the grid parameters
grid.fit(X,y)

我认为这是因为我必须设置或定义各种距离参数的范围(例如p,w代表“wminkowski” - WMinkowskiDistance)。 " minkowski"距离可能正常,因为它的" p"参数具有默认值2.

所以我的问题是:

  1. 我们可以为网格搜索设置距离指标的参数范围吗?如果可以,如何设置?
  2. 我们可以为网格搜索设置距离指标的参数值吗?如果是,如何设置?
  3. 希望问题很清楚。 TIA

1 个答案:

答案 0 :(得分:2)

我终于在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]}]

有两点需要注意:

  1. 您可以列出一组参数,对于每个集合,您可以自由放置参数组所需的参数。这意味着我们可以选择指标和相应的参数。参数使用键命名。

  2. 对于每个键,我们可以使用值列表 - 这些值的每个组合将由网格搜索使用并传递给相应的度量函数。

  3. 这仍然给我们留下了一个问题:我们如何将参数组合传递给指标。注意:并非算法可以使用所有指标,因此您必须手动设置这些指标。

    我现在展示我上面要求的例子:

    {'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) } 
    

    请注意以下事项:

    1. 'wminkowski'仅适用于['brute', 'ball_tree']算法。
    2. 我们必须使用'metric_params'中的字典列表来枚举所有可能的参数组合(我还没有找到自动化方法)。
    3. 在上面的情况下,我被迫使用numpy数组,因为转换不是隐式进行的(否则我们会得到例外)
    4. 我知道更好的方法,请发表评论。