估算器管道 (SVR) 的参数无效

Posted

技术标签:

【中文标题】估算器管道 (SVR) 的参数无效【英文标题】:Invalid parameter for estimator Pipeline (SVR) 【发布时间】:2021-06-01 12:32:43 【问题描述】:

我有一个包含 100 列连续特征和一个连续标签的数据集,我想运行 SVR;提取相关特征,调整超参数,然后交叉验证适合我的数据的模型。

我写了这段代码:

X_train, X_test, y_train, y_test = train_test_split(scaled_df, target, test_size=0.2)
    
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)

# define the pipeline to evaluate
model = SVR()
fs = SelectKBest(score_func=mutual_info_regression)
pipeline = Pipeline(steps=[('sel',fs), ('svr', model)])

# define the grid
grid = dict()

#How many features to try
grid['estimator__sel__k'] = [i for i in range(1, X_train.shape[1]+1)]


# define the grid search
#search = GridSearchCV(pipeline, grid, scoring='neg_mean_squared_error', n_jobs=-1, cv=cv)
search = GridSearchCV(
        pipeline,
#        estimator=SVR(kernel='rbf'),
        param_grid=
            'estimator__svr__C': [0.1, 1, 10, 100, 1000],
            'estimator__svr__epsilon': [0.0001, 0.0005,  0.001, 0.005,  0.01, 0.05, 1, 5, 10],
            'estimator__svr__gamma': [0.0001, 0.0005,  0.001, 0.005,  0.01, 0.05, 1, 5, 10]
        ,
        scoring='neg_mean_squared_error',
        verbose=1,
        n_jobs=-1)

for param in search.get_params().keys():
    print(param)

# perform the search
results = search.fit(X_train, y_train)

# summarize best
print('Best MAE: %.3f' % results.best_score_)
print('Best Config: %s' % results.best_params_)

# summarize all
means = results.cv_results_['mean_test_score']
params = results.cv_results_['params']
for mean, param in zip(means, params):
    print(">%.3f with: %r" % (mean, param))

我得到错误:

ValueError: Invalid parameter estimator for estimator Pipeline(memory=None,
         steps=[('sel',
                 SelectKBest(k=10,
                             score_func=<function mutual_info_regression at 0x7fd2ff649cb0>)),
                ('svr',
                 SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1,
                     gamma='scale', kernel='rbf', max_iter=-1, shrinking=True,
                     tol=0.001, verbose=False))],
         verbose=False). Check the list of available parameters with `estimator.get_params().keys()`.

当我打印 estimator.get_params().keys() 时,按照错误消息中的建议,我得到:

cv
error_score
estimator__memory
estimator__steps
estimator__verbose
estimator__sel
estimator__svr
estimator__sel__k
estimator__sel__score_func
estimator__svr__C
estimator__svr__cache_size
estimator__svr__coef0
estimator__svr__degree
estimator__svr__epsilon
estimator__svr__gamma
estimator__svr__kernel
estimator__svr__max_iter
estimator__svr__shrinking
estimator__svr__tol
estimator__svr__verbose
estimator
iid
n_jobs
param_grid
pre_dispatch
refit
return_train_score
scoring
verbose
Fitting 5 folds for each of 405 candidates, totalling 2025 fits

但是当我换行时:

pipeline = Pipeline(steps=[('sel',fs), ('svr', model)])

到:

pipeline = Pipeline(steps=[('estimator__sel',fs), ('estimator__svr', model)])

我得到错误:

ValueError: Estimator names must not contain __: got ['estimator__sel', 'estimator__svr']

有人能解释一下我做错了什么吗,即如何将管道/特征选择步骤结合到 GridSearchCV 中?

作为旁注,如果我在 GridSearchCV 中注释掉 pipeline 并取消注释 estimator=SVR(kernal='rbf'),则单元格运行没有问题,但在这种情况下,我认为我没有将特征选择纳入其中,因为它不是在任何地方调用。我看过一些以前的 SO 问题,例如here,但他们似乎没有回答这个具体问题。

有没有更简洁的写法?

【问题讨论】:

【参考方案1】:

第一条错误消息是关于pipeline 参数,而不是search 参数,并表明您的param_grid 错误,而不是管道步骤名称。运行 pipeline.get_params().keys() 应该会显示正确的参数名称。你的网格应该是:

        param_grid=
            'svr__C': [0.1, 1, 10, 100, 1000],
            'svr__epsilon': [0.0001, 0.0005,  0.001, 0.005,  0.01, 0.05, 1, 5, 10],
            'svr__gamma': [0.0001, 0.0005,  0.001, 0.005,  0.01, 0.05, 1, 5, 10]
        ,

我不知道如何用普通 SVR 代替管道运行;你的参数网格也没有指定正确的东西......

【讨论】:

谢谢。当我将 param_grid 更改为您的代码时,它会运行(在 y_pred 和 y_test 之间有一个非常糟糕的 Spearman)。如果确实如此,那很好,但我想检查一下,这不是因为模型制作不当。我不明白‘我不知道如何用普通的 SVR 代替管道运行;你的参数网格也没有指定正确的东西......'。你是说这段代码不应该运行吗?我将代码单独保存在一个文件中,之前读取了一些数据,当我打印y_pred = results.predict(X_test); print y_pred[0:10] 时,它会打印 10 个预测。 @Slowat_Kela 我指的是你的“旁注”段落。如果estimator=SVR(...),那么在param_grid 中包含estimator__svr__C 应该会失败,并出现与您最初报告的错误相同的错误;在这个版本中,参数名称应该只是C 哦,对不起,这是我的错,我不清楚。我有estimator=SVR(...),当我在参数网格中只有C、epsilon 和gamma 对不起(不是estimator__svr_C)。抱歉,我不清楚,我的意思是如果我只使用普通 SVR,我可以让这段代码通常运行,但如果我将它交换到管道,则不能。

以上是关于估算器管道 (SVR) 的参数无效的主要内容,如果未能解决你的问题,请参考以下文章

GridSearchCV 和 ValueError:估计器管道的参数 alpha 无效

sklearn中估计器管道的参数clf无效

ValueError:使用 GridSearch 参数时估计器 CountVectorizer 的参数模型无效

如何在 Python 中找到 GridSearchCV 的所有参数?

管道参数无效

无法保存管道估算器