python - 如何在 scikit-learn 管道中组合数字和分类特征?

标签 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: 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 中的接口(interface)通常期望输入 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] 有两个维度。

关于python - 如何在 scikit-learn 管道中组合数字和分类特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34296245/

相关文章:

python - Django 中的 CSS 不更新

python - sklearn Predict_proba 不匹配类标签

python - sklearn.linear_model.LogisticRegression 每次都返回不同的系数,尽管设置了 random_state

parallel-processing - 具有并行作业的 RFECV

python - 更改 Odoo 中自动生成的表单 View 的标题

python - 在没有循环开销的情况下在 Python 中实现交错乘积和求和

python - 在文本框中搜索单词并将光标移动到文本框中的下一个匹配项?

machine-learning - 如何找到 MDP 的最优线性基函数?

machine-learning - 我可以防止 J48 分类器在同一字段上 split 超过 x 次吗?

scikit-learn - 使用 sklearn 时的精确度和召回率误差