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())
我的 (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())