0

我从 sklearn.model_selection 库创建了我自己版本的 GridSearchCV 模块。我的版本包括逐个迭代每个参数,而不是寻找所有可能的组合。例如对于 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)
    }

该算法将首先找到一个最佳伽马系数(十个)。然后它转移到用给定的 gamma 值分配 C 参数。经过十次迭代后,它移动到 epsilon 并使用给定的一组 [gamma, C] 参数分配最佳 epsilon 值。这给了我们总共 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 的对象。

我认为这与课程有关,但我想请您帮助我更好地了解此错误中实际发生的情况。我认为这是一项至关重要的知识,可以帮助我编写更多的“pythonic”代码,而不是在每个代码中定义所有函数。

其次,请让我知道这种优化是否也有意义,或者 GridSearch 是否需要遍历所有可能的组合。

我试图让这个描述尽可能简短,但是如果你想查看/需要它作为参考,我的代码可以在下面访问:

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

4

1 回答 1

0

这里的问题是 exec 函数和它运行的命名空间/范围。我自己也在努力解决这个问题,但本质上 exec() 不适用于以这种方式在函数内部使用的赋值。最简单的解决方法是使用 eval() 代替它明确返回一个对象。所以最终得到类似的东西:

exec_string = object_name + '(' + def_params + ')'  
opt_object = eval(exec_string)
于 2019-10-06T20:07:09.383 回答