2015-12-15 36 views
1

我似乎遇到了试图将数字(连续)功能与因素结合起来的问题。我正在使用Pandas DataFrame输入模型。现在,我的代码工作与像“性别”,可以使用内置的变压器很容易地转化因素:如何在scikit-learn Pipelines中结合数字和分类特征?

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

但是,当我试图在结合了数字因子(如纬度)如下,

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

我得到一个错误:

ValueError: all the input arrays must have same number of dimensions

这里是我的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] 

显然我错过了重要的东西在这里。有任何想法吗?

+0

你能转换的序列在管道的上下文之外工作吗?管道可能会使故障排除更加困难 – Ryan

+0

我确信我可以做到这一点,但我可能必须这样做,但这并不能解决此问题。与FeatureUnion结合的管道看起来非常方便,所以我想弄清楚如何使这项工作。 –

+0

这个错误究竟是从哪里来的?文件/行号。另外,如果你想用不同的转换器转换每一列 - 看看http://stackoverflow.com/a/34202758/1030820 –

回答

1

使用Pipeline s在FeatureUnion应该工作。这里的问题可能与执行ColumnSelector有关。请注意,它在每次转换时输出单维结构;然而,scikit-learn中的界面通常期望输入2D形状,即(n_sample, n_feature)

假设输入到ColumnSelector是熊猫数据帧,尝试代码改变为:

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]有两个维度。

+0

是的,这是问题和解决方法。谢谢! –

相关问题