在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], ... ]

(其中param2param1之前循环(或

[ [val1, num1], [va2, num1], [val3, num1], [val4, num1], [val5, num1], [val1, num2], ... ]

(其中param1param2之前循环(。这仅仅取决于它们在网格搜索中指定的顺序吗?我可以沿着一个特定的超参数值返回结果吗?

谢谢!

GridSearchCV在内部使用名为ParameterGrid的类,您可以在此处检查(第47114行(

这或多或少就是ParameterGridGridSearchCV:中的作用

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
  • 它首先将您的dict包装在一个列表中(因为它可以处理不同类型的数据作为输入,例如dict列表(

    grid_values= [{"param1": [1, 2, 3, 4, 5], "param2": [1, 2]}]
    
  • 之后,它对dict的键进行排序,以实现再现性。这将决定您的组合

    items = sorted(p.items())
    
  • 然后它使用CCD_ 16中的CCD_。变量上的嵌套for循环。但是从按参数名称排序的值开始!

    for v in product(*values):
    params = dict(zip(keys, v))
    yield params
    

同时检查ParameterGrid 的文档

如果进行

import pandas as pd
pd.DataFrame(clf.cv_results_)

param_param1param_param2将为每个组合提供相应的参数。

当然,您也可以使用通用索引对其进行迭代,但使用panda非常容易。

最新更新