У меня есть вопрос о порядке, в котором объект sklearn GridSearchCV обрабатывает свои комбинации гиперпараметров. В частности, я выполнил поиск по сетке, используя sklearn с параметрами:

param1 = [val1, val2, val3, val4, val5]
param2 = [num1, num2]

Атрибут mean_test_score элемента cv_results_ - это массив длиной 10, как и ожидалось (len(param1)*len(param2)); однако я не знаю, какое значение какой комбинации соответствует. То есть удерживаются значения param1, которые циклически повторяются param2, или наоборот.

То есть соответствуют ли 10 значений в mean_test_score

[ [val1, num1], [val1, num2], [val2, num1], [val2, num2], ... ]

(где param2 зацикливается перед param1) или

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

(где param1 зацикливается перед param2). Это просто зависит от порядка, в котором они указаны в поиске по сетке? Могу ли я вернуть результаты по одному конкретному значению гиперпараметра?

Благодарность!

1
WhoDatBoy 15 Ноя 2020 в 21:21

2 ответа

Лучший ответ

GridSearchCV использует внутри класс с именем ParameterGrid, который вы можете проверить здесь (строки 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
  • Прежде всего, он обернет ваш dict в список (потому что он может обрабатывать различные типы данных в качестве входных, например, список dicts)

    grid_values= [{"param1": [1, 2, 3, 4, 5], "param2": [1, 2]}]
    
  • после этого он выполняет сортировку ключей вашего dict для воспроизводимости. От чего будут зависеть ваши комбинации

      items = sorted(p.items())
    
  • затем он использует функцию product из itertools, которая делает то, что вы думали (подробности здесь). Вложенный цикл for для ваших переменных. Но начиная со значений, отсортированных по именам параметров!

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

Также проверьте документ ParameterGrid

1
Nikaido 15 Ноя 2020 в 18:53

Если вы это сделаете

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

В столбцах param_param1 и param_param2 будут указаны соответствующие параметры для каждой комбинации.

Конечно, вы также можете перебирать его, используя общий индекс, но использовать pandas очень просто.

1
Tom Ron 15 Ноя 2020 в 18:32