将Python函数参数作为变量传递

时间:2017-01-25 16:12:23

标签: python data-science

我正在尝试编写一个贯穿分类算法(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分类算法集成到一个集合包中,通过马尔可夫链蒙特卡罗迭代方法调整超参数。但是为了做到这一点,我需要能够指定每个算法中的哪些参数采用每次迭代中马尔可夫链中的“步骤”。

2 个答案:

答案 0 :(得分:1)

如果我了解您的需求,可以使用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是使用部分内容的一个很好的解释。

答案 1 :(得分: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")