编辑:实际上彼得的评论答案在ColumnTransformer doc:
变换后的特征矩阵中的列顺序遵循变换器列表中列的指定顺序。除非在 passthrough 关键字中指定,否则未指定的原始特征矩阵的列将从生成的转换后的特征矩阵中删除。用 passthrough 指定的那些列被添加到转换器输出的右侧。
为了用 Paul 在评论中提出的问题来完成 Venkatachalam 的回答,在 ColumnTransformer .get_feature_names() 方法中出现的特征名称的顺序取决于在 ColumnTransformer 实例中声明 steps 变量的顺序。
我找不到任何文档,所以我只玩了下面的玩具示例,这让我理解了逻辑。
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import RobustScaler
class testEstimator(BaseEstimator,TransformerMixin):
def __init__(self,string):
self.string = string
def fit(self,X):
return self
def transform(self,X):
return np.full(X.shape, self.string).reshape(-1,1)
def get_feature_names(self):
return self.string
transformers = [('first_transformer',testEstimator('A'),1), ('second_transformer',testEstimator('B'),0)]
column_transformer = ColumnTransformer(transformers)
steps = [('scaler',RobustScaler()), ('transformer', column_transformer)]
pipeline = Pipeline(steps)
dt_test = np.zeros((1000,2))
pipeline.fit_transform(dt_test)
for name,step in pipeline.named_steps.items():
if hasattr(step, 'get_feature_names'):
print(step.get_feature_names())
为了获得更具代表性的示例,我添加了 RobustScaler 并将 ColumnTransformer 嵌套在 Pipeline 上。顺便说一句,你会发现我的 Venkatachalam 版本的方法来获取步骤的特征名称循环。您可以通过使用列表解析解压缩名称,将其变成一个更有用的变量:
[i for i in v.get_feature_names() for k, v in pipeline.named_steps.items() if hasattr(v,'get_feature_names')]
因此,使用 dt_test 和估计器来了解特征名称是如何构建的,以及它是如何在 get_feature_names() 中连接的。
这是另一个使用输入列输出 2 列的转换器示例:
class testEstimator3(BaseEstimator,TransformerMixin):
def __init__(self,string):
self.string = string
def fit(self,X):
self.unique = np.unique(X)[0]
return self
def transform(self,X):
return np.concatenate((X.reshape(-1,1), np.full(X.shape,self.string).reshape(-1,1)), axis = 1)
def get_feature_names(self):
return list((self.unique,self.string))
dt_test2 = np.concatenate((np.full((1000,1),'A'),np.full((1000,1),'B')), axis = 1)
transformers = [('first_transformer',testEstimator3('A'),1), ('second_transformer',testEstimator3('B'),0)]
column_transformer = ColumnTransformer(transformers)
steps = [('transformer', column_transformer)]
pipeline = Pipeline(steps)
pipeline.fit_transform(dt_test2)
for step in pipeline.steps:
if hasattr(step[1], 'get_feature_names'):
print(step[1].get_feature_names())