仅在某些列 sklearn 上使用 onehot 编码器时如何获取特征名称

How to get feature names when using onehot encoder on only certain columns sklearn

我已经阅读了很多关于此的帖子,这些帖子引用了 sklearn 中的 get_feature_names(),它现在似乎已被弃用并被 get_feature_names_out 取代,这两个我都无法开始工作。似乎也无法将 get_feature_names(或 get_feature_names_out)与 ColumnTransformer class 一起使用。因此,我尝试使用 SimpleImputer 和 StandardScaler class 然后是 SimpleImpute ('most_frequent') 和 OneHotEncode 对分类变量进行拟合和转换我的数字列。我 运行 它们都是单独的,因为我不能将它们放入管道中,然后我尝试 get_feature_names 结果是:

ValueError: input_features should have length equal to number of features (5), got 11

我也尝试过获取分类特征和数字特征的特征名称,每个特征分别给出以下错误:

ValueError: input_features should have length equal to number of features (5), got 121942

ValueError: input_features should have length equal to number of features (5), got 121942

我完全迷路了,也想用一种更简单的方法来获取功能名称,这样我就可以确保 运行 这个模型在 training/testing 之后的产品数据完全相同模型训练期望的特征(这是这里的根本问题)。

如果我通过尝试获取根本问题中概述的推理的特征名称来“树错树”,我也非常愿意得到纠正。这是我的代码:

#ONE HOT
import sklearn
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# !pip install -U scikit-learn
print('The scikit-learn version is {}.'.format(sklearn.__version__))

numeric_columns = X.select_dtypes(include=['int64','float64']).columns
cat_columns = X.select_dtypes(include=['object']).columns


si_num = SimpleImputer(strategy='median')
si_cat = SimpleImputer(strategy='most_frequent')

ss = StandardScaler()
ohe = OneHotEncoder()

si_num.fit_transform(X[numeric_columns])
si_cat.fit_transform(X[cat_columns])
ss.fit_transform(X[numeric_columns])
ohe.fit_transform(X[cat_columns])

ohe.get_feature_names(X[numeric_columns])

谢谢!

我认为这应该作为一个单一的复合估计器工作,它可以完成所有转换并提供 get_feature_names_out:

num_pipe = Pipeline([
    ("imp", si_num),
    ("scale", ss),
])
cat_pipe = Pipeline([
    ("imp", si_cat),
    ("ohe", ohe),
])
preproc = ColumnTransformer([
    ("num", num_pipe, numeric_columns),
    ("cat", cat_pipe, cat_columns),
])

理想情况下,您应该保存拟合的组合并使用它来转换生产数据,而不是使用特征名称来协调不同的类别。

你也应该只在训练集上拟合这个组合,单独转换测试集。