【问题标题】:How to Combine Numeric and Categorical features in scikit-learn Pipelines?如何在 scikit-learn 管道中结合数值和分类特征?
【发布时间】:2016-03-21 15:47:37
【问题描述】:

我似乎在尝试将数字(连续)特征与因子相结合时遇到问题。我正在使用 Pandas DataFrames 输入模型。现在,我的代码适用于“性别”等因素,可以使用内置转换器轻松转换:

('gender', Pipeline([
('selector', ColumnSelector(column='gender')),
('dict', DictTransformer()),
('vect', DictVectorizer(sparse=False))
]))

但是当我尝试将其与数字因子(例如纬度)组合如下时,

('latitude', Pipeline([
('selector', ColumnSelector(column='latitude')),
('scaler', StandardScaler())
]))

我收到一个错误:

ValueError:所有输入数组的维数必须相同

这是我的 ColumnSelector() 代码:

class ColumnSelector(TransformerMixin):
    """
    Class for building sklearn Pipeline step. This class should be used to select a column from a pandas data frame.
    """

    def __init__(self, column):
        self.column = column

    def fit(self, x, y=None):
        return self

    def transform(self, data_frame):
        return data_frame[self.column]

显然我在这里遗漏了一些重要的东西。有什么想法吗?

【问题讨论】:

  • 你能在管道的上下文之外工作的转换序列吗?管道可能使故障排除变得更加困难
  • 我确信我能做到,而且我可能不得不这样做,但这并不能解决这个问题。管道结合 FeatureUnion 看起来真的很方便,所以我想弄清楚如何使这项工作。
  • 这个错误究竟来自哪里?文件/行号。此外,如果您想使用不同的转换器转换每一列 - 请查看 stackoverflow.com/a/34202758/1030820

标签: python machine-learning scikit-learn


【解决方案1】:

FeatureUnion 中使用Pipelines 应该可以。这里的问题很可能与ColumnSelector的实现有关。请注意,它在每次转换时输出一维结构;但是,scikit-learn 中的接口通常需要输入 2D 形状,即(n_sample, n_feature)

假设ColumnSelector 的输入是pandas DataFrame,尝试将代码更改为:

class ColumnSelector(TransformerMixin):
   ...

   def transform(self, data_frame):
       return data_frame[[self.column]]

这使得转换后的输出具有二维形状。

在内部,FeatureUnion 使用hstack 来执行特征矩阵的组合。这是导致hstack 以问题中描述的方式抱怨尺寸不匹配的最小示例:

import numpy as np
a = np.array([[1,0],
              [0,1]])
b = np.array([2,3])
print np.hstack((a,b))
# ValueError: all the input arrays must have same number of dimensions

但是,这是可行的:

print np.hstack((a, b[:, np.newaxis]))
# array([[1, 0, 2],
#        [0, 1, 3]])

现在b[:, np.newaxis] 有两个维度。

【讨论】:

  • 是的,这就是问题所在。谢谢!
猜你喜欢
  • 2017-06-20
  • 2014-09-10
  • 2015-01-12
  • 2012-09-25
  • 2019-02-14
  • 1970-01-01
  • 2021-06-19
  • 2016-11-30
  • 2014-02-17
相关资源
最近更新 更多