首页 > 解决方案 > 在 sklearn 中将参数传递给管道的 fit()

问题描述

我有一个串联的 sklearnPolynomialFeatures()管道LinearRegression()。我的目标是使用不同的多项式特征来拟合数据degree并测量分数。以下是我使用的代码 -

steps = [('polynomials',preprocessing.PolynomialFeatures()),('linreg',linear_model.LinearRegression())]
pipeline = pipeline.Pipeline(steps=steps)

scores = dict()
for i in range(2,6):
    params = {'polynomials__degree': i,'polynomials__include_bias': False}
    #pipeline.set_params(**params)
    pipeline.fit(X_train,y=yCO_logTrain,**params)
    scores[i] = pipeline.score(X_train,yCO_logTrain)

scores

我收到错误 - TypeError: fit() got an unexpected keyword argument 'degree'

为什么即使参数以 format 命名,也会引发此错误<estimator_name>__<parameter_name>

标签: pythonscikit-learnpipeline

解决方案


根据sklearn.pipeline.Pipeline文档

**fit_paramsdict of string -> object 传递给每个 step 的 fit 方法的参数,其中每个参数名称都有前缀,这样 step s 的参数 p 具有 key s__p。

这意味着通过这种方式传递的参数直接传递给sstep.fit()方法。如果您检查PolynomialFeatures 文档degree则参数用于PolynomialFeatures对象的构造,而不是其.fit()方法。

如果您想为管道中的估计器/转换器尝试不同的超参数,您可以使用GridSearchCV,如下所示。这是链接中的示例代码:

from sklearn.pipeline import Pipeline
from sklearn.feature_selection import SelectKBest
pipe = Pipeline([
    ('select', SelectKBest()),
    ('model', calibrated_forest)])
param_grid = {
    'select__k': [1, 2],
    'model__base_estimator__max_depth': [2, 4, 6, 8]}
search = GridSearchCV(pipe, param_grid, cv=5).fit(X, y)

推荐阅读