使用scikitlearn使用管道时出错

2024-10-06 12:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用StandardScaler执行缩放,并定义KNeighborsClassifier(创建缩放器和估计器的管道)

最后,我想为上面的内容创建一个网格搜索交叉验证程序,其中param_Grid将是一个字典,其中包含n个邻居作为超参数,k_vals作为值。在

def kNearest(k_vals):

    skf = StratifiedKFold(n_splits=5, random_state=23)

    svp = Pipeline([('ss', StandardScaler()),
                ('knc', neighbors.KNeighborsClassifier())])

    parameters = {'n_neighbors': k_vals}

    clf = GridSearchCV(estimator=svp, param_grid=parameters, cv=skf)

    return clf

但这样做会给我一个错误的说法

^{pr2}$

我已经阅读了文档,但仍然不太明白错误指示了什么以及如何修复它。在


Tags: 网格内容管道定义param错误neighbors交叉
1条回答
网友
1楼 · 发布于 2024-10-06 12:25:20

你是对的,这并不是scikit-learn完全记录在案的。(在docstring类中没有对它的引用。)

如果在网格搜索中使用管道作为估计器,那么在指定参数grid时需要使用特殊的语法。具体地说,您需要使用步骤名,后跟一个双下划线,然后是传递给估计器的参数名。一、 e

'<named_step>__<parameter>': value

在您的情况下:

^{pr2}$

应该会成功的。在

这里knc是管道中的命名步骤。有一个属性将这些步骤显示为字典:

svp.named_steps

{'knc': KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
            metric_params=None, n_jobs=1, n_neighbors=5, p=2,
            weights='uniform'),
 'ss': StandardScaler(copy=True, with_mean=True, with_std=True)}

正如你的回溯所暗示的:

svp.get_params().keys()
dict_keys(['memory', 'steps', 'ss', 'knc', 'ss__copy', 'ss__with_mean', 'ss__with_std', 'knc__algorithm', 'knc__leaf_size', 'knc__metric', 'knc__metric_params', 'knc__n_jobs', 'knc__n_neighbors', 'knc__p', 'knc__weights'])

官方对此的一些引用:

相关问题 更多 >