使用 pd.drop() 的 sklearn 自定义转换器

sklearn custom transformer with pd.drop()

我制作了以下自定义 t运行sformer,其中 t运行sform 函数为:

def transform(self, X):
        data = X.copy()
        data = data.drop(self.columns_dropped,axis=1)
        for col in self.cat_col:
            data[col] = data[col].str.lower()
        data[self.col_to_ordinal] = data[self.col_to_ordinal].fillna("na") 
        data[self.col_to_ordinal] = data[self.col_to_ordinal].replace(self.qc_order)
        
        for x in range(len(self.g1)):
            data = data.replace(self.g1[x], x)
        for x in range(len(self.g2)):
            data = data.replace(self.g2[x], x)
        data = data.set_index(data['Id'])
        data = data.drop('Id',axis=1)
        return data 

我已将其作为管道的一部分:

Pipeline([
        ('preprocessor', preprocessor),
        ('model', model)
        ])
preprocessor = ColumnTransformer(transformers=[
    ('cat', cat_pipeline, cat_col),
    ('num', SimpleImputer(), num_col)
    ])
cat_pipeline = Pipeline([
    ('pandas_transform', PandasTransform() ),
    ('cat_encoder', OneHotEncoder(handle_unknown='ignore') )
    ]) 

但之后,当我想 运行 GridSearchCV 时,它会引发错误:

"['LotFrontage', 'Alley', 'FireplaceQu', 'PoolQC', 'Fence', 'MiscFeature', 'YearRemodAdd', 'YearBuilt', 'MoSold', 'YrSold', 'GarageType', 'GarageYrBlt', 'GarageFinish', 'GarageArea', 'GarageCond', 'Exterior2nd']
 not found in axis"

(列表是变量columns_dropped) 当我 运行 管道外的 t运行sform 函数工作时... 我尝试用 df.copy() 复制 t运行sform() 中的输入,以防原始数据被修改,然后当 func 连续 运行 次时,不会有要删除的列,因为它们在上次 func 调用时已经被删除,但我仍然收到错误。

有什么想法吗?

也许你可以试试下面的方法

def transform(self, X):
    data = X.copy()
    for x in self.columns_dropped:
        if x in data.columns.to_list():
            data = data.drop(x, axis=1)

    for col in self.cat_col:
        data[col] = data[col].str.lower()
    data[self.col_to_ordinal] = data[self.col_to_ordinal].fillna("na") 
    data[self.col_to_ordinal] = data[self.col_to_ordinal].replace(self.qc_order)
    
    for x in range(len(self.g1)):
        data = data.replace(self.g1[x], x)
    for x in range(len(self.g2)):
        data = data.replace(self.g2[x], x)
    data = data.set_index(data['Id'])
    data = data.drop('Id',axis=1)
    return data 

如果可行,请告诉我。这不是最优雅的解决方案,但从您提供的内容来看,如果我正确理解了问题,那至少应该让您克服错误。