FeatureUnion 中变压器的绑定输出
Binding outputs of transformers in FeatureUnion
python 和 sklearn 的新手,因此提前致歉。我有两个变压器,我想将结果收集到一个 FeatureUnion 中(用于最后的建模步骤)。这应该非常简单,但 FeatureUnion 正在堆叠输出而不是提供 nx2 数组或 DataFrame。在下面的示例中,我将生成一些 10 行乘 2 列的数据。这将生成两个 10 行乘 1 列的特征。我希望最终的特征联合有 10 行和 1 列,但我得到的是 20 行乘 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'))
])
现在我使用管道,但它 returns 是一个两倍长度的数组
pipe.fit_transform(df).shape
(20,)
但是我想要一个维度为 (10, 2) 的数组。
快速修复?
FeatureUnion
中的变换器需要 return 二维矩阵,但是在您的代码中,通过选择一列,您正在 returning 一个一维向量。您可以通过选择带有 X[[self.col_name]]
.
的列来解决此问题
python 和 sklearn 的新手,因此提前致歉。我有两个变压器,我想将结果收集到一个 FeatureUnion 中(用于最后的建模步骤)。这应该非常简单,但 FeatureUnion 正在堆叠输出而不是提供 nx2 数组或 DataFrame。在下面的示例中,我将生成一些 10 行乘 2 列的数据。这将生成两个 10 行乘 1 列的特征。我希望最终的特征联合有 10 行和 1 列,但我得到的是 20 行乘 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'))
])
现在我使用管道,但它 returns 是一个两倍长度的数组
pipe.fit_transform(df).shape
(20,)
但是我想要一个维度为 (10, 2) 的数组。
快速修复?
FeatureUnion
中的变换器需要 return 二维矩阵,但是在您的代码中,通过选择一列,您正在 returning 一个一维向量。您可以通过选择带有 X[[self.col_name]]
.