簡體   English   中英

Scikit-Learn ColumnTransformer 和 FeatureUnion 管道代碼區別

[英]Scikit-Learn pipeline code difference between ColumnTransformer and FeatureUnion

我正在使用帶有 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 相比有什么新功能。

快速瀏覽一下,我看到他們使用DataFrameSelector來選擇要在管道中進一步處理的列。 這非常麻煩,因為您總是需要手動定義DataFrameSelector 這是ColumnTransofmer解決的問題。

我不認為第一種方式“停止工作”,只是有第二種選擇,你應該嘗試使用它。 您的代碼片段是這個新功能如何幫助編寫更清晰代碼的一個很好的例子。

希望這能澄清你的疑慮!

對於數據預處理步驟, ColumnTransformer是比FeatureUnion更好的選擇,因為它更簡單,我們需要編寫的代碼更少。

這種方法的一種新替代方法可能會更簡單,它是新的skdag package(免責聲明:我是作者)。 我寫這篇文章是因為我個人發現 ColumnTransformers 和 FeatureUnions 很辛苦,而且 Pipeline 對 Pandas 數據幀的支持對我來說還不夠。

skdag應該支持您在本地嘗試執行的所有操作,而無需自定義類來處理數據幀。 它使您可以將工作流程構建為圖形,因此不再需要 FeatureUnions。 這是用skdag重寫的示例:

from skdag import DAGBuilder

dag = (
    DAGBuilder(infer_dataframe=True)
    .add_step("input", "passthrough")
    .add_step("imputer", SimpleImputer(strategy="median"), deps={"input": num_attribs})
    .add_step("attribs_adder", CombinedAttributesAdder(), deps=["imputer"])
    .add_step("std_scaler", StandardScaler(), deps=["attribs_adder"])
    .add_step("label_binarizer", LabelBinarizer(), deps={"input": cat_attribs})
    .add_step("merged", "passthrough", deps=["std_scaler", "label_binarizer"])
    .make_dag()
)

dag.fit_transform(housing)

如果要可視化圖形,可以在 Jupyter Notebooks 等交互式環境中調用dag.show()或 dag.draw() 來生成圖像或文本文件:

dag.show()

達格

完整的文檔可以在https://skdag.readthedocs.io/找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM