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



我制作了以下自定义转换器,其转换函数为:

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_dropted(当我在管道外运行转换函数时,它起作用。。。我试着用df.copy((复制transform((中的输入,以防原始数据被修改,然后当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 

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

最新更新