Python: Почему мой модуль не создал объект с помощью оператора exec ()? - PullRequest
0 голосов
/ 05 октября 2019

Я создал свою собственную версию модуля GridSearchCV из библиотеки sklearn.model_selection. Моя версия включает в себя итерацию по каждому параметру один за другим вместо поиска всех возможных комбинаций. Например, для модели SVR, если у нас есть три параметра, определенных следующим образом:

   {
    'gamma' : np.arange(0.0, 1.0, 0.1),
    'C': np.arange(1, 10, 1), 
    'epsilon': np.arange(0.0, 1.0, 0.1)
    }

Алгоритм в первую очередь найдет один лучший гамма-коэффициент (из десяти). Затем он переходит к присвоению параметра C с заданным значением гаммы. После десяти итераций он перемещается в эпсилон и присваивает оптимальное значение эпсилона с заданным набором параметров [gamma, C]. Это дает нам в общей сложности 30 комбинаций для проверки вместо 1000 (10 * 10 * 10).

Я хотел бы импортировать мой объект opt_grid_search в мои проекты, как показано ниже:

from own_udf_functions import show_description, opt_grid_search

Код объекта начинается с динамического оператора, который создает объект, которыйбудет оптимизирован:

exec_string = 'opt_object = ' + object_name + '(' + def_params + ')'

, который возвращает, например:

opt_object = SVR(kernel = 'rbf')

Однако, когда я пытаюсь использовать кодв другом скрипте, как показано ниже:

opt_grid_search(object_name, params_set, X_train, y_train, X_test, y_test,
                cross_val = 2, def_params = def_params) 

появляется следующая ошибка:

    *File "C:\Users\Marek\Desktop\Python\Github\Kernele\Kaggle Competitions\own-udf- 
   functions\own_udf_functions.py", line 40, in opt_grid_search
    opt_object.fit(X_train,y_train)
    NameError: name 'opt_object' is not defined*

Кажется, что функция opt_grid_search не выполнила следующую строку кода:

opt_object = SVR(kernel = 'rbf')

и объект с именем opt_object фактически не был создан.

Я думаю, что это связано с классами, но я хотел бы попросить вас помочь мне лучше понять, что на самом деле произошло вэта ошибка. Я думаю, что это очень важное знание, которое могло бы помочь мне написать больше «питонических» кодов вместо определения всех функций в каждом отдельном коде.

Во-вторых, пожалуйста, дайте мне знать, если такая оптимизация также имеет смыслили необходимо, чтобы GridSearch прошел через все возможные комбинации.

Я старался сделать это описание как можно более коротким, однако, если вы хотели бы видеть / нуждаться в нем для справки, мой код доступен ниже:

https://github.com/markoo26/own-udf-functions

1 Ответ

0 голосов
/ 06 октября 2019

Проблема здесь заключается в функции exec и пространстве имен / области, в которой она работает. Я изо всех сил пытаюсь разобраться с этим сам, но по сути exec () не работает для назначения, используемого внутри функции таким образом. Самый простой обходной путь - вместо этого использовать eval (), который явно возвращает объект. В итоге получится что-то вроде:

exec_string = object_name + '(' + def_params + ')'  
opt_object = eval(exec_string)
...