使用 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
如果可行,请告诉我。这不是最优雅的解决方案,但从您提供的内容来看,如果我正确理解了问题,那至少应该让您克服错误。
我制作了以下自定义 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
如果可行,请告诉我。这不是最优雅的解决方案,但从您提供的内容来看,如果我正确理解了问题,那至少应该让您克服错误。