在 sklearn 中处理网格搜索组合的顺序是什么?
What order are grid search combinations handled in sklearn?
我对 sklearn 的 GridSearchCV 对象处理其超参数组合的顺序有疑问。具体来说,我使用带有参数的 sklearn 执行了网格搜索:
param1 = [val1, val2, val3, val4, val5]
param2 = [num1, num2]
cv_results_
的 mean_test_score
属性是预期的长度为 10 的数组 ( len(param1)*len(param2)
);但是,我不知道哪个值对应于什么组合。也就是说,param1
的值是否被保留,param2
被循环,反之亦然。
即mean_test_score
中的10个值是否对应
[ [val1, num1], [val1, num2], [val2, num1], [val2, num2], ... ]
(其中 param2
在 param1
之前循环)或
[ [val1, num1], [va2, num1], [val3, num1], [val4, num1], [val5, num1], [val1, num2], ... ]
(其中 param1
在 param2
之前循环)。它是否仅取决于它们在网格搜索中指定的顺序?我可以 return 一个特定超参数值的结果吗?
谢谢!
如果你这样做
import pandas as pd
pd.DataFrame(clf.cv_results_)
列 param_param1
和 param_param2
将为您提供每个组合的相应参数。
当然,你也可以使用普通索引来迭代它,但是使用pandas非常容易。
GridSearchCV
在里面使用了名为 ParameterGrid
的 class,你可以查看 here(第 47、114 行)
这或多或少是 ParameterGrid
在您的 GridSearchCV
中所做的:
from itertools import product
grid_values= [{"param1": [1, 2, 3, 4, 5], "param2": [1, 2]}]
def grid(grid_values):
for p in grid_values:
# Always sort the keys of a dictionary, for reproducibility
print(p)
items = sorted(p.items())
if not items:
yield {}
else:
keys, values = zip(*items)
for v in product(*values):
params = dict(zip(keys, v))
yield params
它首先将你的字典包装在一个列表中(因为它可以处理不同类型的数据作为输入,例如字典列表)
grid_values= [{"param1": [1, 2, 3, 4, 5], "param2": [1, 2]}]
之后,它会对您的字典的键进行排序,以实现可重复性目的。这将决定您的组合
items = sorted(p.items())
然后它使用 itertools
中的 product
函数来完成您的想法 (here details)。变量上的嵌套 for 循环。但是从按参数名称排序的值开始!
for v in product(*values):
params = dict(zip(keys, v))
yield params
我对 sklearn 的 GridSearchCV 对象处理其超参数组合的顺序有疑问。具体来说,我使用带有参数的 sklearn 执行了网格搜索:
param1 = [val1, val2, val3, val4, val5]
param2 = [num1, num2]
cv_results_
的 mean_test_score
属性是预期的长度为 10 的数组 ( len(param1)*len(param2)
);但是,我不知道哪个值对应于什么组合。也就是说,param1
的值是否被保留,param2
被循环,反之亦然。
即mean_test_score
中的10个值是否对应
[ [val1, num1], [val1, num2], [val2, num1], [val2, num2], ... ]
(其中 param2
在 param1
之前循环)或
[ [val1, num1], [va2, num1], [val3, num1], [val4, num1], [val5, num1], [val1, num2], ... ]
(其中 param1
在 param2
之前循环)。它是否仅取决于它们在网格搜索中指定的顺序?我可以 return 一个特定超参数值的结果吗?
谢谢!
如果你这样做
import pandas as pd
pd.DataFrame(clf.cv_results_)
列 param_param1
和 param_param2
将为您提供每个组合的相应参数。
当然,你也可以使用普通索引来迭代它,但是使用pandas非常容易。
GridSearchCV
在里面使用了名为 ParameterGrid
的 class,你可以查看 here(第 47、114 行)
这或多或少是 ParameterGrid
在您的 GridSearchCV
中所做的:
from itertools import product
grid_values= [{"param1": [1, 2, 3, 4, 5], "param2": [1, 2]}]
def grid(grid_values):
for p in grid_values:
# Always sort the keys of a dictionary, for reproducibility
print(p)
items = sorted(p.items())
if not items:
yield {}
else:
keys, values = zip(*items)
for v in product(*values):
params = dict(zip(keys, v))
yield params
它首先将你的字典包装在一个列表中(因为它可以处理不同类型的数据作为输入,例如字典列表)
grid_values= [{"param1": [1, 2, 3, 4, 5], "param2": [1, 2]}]
之后,它会对您的字典的键进行排序,以实现可重复性目的。这将决定您的组合
items = sorted(p.items())
然后它使用
itertools
中的product
函数来完成您的想法 (here details)。变量上的嵌套 for 循环。但是从按参数名称排序的值开始!for v in product(*values): params = dict(zip(keys, v)) yield params