使用 scikit-learn 使用管道时出错
Error when using scikit-learn to use pipelines
我正在尝试使用 StandardScaler 执行缩放并定义 KNeighborsClassifier(创建缩放器和估计器的管道)
最后,我想为上面的内容创建一个网格搜索交叉验证器,其中 param_grid 将是一个包含 n_neighbors 作为超参数和 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
但是这样做会给我一个错误提示
Invalid parameter n_neighbors for estimator Pipeline. Check the list of available parameters with `estimator.get_params().keys()`.
我已经阅读了文档,但仍然不太明白错误的含义以及如何修复它。
你是对的,这在 scikit-learn 中并没有很好地记录。 (在 class 文档字符串中对它的引用为零。)
如果在网格搜索中使用管道作为估计器,则在指定参数网格时需要使用特殊语法。具体来说,您需要使用 步骤名称 后跟双下划线,然后是参数名称,就像您将其传递给估算器一样。即
'<named_step>__<parameter>': value
你的情况:
parameters = {'knc__n_neighbors': k_vals}
应该可以解决问题。
此处 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'])
官方对此的一些引用:
我正在尝试使用 StandardScaler 执行缩放并定义 KNeighborsClassifier(创建缩放器和估计器的管道)
最后,我想为上面的内容创建一个网格搜索交叉验证器,其中 param_grid 将是一个包含 n_neighbors 作为超参数和 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
但是这样做会给我一个错误提示
Invalid parameter n_neighbors for estimator Pipeline. Check the list of available parameters with `estimator.get_params().keys()`.
我已经阅读了文档,但仍然不太明白错误的含义以及如何修复它。
你是对的,这在 scikit-learn 中并没有很好地记录。 (在 class 文档字符串中对它的引用为零。)
如果在网格搜索中使用管道作为估计器,则在指定参数网格时需要使用特殊语法。具体来说,您需要使用 步骤名称 后跟双下划线,然后是参数名称,就像您将其传递给估算器一样。即
'<named_step>__<parameter>': value
你的情况:
parameters = {'knc__n_neighbors': k_vals}
应该可以解决问题。
此处 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'])
官方对此的一些引用: