【问题标题】:Scikit-Learn pipeline code difference between ColumnTransformer and FeatureUnionColumnTransformer 和 FeatureUnion 之间的 Scikit-Learn 管道代码差异
【发布时间】:2019-09-29 23:49:29
【问题描述】:

我正在使用带有 Scikit-Learn 和 TensorFlow 的动手机器学习:概念、工具... 作者:Aurélien Géron。

我正在尝试在“转换管道”之后和“选择和训练模型”之前运行第 1 章中的代码。

旧版书使用以下代码进行组合变换:

from sklearn.base import BaseEstimator , TransformerMixin
class DataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self,  attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names].values

from sklearn.pipeline import FeatureUnion
#from sklearn_features.transformers import DataFrameSelector

num_attribs = list(housing_num) 
cat_attribs = ["ocean_proximity"]


num_pipeline = Pipeline([
    ('selector', DataFrameSelector(num_attribs)),
    ('imputer', SimpleImputer(strategy="median")),
    ('attribs_adder', CombinedAttributesAdder()),
    ('std_scaler', StandardScaler()),
    ])
cat_pipeline = Pipeline([
    ('selector', DataFrameSelector(cat_attribs)),
    ('label_binarizer', LabelBinarizer()),
    ])

full_pipeline = FeatureUnion(transformer_list=[
    ("num_pipeline", num_pipeline),
    ("cat_pipeline", cat_pipeline),
    ])

housing_prepared=full_pipeline.fit_transform( housing  )
housing_prepared

不过,新代码使用了新引入的 ColumnTransformer

from sklearn.compose import ColumnTransformer
num_attribs=list(housing_num)
cat_attribs=["ocean_proximity"]

full_pipeline = ColumnTransformer([
    ("num", num_pipeline, num_attribs),
    ("cat", OneHotEncoder(),cat_attribs),
    ])
    housing_prepared=full_pipeline.fit_transform( housing  )
    housing_prepared

我想知道为什么旧版本的代码已停产并且无法正常工作,以及 ColumnTransformer 与 FeatureUnion 相比有什么新的地方。

【问题讨论】:

标签: python scikit-learn pipeline


【解决方案1】:

快速浏览一下,我看到他们使用DataFrameSelector 来选择要在管道中进一步处理的列。这非常麻烦,因为您总是必须手动定义 DataFrameSelector。这是ColumnTransofmer 解决的问题。

我不认为第一种方式“停止工作”,只是有第二种选择,你应该尝试使用它。您的代码 sn-ps 是一个很好的例子,说明了这个新特性如何帮助编写更清晰的代码。

希望这能澄清你的疑惑!

【讨论】:

    【解决方案2】:

    ColumnTransformerFeatureUnion 更适合数据预处理步骤,因为它更简单,我们需要编写的代码更少。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2015-08-14
      • 2019-01-12
      • 2019-08-31
      • 2017-06-12
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2017-02-25
      相关资源
      最近更新 更多