结合scikitlearn中的异构特性

2024-10-02 00:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

^{pr2}$

要素类也取自文档:

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:emptyvography;也许文档只包含停止词”,而使用只有一个条目的DictVectorizer并不适合我。在


Tags: text文档selfnumberreturnobjecttitledef
2条回答

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

此类型的[n,]数组没有被FeatureUnion正确处理。FeatureUnion需要从每个内部transformers中的每个维度组成一个数组,其中第一个维度(样本数)应该是一致的,最后可以水平堆叠以组合特征。在

前两个转换器(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]

新增

^{pr2}$

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

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()函数,这是在构造管道之前必须显式执行的

相关问题 更多 >

    热门问题