如何在 scikit-learn 管道中组合数字和分类特征?
How to Combine Numeric and Categorical features in scikit-learn Pipelines?
我似乎 运行 遇到了尝试将数字(连续)特征与因子结合的问题。我正在使用 Pandas DataFrames 来输入模型。现在,我的代码使用 'gender' 等因素,可以使用内置转换器轻松转换这些因素:
('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]
显然我在这里遗漏了一些重要的东西。有什么想法吗?
在 FeatureUnion
中使用 Pipeline
s 应该可以。这里的问题可能与 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]
有两个维度。
我似乎 运行 遇到了尝试将数字(连续)特征与因子结合的问题。我正在使用 Pandas DataFrames 来输入模型。现在,我的代码使用 'gender' 等因素,可以使用内置转换器轻松转换这些因素:
('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]
显然我在这里遗漏了一些重要的东西。有什么想法吗?
在 FeatureUnion
中使用 Pipeline
s 应该可以。这里的问题可能与 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]
有两个维度。