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

Passing in Python function arguments as variables

我正在尝试编写一个函数来运行分类算法 (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' 因为我试图指定要调整的参数。

如何切换 parameter/argument 我想在许多不同的迭代中进行调整?

此外,显然这是一个玩具箱 - 我问这个问题是因为我希望将不同的 ML 分类算法集成到一个集成包中,并通过马尔可夫链 Monte Carlo 迭代方法调整超参数。但为了做到这一点,我需要能够指定每个算法中的哪些参数在每次迭代中采用在马尔可夫链中找到的 "steps"。

如果我明白你想要什么,你可以使用 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 很好地解释了如何使用偏音。

你只需要使用 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")