如何在scikit-learn管道中组合数字和分类功能?

时间:2015-12-15 17:58:39

标签: python machine-learning scikit-learn

我似乎遇到了试图将数字(连续)特征与因子结合起来的问题。我正在使用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]

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

1 个答案:

答案 0 :(得分:2)

Pipeline中使用FeatureUnion应该有效。这里的问题可能与ColumnSelector的实施有关。请注意,它在每次转换时输出一维结构;然而,scikit-learn中的接口通常期望输入2D形状,即(n_sample, n_feature)

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

class ColumnSelector(TransformerMixin):
   ...

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

使变换后的输出具有2D形状。

在内部,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]有两个维度。