我想将输出 np 数组与功能相匹配以创建新的 pandas 数据框
这是我的管道:
from sklearn.pipeline import Pipeline
# Categorical pipeline
categorical_preprocessing = Pipeline(
[
('Imputation', SimpleImputer(missing_values=np.nan, strategy='most_frequent')),
('Ordinal encoding', OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)),
]
)
# Continuous pipeline
continuous_preprocessing = Pipeline(
[
('Imputation', SimpleImputer(missing_values=np.nan, strategy='mean')),
('Scaling', StandardScaler())
]
)
# Creating preprocessing pipeline
preprocessing = make_column_transformer(
(continuous_preprocessing, continuous_cols),
(categorical_preprocessing, categorical_cols),
)
# Final pipeline
pipeline = Pipeline(
[('Preprocessing', preprocessing)]
)
Run Code Online (Sandbox Code Playgroud)
我是这样称呼它的:
X_train = pipeline.fit_transform(X_train)
X_val = pipeline.transform(X_val)
X_test = pipeline.transform(X_test)
Run Code Online (Sandbox Code Playgroud)
这是我在尝试获取功能名称时得到的结果:
pipeline['Preprocessing'].transformers_[1][1]['Ordinal encoding'].get_feature_names()
Run Code Online (Sandbox Code Playgroud)
出去:
AttributeError: 'OrdinalEncoder' object has no …Run Code Online (Sandbox Code Playgroud) 对于这个库来说,这似乎是一个非常重要的问题,到目前为止,我没有一个决定性的答案,尽管在大多数情况下,答案是“不”。
现在,任何使用transformerapi的方法都会sklearn返回一个numpy数组作为其结果。通常这很好,但是如果您将一个扩展或减少列数的多步骤过程链接在一起,则没有一种干净的方法来跟踪它们与原始列标签的关系将使使用此部分内容变得困难。充分发挥图书馆的作用。
例如,这是我最近使用的一个片段,其中无法将新列映射到数据集中的原始列是一个很大的缺点:
numeric_columns = train.select_dtypes(include=np.number).columns.tolist()
cat_columns = train.select_dtypes(include=np.object).columns.tolist()
numeric_pipeline = make_pipeline(SimpleImputer(strategy='median'), StandardScaler())
cat_pipeline = make_pipeline(SimpleImputer(strategy='most_frequent'), OneHotEncoder())
transformers = [
('num', numeric_pipeline, numeric_columns),
('cat', cat_pipeline, cat_columns)
]
combined_pipe = ColumnTransformer(transformers)
train_clean = combined_pipe.fit_transform(train)
test_clean = combined_pipe.transform(test)
Run Code Online (Sandbox Code Playgroud)
在此示例中,我使用拆分了数据集ColumnTransformer,然后使用了OneHotEncoder,添加了其他列,因此列的排列方式与我开始时的排列方式不同。
如果我使用使用相同API的不同模块,则可以轻松地进行不同的安排。 OrdinalEncoer,select_k_best等等。
如果您要进行多步转换,是否可以始终如一地查看新列与原始数据集之间的关系?
有一个关于它的广泛讨论这里,但我不认为有什么已经没有最终确定。