gpt4 book ai didi

python - 在 sklearn 管道后获取特征名称

转载 作者:行者123 更新时间:2023-12-05 02:33:27 24 4
gpt4 key购买 nike

我想将输出的 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)]
)

我是这样调用它的:

X_train = pipeline.fit_transform(X_train)
X_val = pipeline.transform(X_val)
X_test = pipeline.transform(X_test)

这是我在尝试获取特征名称时得到的结果:

pipeline['Preprocessing'].transformers_[1][1]['Ordinal encoding'].get_feature_names()

输出:

AttributeError: 'OrdinalEncoder' object has no attribute 'get_feature_names'

这是一个类似的 SO 问题:Sklearn Pipeline: Get feature names after OneHotEncode In ColumnTransformer

最佳答案

要点是,到今天为止,一些转换器确实公开了一个方法 .get_feature_names_out() 而另一些则没有,这会产生一些问题 - 例如 - 每当你想创建一个 格式良好 DataFrame 来自 PipelineColumnTransformer 实例输出的 np.array。 (相反,afaik,.get_feature_names() 在最新版本中被弃用,取而代之的是 .get_feature_names_out())。

关于您正在使用的变压器,StandardScaler属于公开该方法的第一类变压器,而两者都是SimpleImputerOrdinalEncoder确实属于第二种。文档在方法 段落中显示公开的方法。如前所述,这会在您的 pipeline 上执行类似 pd.DataFrame(pipeline.fit_transform(X_train), columns=pipeline.get_feature_names_out()) 的操作时导致问题,但它会在您的 categorical_preprocessingcontinuous_preprocessing 管道(因为在这两种情况下至少有一个转换器缺少该方法)和 preprocessing ColumnTransformer 实例。

sklearn 正在尝试使用 .get_feature_names_out() 方法丰富所有 估计器。它在 github issue #21308 内被跟踪,如您所见,它在许多 PR 中有分支(每个 PR 都处理一个特定的模块)。例如,issue #21079对于 preprocessing 模块,它将丰富 OrdinalEncoder 等,issue #21078 impute 模块,这将丰富 SimpleImputer。我想一旦所有引用的 PR 合并,它们就会在新版本中可用。

与此同时,imo,您应该使用可能适合您需求的自定义解决方案。这是一个简单的示例,它不一定符合您的需要,但旨在提供一种(可能的)处理方式:

import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OrdinalEncoder, StandardScaler
from sklearn.compose import make_column_transformer, make_column_selector

X = pd.DataFrame({'city': ['London', 'London', 'Paris', 'Sallisaw', ''],
'title': ['His Last Bow', 'How Watson Learned the Trick', 'A Moveable Feast', 'The Grapes of Wrath', 'The Jungle'],
'expert_rating': [5, 3, 4, 5, np.NaN],
'user_rating': [4, 5, 4, np.NaN, 3]})
X

enter image description here

num_cols = X.select_dtypes(include=np.number).columns.tolist()
cat_cols = X.select_dtypes(exclude=np.number).columns.tolist()

# Categorical pipeline
categorical_preprocessing = Pipeline(
[
('Imputation', SimpleImputer(missing_values='', 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, num_cols),
(categorical_preprocessing, cat_cols),
)

# Final pipeline
pipeline = Pipeline(
[('Preprocessing', preprocessing)]
)

X_trans = pipeline.fit_transform(X)

pd.DataFrame(X_trans, columns= num_cols + cat_cols)

enter image description here

关于python - 在 sklearn 管道后获取特征名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70993316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com