编辑:实际上,Peter 在 ColumnTransformer 文档 中回答了这个问题:
转换后的特征矩阵中的列顺序遵循转换器列表中指定的列顺序。未在结果转换的特征矩阵中指定的原始特征矩阵的列将被删除,除非在 passthrough 关键字中指定。使用 passthrough 指定的这些列将被添加到转换器的输出右侧。
为了完整 Venkatachalam 的回答,在 Paul 的评论中,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和estimators的参数,以了解特征名称是如何构建的,并在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())
StandardScaler()
没有get_feature_names()
。我们需要稍后将数字字段和独热编码字段的字段名组合起来吗?是否有其他 API 可以提供完整的特征名称? - Ozkan Serttas