Scikit-learn PipeLine 拟合和变换错误


  1. 我是机器学习的新手,并练习Aurélien Géron的名为"Hands-On Machine Learning with Scikit-Learn and TensorFlow"一书中的代码。有关于管道的代码,它抛出一个名为"属性错误:'经度'不是'系列'对象的有效函数">的错误。

  2. 这是我尝试运行的代码-


class DataFrameSelector(BaseEstimator, TransformerMixin):
def __init__(self, attribute_names):
self.attribute_names = attribute_names
def fit(self, X, y=None):
return X
def transform(self, X):
return X[self.attribute_names].values
num_attributes = list(housing_num)
cat_attributes = ['ocean_proximity']
num_pipeline = Pipeline([ ('selector', DataFrameSelector(num_attributes)),
('imputer', SimpleImputer(strategy='median')), 
('Attribute_adder', CombinedAttributesAdder()), 
('std_scaler', StandardScaler()) ])
cat_pipeline = Pipeline([ ('selector', DataFrameSelector(cat_attributes)),
('label_binarizer', OneHotEncoder()) ])
full_pipeline = FeatureUnion( transformer_list=[ ('num_pipeline', num_pipeline), ('cat_pipeline', cat_pipeline) ] )
housing_prepared = cat_pipeline.fit_transform(housing)
housing_prepared
  1. 这是我正在使用的数据的链接:https://raw.githubusercontent.com/ageron/handson-ml/master/datasets/housing/housing.csv

  2. 当我在没有数据帧选择器的情况下重新运行代码时,它工作得很好。因此,我寻找了一个可能的解决方案,发现不使用FeatureUnion类ColumnTransformer类可以解决不需要DataFrameSelector类的问题。这真的很棒,耗时更少,但没有找到任何关于上述代码问题的解决方案。关于这个问题的任何帮助将不胜感激。

在 sklearn 中,fit方法需要返回self。 这是为了适应链接estimator.fit(X,y).transform(X)的类型

在大多数情况下与调用
estimator.fit_transform(X,y)相同,
后者在安装管道时广泛使用。

因此,当您的管道尝试fit_transformDataFrameSelector时,它会尝试在数据帧X上调用方法transform。 事实证明,数据帧确实有一个方法transform,通过该方法,参数可调用应用于每个列系列。 现在,pd.DataFrame.transform的参数可以是一个列表(要应用的函数(;奇怪的是,在这种情况下,该参数是一个数据帧,但代码只是注意到它是可迭代的,因此它尝试遍历X列并将其名称应用为函数。 因此'longitude' is not a valid function.

最新更新