我似乎在尝试将数值(连续)特征与因子结合时遇到了问题。我使用Pandas数据框作为模型的输入。目前,我的代码可以处理像’gender’这样的因子,这些因子可以使用内置的转换器轻松转换:
('gender', Pipeline([('selector', ColumnSelector(column='gender')),('dict', DictTransformer()),('vect', DictVectorizer(sparse=False))]))
但是,当我尝试像下面这样将它与一个数值因子(例如,latitude)结合时,
('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]
显然,我在这里错过了什么重要的东西。有什么想法吗?
回答:
在FeatureUnion
中使用Pipeline
应该可以工作。这里的问题很可能与ColumnSelector
的实现有关。请注意,每次转换时它会输出一个单维结构;然而,scikit-learn中的接口通常期望输入为2D形状,即(n_sample, n_feature)
。
假设ColumnSelector
的输入是一个pandas数据框,尝试将代码更改为:
class ColumnSelector(TransformerMixin): ... def transform(self, data_frame): return data_frame[[self.column]]
这将使转换后的输出具有2D形状。
在内部,FeatureUnion
使用hstack
来执行特征矩阵的组合。这是一个最小的示例,导致hstack
以问题中描述的方式抱怨维度不匹配:
import numpy as npa = 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]
具有两个维度。