如何使用GridSearchCV和KFold交叉验证评估管道中的多个分类器?

时间:2019-06-01 21:52:25

标签: python machine-learning scikit-learn classification cross-validation

我想:

  1. 评估多种类型的分类器
  2. 在管道中
  3. 使用GridSearchCV确定最佳的超参数
  4. 使用KFold交叉验证估计泛化误差

但是我不确定scikit-learn的功能应该是什么样。实际上,在这一系列测试结束之前,我想知道在所有测试及其相关参数中性能最好的分类器是什么。

this tutorial from scikit-learn之后,这是我到目前为止的内容:

首先,我的代码的主要部分:

inner_cv = KFold(n_splits=3, shuffle=False, random_state=SEED1)
outer_cv = KFold(n_splits=3, shuffle=False, random_state=SEED2)

model = create_pipeline(inner_cv)

# Nested CV with parameter optimization
scores = cross_validate(model, X, y, cv=outer_cv, scoring='f1_macro')

下面是创建我的管道的函数(create_vectorizer()仅返回将CountVectorizer应用于我的DataFrame某些列的ColumnTransformer)。在此函数中,我仅包含KNeighborsClassifier,但我想评估多个分类器。

def create_pipeline(cross_validator):
    # create a dictionary of all values we want to test for n_neighbors
    param_grid = {'n_neighbors': np.arange(1, 10)}

    # use GridSearch to test all values for n_neighbors
    knn = KNeighborsClassifier()
    knn_gscv = GridSearchCV(knn, param_grid, cv=cross_validator)

    vectorizer = create_vectorizer()
    pipeline = Pipeline(memory=None,
                        steps=[
                            ('vectorizer', vectorizer),
                            ('knn_gscv', knn_gscv)
                        ])
    return pipeline    

我不确定传递多个分类器的位置。

  1. 是否必须为我要测试的每个分类器创建单独的GridSearchCV对象?
  2. 如果管道中的最后一步必须是估计量,那么如何为最后一步传递多个?
  3. 是否可以不必重复管道中的所有先前步骤?

谢谢。

0 个答案:

没有答案