为啥我在 Sklearn 管道中的 OneHotEncoding 后得到的列比预期的多?

Posted

技术标签:

【中文标题】为啥我在 Sklearn 管道中的 OneHotEncoding 后得到的列比预期的多?【英文标题】:Why I get more columns than expected after OneHotEncoding in a Sklearn Pipeline?为什么我在 Sklearn 管道中的 OneHotEncoding 后得到的列比预期的多? 【发布时间】:2021-09-04 02:29:55 【问题描述】:

我正在使用 sklearn 管道来预处理我的数据。

from sklearn.pipeline import Pipeline
from sklearn.impute import KNNImputer
from sklearn.preprocessing import StandardScaler, LabelEncoder, OneHotEncoder

numeric_transformer = Pipeline(steps=[('scaler', StandardScaler()),
    ('imputer', KNNImputer(n_neighbors=2,weights='uniform', metric='nan_euclidean', add_indicator=True))
   ])
categorical_transformer = Pipeline(steps=[ 
    ('one_hot_encoder', OneHotEncoder(sparse=False, handle_unknown='ignore'))])


from sklearn.compose import make_column_selector as selector

numeric_features = ['Latitud','Longitud','Habitaciones','Dormitorios','Baños','Superficie_Total','Superficie_cubierta']
categorical_features = ['Tipo_de_propiedad']
from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
   transformers=[
    ('numeric', numeric_transformer, numeric_features, selector(dtype_exclude="category"))
   ,('categorical', categorical_transformer, categorical_features, selector(dtype_include="category"))])

特征Tipo_de_propiedad 有 3 个类别:'Departamento'、'Casa'、'PH'。所以其他 7 个特征加上这些假人应该在转换后给我 10 个,但是当我应用 fit_transform 时,它返回 14 个特征。

train_transfor=pd.DataFrame(preprocessor.fit_transform(X_train))
train_transfor.head()

当我使用pd.get_dummies 时效果很好,但我不能用它来申请Pipeline; OneHotEncoder 很有用,因为我可以适应训练集并在测试集上进行转换。

dummy=pd.get_dummies(df30[["Tipo_de_propiedad"]])
df_new=pd.concat([df30,dummy],axis=1)
df_new.head()

【问题讨论】:

【参考方案1】:

您的KNNImputer 使用了参数add_indicator=True,因此附加列可能是您的某些数字列的缺失指示符。

【讨论】:

Ben,非常感谢,您知道如何查看列的原始名称吗?如图所示,经过预处理后,列名变为数字。 ColumnTransformerOneHotEncoder 具有方法 get_feature_names,但 PipelineKNNImputerStandardScaler 没有。目前正在进行工作以使此功能更加完整,但现在您需要手动完成。不过,这是一个相对独立的问题;如果您提出新问题,我(或其他人)可能可以提供手动方法。

以上是关于为啥我在 Sklearn 管道中的 OneHotEncoding 后得到的列比预期的多?的主要内容,如果未能解决你的问题,请参考以下文章

为什么我在python中的sklearn中使用管道获取不同的值而没有管道

为啥我的 sklearn.pipeline 中预处理方法的输出不对齐?

我在 python 中使用 sklearn 进行文本分类的管道配置

sklearn 转换管道和功能联合

如何从管道中的 sklearn TFIDF Vectorizer 返回数据帧?

管道中的 sklearn 函数转换器