我想使用包含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)
这是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))
只要X不会在自定义类中更改尺寸(可能是与TransformerMixin相关的限制),此方法就可以使用,但是,就我而言,我将在数据中附加其他功能。我的自定义类是否应该继承自其他基类,或者有其他方法可以解决此问题?
您可以使用Sklearn的FeatureUnion组合多个功能,并使用ColumnTransformer转换特定的列:
来自docs:
FeatureUnion
连接多个转换器对象的结果。
此估算器将变形器对象列表与输入数据并行应用,然后将结果连接起来。将多个特征提取机制组合到单个转换器中很有用。
列转换器
将转换器应用于数组或熊猫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()),
])
编辑:
在make_column_transformer中设置remainder
为'passthrough'
,以便所有未在转换器中指定的列都将自动通过。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句