仅在某些列 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),
])
理想情况下,您应该保存拟合的组合并使用它来转换生产数据,而不是使用特征名称来协调不同的类别。
你也应该只在训练集上拟合这个组合,单独转换测试集。
我已经阅读了很多关于此的帖子,这些帖子引用了 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),
])
理想情况下,您应该保存拟合的组合并使用它来转换生产数据,而不是使用特征名称来协调不同的类别。
你也应该只在训练集上拟合这个组合,单独转换测试集。