如何使用管道 API 标记编码?

How do I Label Encode using the Pipeline API?

我想通过 scikit 学习管道合并标签编码。不幸的是,LabelEncoder() 被管道 API 破坏了,所以现在这不是一个选项。我尝试创建自己的 class,它调用 .map() 将类别映射到标签:

from sklearn.base import TransformerMixin
from sklearn.base import BaseEstimator

class RatingEncoder(BaseEstimator, TransformerMixin):
    """Takes in dataframe, converts all categorical Ratings columns into numerical Ratings columns
    via label-encoding"""

    def __init__(self):
        pass

    def fit(self, df, y=None):
        return self

    def transform(self, df, y=None):
        """"Transform all of the categorical ratings columns into numerical ratings columns"""
        for feature in df.columns:
            df[feature] = df[feature].map({
                "Po"   : 1,
                "Fa"   : 2,
                "TA"   : 3,
                "Gd"   : 4,
                "Ex"   : 5,
            })
        return df

然后,我设置了以下管道:

def select_numeric_features(df):
    return df.select_dtypes(include=np.number).columns

def select_categorical_features(df):
    return df.select_dtypes(exclude=np.number).columns

def select_rated_features(df):
    rated_features = []
    for column in df:
        # This criteria determines if a column is a 'rated column'
        if any(df[column] == 'TA'):
            rated_features.append(column)
    return rated_features

pipeline = make_column_transformer(

    (RatingsTransformer(), select_rated_features),
    (SimpleImputer(strategy='constant', fill_value='None'), select_categorical_features),
    (SimpleImputer(strategy='constant', fill_value=0), select_numeric_features),
    remainder='passthrough'

)

问题是在 RatingsTransformer() 步骤之后,分类 'ratings' 列应该变成数字列。但是,此更改不会显示在列转换器的列选择部分,因此 select_numerical_featuresselect_categorical_features 将选择不正确的 'ratings' 列,就好像它们没有从类别中映射一样到价值观。基本上,列转换器不使用在管道中间更新的列。有什么解决方法吗?或者,是否有使用管道 API?

的更简单的 LabelEncoding 解决方案

LabelEncoder 是编码标签,因此是 y(或目标)。如果你想编码数据(即 X),你可以使用 OneHotEncoderOrdinalEncoder,它们可以很容易地集成到 scikit-learn 的 Pipeline 中。

在您的情况下,您似乎想要对数据进行序号编码。

from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OrdinalEncoder

preprocessor = make_pipeline(
    SimpleImputer(strategy="constant", fill_value="missing"),
    OrdinalEncoder()
)

preprocessor.fit_transform(X_train)

可以在此处找到更完整的示例:https://scikit-learn.org/stable/auto_examples/compose/plot_column_transformer_mixed_types.html#sphx-glr-auto-examples-compose-plot-column-transformer-mixed-types-py

如果分类器不是线性模型(例如 RandomForestClassifier),您可以想象使用 OrdinalEncoder 而不是 OneHotEncoder