scikit-学习管道

scikit-learn pipeline


我的 (iid) 数据集中的每个样本如下所示:
x = [a_1,a_2...a_N,b_1,b_2...b_M]

我还有每个样本的标签(这就是监督学习)

a 特征非常稀疏(即词袋表示),而 b 特征密集(整数,大约有 45 个)

我正在使用 scikit-learn,我想将 GridSearchCV 与管道一起使用。

问题:是否可以在特征类型 a 上使用一个 CountVectorizer,在特征类型 b 上使用另一个 CountVectorizer?

我想要的可以认为是:

pipeline = Pipeline([
    ('vect1', CountVectorizer()), #will work only on features [0,(N-1)]
    ('vect2', CountVectorizer()), #will work only on features [N,(N+M-1)]
    ('clf', SGDClassifier()), #will use all features to classify
])

parameters = {
    'vect1__max_df': (0.5, 0.75, 1.0),       # type a features only
    'vect1__ngram_range': ((1, 1), (1, 2)),  # type a features only
    'vect2__max_df': (0.5, 0.75, 1.0),       # type b features only
    'vect2__ngram_range': ((1, 1), (1, 2)),  # type b features only
    'clf__alpha': (0.00001, 0.000001),
    'clf__penalty': ('l2', 'elasticnet'),
    'clf__n_iter': (10, 50, 80),
}

grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1)
grid_search.fit(X, y)

这可能吗?

@Andreas Mueller 介绍了 nice idea。 但是,我也想保留原始的未选择的功能...因此,我无法预先(在管道开始之前)告诉管道中每个阶段的列索引。

比如我设置CountVectorizer(max_df=0.75),可能会减少一些term,原来的column index会变

谢谢

不幸的是,这目前还没有达到应有的水平。您需要使用 FeatureUnion 来连接各种特征,并且每个中的转换器都需要 select 特征并对其进行转换。 一种方法是制作一个转换器的管道,该转换器包含 select 列(您需要自己编写)和 CountVectorizer。有一个例子做类似的事情 here。该示例实际上将特征分隔为字典中的不同值,但您不需要这样做。 另请查看 related issue for selecting columns,其中包含您需要的转换器代码。

当前代码看起来像这样:

make_pipeline(
    make_union(
        make_pipeline(FeatureSelector(some_columns), CountVectorizer()),
        make_pipeline(FeatureSelector(other_columns), CountVectorizer())),
    SGDClassifier())