管道和网格搜索的 SKLearn 错误

Posted

技术标签:

【中文标题】管道和网格搜索的 SKLearn 错误【英文标题】:SKLearn Error with Pipeline and Gridsearch 【发布时间】:2020-01-28 11:31:18 【问题描述】:

我想首先将我的数据拆分为测试集和训练集。然后我想在我的训练集上使用 GridSearchCV(内部分成训练/验证集)。最后我想收集所有的测试数据并做一些其他的事情(不在问题的范围内)。

我必须扩展我的数据。所以我想在管道中处理这个问题。我的 SVC 中的某些内容应该被修改(kernel='rbf', class_weight=...)。 当我运行代码时,会发生以下情况:

"ValueError: Invalid parameter estimator for estimator Pipeline"

我不明白我做错了什么。我试着关注这个帖子:StandardScaler with Pipelines and GridSearchCV

唯一的区别是,我在 SVC 中修复了一些参数。我该如何处理?

target = np.array(target).ravel()
loo = LeaveOneOut()
loo.get_n_splits(input)
    # Outer Loop
for train_index, test_index in loo.split(input):    
        X_train, X_test = input[train_index], input[test_index]
        y_train, y_test = target[train_index], target[test_index]
        p_grid = 'estimator__C': np.logspace(-5, 2, 20),
                  'estimator__gamma': np.logspace(-5, 3, 20)

        SVC_Kernel = SVC(kernel='rbf', class_weight='balanced',tol=10e-4, max_iter=200000, probability=False)
        pipe_SVC = Pipeline([('scaler',  RobustScaler()),('SVC', SVC_Kernel)])  
        n_splits = 5
        scoring = "f1_micro"

        inner_cv = StratifiedKFold(n_splits=n_splits,
                         shuffle=True, random_state=5)
        clfSearch = GridSearchCV(estimator=pipe_SVC, param_grid=p_grid,
                                 cv=inner_cv, scoring='f1_micro', iid=False, n_jobs=-1)

        clfSearch.fit(X_train, y_train)



        print("Best parameters set found on validation set for Support Vector Machine:")
        print()
        print(clfSearch.best_params_)
        print()
        print(clfSearch.best_score_)
        print("Grid scores on validation set:")
        print()

我也试过这样:

p_grid = 'estimator__C': np.logspace(-5, 2, 20),
              'estimator__gamma': np.logspace(-5, 3, 20),
              'estimator__tol': [10e-4],
              'estimator__kernel': ['rbf'],
              'estimator__class_weight': ['balanced'],
              'estimator__max_iter':[200000],
              'estimator__probability': [False]

SVC_Kernel = SVC()

这也行不通。

【问题讨论】:

【参考方案1】:

问题在于您的p_grid。您在Pipeline 上进行网格搜索,并且没有任何名为estimator 的内容。它确实有一个叫做SVC的东西,所以如果你想设置SVC的参数,你应该在你的键前面加上SVC__而不是estimator__。所以将p_grid替换为:

p_grid = 'SVC__C': np.logspace(-5, 2, 20),
          'SVC__gamma': np.logspace(-5, 3, 20)

此外,您可以使用 cross_validate 函数替换外部 for 循环。

【讨论】:

非常感谢。也适用于交叉验证的提示。

以上是关于管道和网格搜索的 SKLearn 错误的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 管道有没有办法在网格搜索期间进行有步骤和无步骤的训练?我可以删除步骤,但如何将其传递给 GridSearchCV?

使用管道和网格搜索执行特征选择

带有 SkLearn 管道的 GridSearch 无法正常工作

使用网格搜索获得最佳模型的“并行”管道

sklearn:应用相同的缩放来训练和预测管道

使用预定义的验证集 Sklearn 执行网格搜索