组合 Sklearn Pipeline 中的功能

ryu*_*nho 6 python scikit-learn

我想使用包括 aTfidfVectorizer和 a 的管道SVC。然而,在这之间,我想将从非文本数据中提取的一些特征连接到TfidfVectorizer.

我尝试创建一个自定义类(基于本教程的方法)来执行此操作,但这似乎不起作用。

这是我到目前为止所尝试过的:

pipeline = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('transformer', CustomTransformer(one_hot_feats)),
    ('clf', MultinomialNB()),
])

parameters = {
    'tfidf__min_df': (5, 10, 15, 20, 25, 30),
    'tfidf__max_df': (0.8, 0.9, 1.0),
    'tfidf__ngram_range': ((1, 1), (1, 2)),
    'tfidf__norm': ('l1', 'l2'),
    'clf__alpha': np.linspace(0.1, 1.5, 15),
    'clf__fit_prior': [True, False],
}

grid_search = GridSearchCV(pipeline, parameters, cv=5, n_jobs=-1, verbose=1)
grid_search.fit(df["short description"], labels)
Run Code Online (Sandbox Code Playgroud)

这是CustomTransformer班级

class CustomTransformer(TransformerMixin):
"""Class that concatenates the one hot encode category feature with the tfidf data."""

def __init__(self, one_hot_features):
    """Initializes an instance of our custom transformer."""
    self.one_hot_features = one_hot_features

def fit(self, X, y=None, **kwargs):
    """Dummy fit function that does nothing particular."""

    return self

def transform(self, X, y=None, **kwargs):
    """Adds our external features"""
    return numpy.hstack((one_hot_feats, X))   
Run Code Online (Sandbox Code Playgroud)

只要 X 不更改自定义类内的维度(可能是与 TransformerMixin 相关的限制),这种方法就有效,但是,就我而言,我会将其他功能附加到我的数据中。我的自定义类应该从不同的基类继承还是有不同的方法来解决这个问题?

Ami*_*ine 7

您可以使用 Sklearn 的FeatureUnion组合多个功能,并使用ColumnTransformer转换特定列:

来自文档

特征联盟

连接多个转换器对象的结果。

该估计器将转换器对象列表并行应用到输入数据,然后连接结果。这对于将多种特征提取机制组合到单个转换器中非常有用。

列转换器

将转换器应用于数组或 pandas DataFrame 的列。

该估计器允许单独变换输入的不同列或列子集,并且每个变换器生成的特征将被连接以形成单个特征空间。这对于异构或柱状数据非常有用,可以将多个特征提取机制或转换组合到单个转换器中。

在你的情况下,你可以使用make_column_transformer来做到这一点

from sklearn.compose import make_column_transformer
pipeline = Pipeline([
    ('transformer',  make_column_transformer((TfidfVectorizer(), ['text_column']),
                                             (OneHotEncoder(), ['categorical_column']),)),
    ('clf', MultinomialNB()),
])
Run Code Online (Sandbox Code Playgroud)

编辑:

在make_column_transformer中设置remainder为,以便转换器中未指定的所有剩余列将自动传递。'passthrough'