管道和Gridsearch的SKLearn错误

时间:2019-09-28 12:40:19

标签: scikit-learn svm pipeline gridsearchcv

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

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

“ ValueError:估算器管道的无效参数估算器”

我不明白我在做什么错。我尝试遵循此线程: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 个答案:

答案 0 :(得分: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)}

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