【问题标题】:Passing in Python function arguments as variables将 Python 函数参数作为变量传递
【发布时间】:2017-01-26 00:27:05
【问题描述】:

我正在尝试编写一个通过分类算法(k-Means)的各种迭代运行的函数。

在sklearn.neighbors.KNeighborsClassifier中,有几个参数需要调整:n_neighbors和leaf_size。我想知道是否有办法指定在特定迭代期间调整哪个参数。

from sklearn.neighbors import KNeighborsClassifier
def useNeighbors(iterations, *args):
    print(iterations) #normal argument
    for arg in args:
        KNeighborsClassifier(arg=20)

useNeighbors(2, "n_neighbors", "leaf_size")

我希望它实质上实例化一个 KNeighborsClassifer 实例两次——第一次是邻居数为 20,第二次是叶大小为 20(邻居数的默认值为 5,默认叶大小是 30)。

然而,不出所料,这会产生

2
TypeError: _init_params() got an unexpected keyword argument 'arg'

它按预期打印迭代参数,但是 KNeighborsClassifer 没有将字符串参数“n_neighbors”识别为我尝试指定要调整的参数。

如何在许多不同的迭代中切换我想要调整的参数/参数?

另外,显然这是一个玩具案例——我之所以这么问,是因为我希望将不同的 ML 分类算法集成到一个集成包中,其中包含通过马尔可夫链蒙特卡罗迭代方法调整的超参数。但为了做到这一点,我需要能够指定每个算法中的哪些参数在每次迭代中采用马尔可夫链中的“步骤”。

【问题讨论】:

    标签: python data-science


    【解决方案1】:

    你只需要使用spread:

    from sklearn.neighbors import KNeighborsClassifier
    def useNeighbors(iterations, *args):
        print(iterations) #normal argument
        for arg in args:
            my_dict = {}
            my_dict[arg] = 20
            KNeighborsClassifier(**my_dict)
    
    useNeighbors(2, "n_neighbors", "leaf_size")
    

    【讨论】:

      【解决方案2】:

      如果我明白你想要什么,你可以使用partials。示例

      from functools import partial
      from sklearn.neighbors import KNeighborsClassifier
      
          classifiers = [partial(KNeighborsClassifier, n_neighbors=20),
                         partial(KNeighborsClassifier, leaf_size=20)]
          for classifier in classifiers:
              classifier()
      

      Here 很好地解释了如何使用 partials。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        相关资源
        最近更新 更多