如何获得功能名称时,使用一个热编码器只对某些列sklearn



我读了很多关于这方面的文章,这些文章引用了sklearn的get_feature_names(),现在似乎已经被弃用并被get_feature_names_out所取代,这两个我都不能开始工作。似乎也没有办法在ColumnTransformer类中使用get_feature_names(或get_feature_names_out)。所以我试图适应和转换我的数字列与SimpleImputer,然后StandardScaler类,然后SimpleImpute (' most_frequency ')和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

我完全迷路了,也打开了一个更容易的方法来获得特征名称,这样我就可以确保我在训练/测试后运行这个模型的prod数据具有与模型训练期望的完全相同的特征(这是这里的根本问题)。

如果我"找错对象"通过尝试获得在根本问题中概述的原因的功能名称,我也更愿意得到纠正。下面是我的代码:

#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),
])

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

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

相关内容

最新更新