结合scikit学习中的异构特征



我正在对一些文档进行二进制分类,这些文档的特征已经提取并在文本文件中给出。我的问题是,有文本特征和数字特征,比如年份和其他一些。一个样本以这种格式给出:

label |title text |otherText text |numFeature1 number |numFeature2 number

我遵循有关功能联合的文档,但它们的用例有点不同。我不从另一个特征中提取特征,因为这些数值特征已经给出了。

目前我正在以以下方式使用设置:

pipeline = Pipeline([
('features', Features()),
('union', FeatureUnion(
transformer_list=[
('title', Pipeline([
('selector', ItemSelector(key='title')),
('tfidf', TfidfVectorizer()),
])),
('otherText', Pipeline([
('selector', ItemSelector(key='otherText')),
('tfidf', TfidfVectorizer()),
])),
('numFeature1', Pipeline([
('selector', ItemSelector(key='numFeature1')),
])),
('numFeature2', Pipeline([
('selector', ItemSelector(key='numFeature2')),
])),
],
)),
('classifier', MultinomialNB()),
])

Feature类也来自文档:

class Features(BaseEstimator, TransformerMixin):
def fit(self, x, y=None):
return self
def transform(self, posts):
features = np.recarray(shape=(len(posts),),
dtype=[('title', object),('otherText', object),
('numFeature1', object),('numFeature2', object)])
for i, text in enumerate(posts):
l = re.split("|w+", text)
features['title'][i] = l[1]
features['otherText'][i] = l[2]
features['numFeature1'][i] = l[3]
features['numFeature2'][i] = l[4]
return features

我现在的问题是:如何将数字特征添加到FeatureUnion中?当使用CountVectorizer时,我会得到"ValueError:空词汇表;也许文档只包含停止词",而使用只有一个条目的DictVectorize器并不是我想要的方法。

TfidfVectorizer()对象尚未拟合数据。

在建造管道之前,请执行以下操作-

vec = TfidfVectorizer()
vec.fit(data['free text column'])
pipeline = Pipeline([
('features', Features()),
('union', FeatureUnion(
transformer_list=[
('title', Pipeline([
('selector', ItemSelector(key='title')),
('tfidf', vec),
])),
... other features

如果您想再次调整数据以进行测试,这将有所帮助。。。因为对于测试数据,管道会自动为TfidfVectorizer使用transform()函数,而不是在构建管道之前必须明确使用的fit()函数

ItemSelector()的作用是根据构造函数中提供的key从给定的dict(X)中拾取数据,并返回一维[n,]数组。

FeatureUnion没有正确处理这种类型的[n,]数组。FeatureUnion需要来自其内部transformers的每个维度的2个维度的数组,其中第一个维度(样本数量)应该是一致的,最终可以水平堆叠以组合特征。

前两个transformer中的第二个操作(TfidfVectorizer())从ItemSelector获取此[n,]数组,并输出一个有效的[n,m]类型的数组,其中m = number of features extracted from raw text

但您的第三个和第四个转换器仅包含ItemSelector(),因此它输出[n,]数组。这就是错误的原因。

要更正此问题,应将ItemSelector的输出重新整形为[n,1]。更改ItemSelector.transform()中的以下代码(我假设您使用的是指定链接中的ItemSelector代码):

原始

data_dict[self.key]

data_dict[self.key].reshape((-1,1))

reshape()将把您的[n,]格式化为[n,1],然后FeatureUnion可以使用它来正确地附加数据。

相关内容

  • 没有找到相关文章

最新更新