Scikit-learn:我们如何为网格搜索定义距离度量参数
Scikit-learn: How do we define a distance metric's parameter for 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。
所以我的问题是:
- 我们能否为网格搜索的距离度量设置参数范围?如果可以,如何设置?
- 我们可以为网格搜索的距离度量设置参数值吗?如果可以,如何设置?
希望问题很清楚。
TIA
在 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]}]
注意两点:
您可以列出一组参数,对于每组参数,您可以自由放置该组参数所需的内容。这意味着我们可以 select 指标和相应的参数。参数使用按键命名。
对于每个键,我们可以使用一个值列表 - 这些值的每个组合将由网格搜索使用并传递给相应的度量函数。
这仍然给我们留下了一个问题:我们如何将参数组合传递给指标。注意:并非所有指标都可以被算法使用,因此您必须手动设置这些指标。
我现在展示我上面要求的例子:
{'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 数组,因为转换不是隐式进行的(否则我们会得到一个异常)
有谁知道更好的方法,欢迎评论。
我有以下代码片段尝试进行网格搜索,其中一个网格参数是用于 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。
所以我的问题是:
- 我们能否为网格搜索的距离度量设置参数范围?如果可以,如何设置?
- 我们可以为网格搜索的距离度量设置参数值吗?如果可以,如何设置?
希望问题很清楚。 TIA
在 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]}]
注意两点:
您可以列出一组参数,对于每组参数,您可以自由放置该组参数所需的内容。这意味着我们可以 select 指标和相应的参数。参数使用按键命名。
对于每个键,我们可以使用一个值列表 - 这些值的每个组合将由网格搜索使用并传递给相应的度量函数。
这仍然给我们留下了一个问题:我们如何将参数组合传递给指标。注意:并非所有指标都可以被算法使用,因此您必须手动设置这些指标。
我现在展示我上面要求的例子:
{'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 数组,因为转换不是隐式进行的(否则我们会得到一个异常)
有谁知道更好的方法,欢迎评论。