我正在通过Scikit-Learn和TensorFlow使用动手机器学习:概念,工具... 通过AurélienGé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相比。
答案 0 :(得分:0)
快速浏览一下,我看到的是他们使用DataFrameSelector
选择要在管道中进一步处理的列。这非常麻烦,因为您总是必须手动定义DataFrameSelector
。这是ColumnTransofmer
解决的问题。
我不认为第一种方法“停止工作”,只是具有第二种选择,您应该尝试使用它。您的代码段很好地说明了此新功能如何帮助编写更清晰的代码。
希望这可以澄清您的疑问!
答案 1 :(得分:0)
ColumnTransformer
比FeatureUnion
更好,因为它更简单并且我们需要编写更少的代码。