Как правильно использовать args или kwargs для диктовок, чтобы использовать их как входные переменные регрессора в функции? - PullRequest
0 голосов
/ 28 октября 2019

Я сгенерировал некоторые входные параметры со значениями в виде диктов через GridSearchCV.

Входные параметры выглядят так:

In: print(grid_maxdepth, grid_min_samples_split, grid_max_leaf_nodes)

Out: {'max_depth': 4} {'min_samples_split': 14} {'max_leaf_nodes': 14}

Если я добавлю их как функцию kwarg в функцию регрессора, она прекрасно работает.

In: print(DecisionTreeRegressor(**grid_maxdepth, **grid_min_samples_split, **grid_max_leaf_nodes))

Out:

DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None,
                      max_leaf_nodes=14, min_impurity_decrease=0.0,
                      min_impurity_split=None, min_samples_leaf=1,
                      min_samples_split=14, min_weight_fraction_leaf=0.0,
                      presort=False, random_state=None, splitter='best')

Теперь, если я хочу сделать то же самое в следующей функции, она помещает переменные в неправильную позицию и в неправильном формате. Для примера, вместо использования max_depth=4, он помещает диктат в критерий ("criterion={'max_depth': 4}").

In:

def test(*sss):
    print(DecisionTreeRegressor(*sss))

test(grid_maxdepth, grid_min_samples_split, grid_max_leaf_nodes)

Out:

DecisionTreeRegressor(criterion={'max_depth': 4},
                      max_depth={'max_leaf_nodes': 14}, max_features=None,
                      max_leaf_nodes=None, min_impurity_decrease=0.0,
                      min_impurity_split=None, min_samples_leaf=1,
                      min_samples_split=2, min_weight_fraction_leaf=0.0,
                      presort=False, random_state=None,
                      splitter={'min_samples_split': 14})

Что такоеЯ делаю не так? Имейте в виду, что я новичок в использовании arg / kwarg, и я уже изучил эту статью: https://www.geeksforgeeks.org/args-kwargs-python/

1 Ответ

1 голос
/ 28 октября 2019

Для python, чтобы интерпретировать любые ключевые аргументы;вам нужно явно использовать синтаксис ** при вызове метода.

Пример: myMethod(**kwargs1, **kwargs2)

Попробуйте это:

def test(**sss):
    print(DecisionTreeRegressor(**sss))

d1={'max_depth': 4}
d2={'min_samples_split': 14} 
d3={'max_leaf_nodes': 14}

test(**d1, **d2, **d3)

Объяснение

Вы пытаетесь пройтиАргументы ключевых слов для функции DescisionTreeRegressor, которая заключена в вашей функции test.

Ваша функция принимает любое количество аргументов (* аргументы):

def test(*sss):
    print(DecisionTreeRegressor(*sss))

test(grid_maxdepth, grid_min_samples_split, grid_max_leaf_nodes)

Внутренне ваш вызов метода test преобразуетсяна это:

DescisionTreeRegressor(grid_maxdepth, grid_min_samples_split, grid_max_leaf_nodes)

Обратите внимание, что вышеприведенное является просто обычными параметрами словаря, поэтому ключевые слова внутри словарей оцениваются , а не .

Для работы kwargs вызовизнутри test метод должен выглядеть так:

DescisionTreeRegressor(**grid_maxdepth, **grid_min_samples_split, **grid_max_leaf_nodes)
...