【问题标题】:Binding outputs of transformers in FeatureUnion在 FeatureUnion 中绑定转换器的输出
【发布时间】:2017-02-01 05:33:15
【问题描述】:

python 和 sklearn 的新手,请提前致歉。我有两个变压器,我想将结果收集在一个 `FeatureUnion 中(用于最后的最终建模步骤)。这应该很简单,但 FeatureUnion 是堆叠输出而不是提供 nx2 数组或 DataFrame。在下面的示例中,我将生成一些 10 行乘 2 列的数据。这将生成两个 10 行 x 1 列的特征。我希望最终的功能联合有 10 行和 1 列,但我得到的是 20 行 x 1 列。

我将尝试用下面的示例进行演示:

一些进口

import numpy as np
import pandas as pd
from sklearn import pipeline
from sklearn.base import TransformerMixin

一些随机数据

df = pd.DataFrame(np.random.rand(10, 2), columns=['a', 'b'])

一个选择列的自定义转换器

class Trans(TransformerMixin):
    def __init__(self, col_name):
        self.col_name = col_name
    def fit(self, X):
        return self                                                                    
    def transform(self, X):                                                           
        return X[self.col_name]

使用变压器两次的管道(在我的真实情况下,我有两个不同的变压器,但这会重现问题)

pipe = pipeline.FeatureUnion([
    ('select_a', Trans('a')),
    ('select_b', Trans('b'))
    ])

现在我使用管道,但它返回一个长度是两倍的数组

pipe.fit_transform(df).shape

(20,)

但是我想要一个维度为 (10, 2) 的数组。

快速修复?

【问题讨论】:

    标签: python scikit-learn pipeline


    【解决方案1】:

    FeatureUnion 中的转换器需要返回二维矩阵,但是在您的代码中,通过选择一列,您将返回一个一维向量。您可以通过选择带有X[[self.col_name]] 的列来解决此问题。

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 2018-04-26
      • 2019-02-06
      • 2012-04-11
      • 1970-01-01
      • 2021-12-09
      • 2020-03-27
      • 2011-11-11
      • 2012-03-01
      相关资源
      最近更新 更多