在scikit-learn

时间:2017-02-03 10:49:36

标签: python scikit-learn feature-extraction

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

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

我正在关注feature unions的文档,但他们的用例有点不同。我没有从另一个特征中提取特征,因为已经给出了这些数字特征。

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

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:空词汇;也许文档只包含停用词”,并且使用只带有一个条目的DictVectorizer并不会让我感觉如何。

2 个答案:

答案 0 :(得分:0)

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

如果您想再次调整数据用于测试目的,这会有所帮助...因为对于测试数据,管道会自动使用transform {)函数来代替fit()函数,而不是必须使用fit()函数在构建管道之前做的

答案 1 :(得分:0)

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

[n,]无法正确处理此类FeatureUnion数组。 FeatureUnion需要每个内部transformers的2维数组,其中第一维(样本数)应该是一致的,最后可以水平堆叠以组合这些特征。

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

但是您的第3和第4个变换器只包含 ItemSelector(),因此会输出 [n,] 数组。这是错误的原因。

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

<强>原始

data_dict[self.key]

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

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