scikit-learn:按名称选择列的转换器

Sey*_*our 2 python scikit-learn

语境

我正在使用 scikit-learn 并寻找一种转换器,它允许我简单地选择要保留的列或要删除的列。

问题

在实践中,我想在我的管道中包含一个额外的转换器步骤,允许我选择保留或删除哪些列。我知道在下面的示例中,我可以简单地使用其余部分,但这在我需要参数化列选择以便轻松将其应用于训练、测试和最终评分的实际实现中不起作用。

例子

import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn import preprocessing
prep_pipeline = ColumnTransformer(transformers=[("std_num", preprocessing.StandardScaler(), ["a", "b"])],
                                  remainder = "passthrough")
X = pd.DataFrame([[0., 1., 2., 2.],
              [1., 1., 0., 1.]])
X.columns = ["a", "b", "c", "d"]
prep_pipeline.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)

预期解决方案

我需要管道一个额外的变压器步骤的解决方案,它的作用是专门针对选定的列 ["a", "d"] 因此预期的输出是:

array([[-1.,  1.],
       [ 1., -1.]])
Run Code Online (Sandbox Code Playgroud)

hat*_*oor 5

我认为您应该使用 sklearn 的管道和该管道中的以下类(当前 StandardScaler 不支持缩放数据框的部分)

import pandas as pd
from sklearn.base import BaseEstimator, TransformerMixin

class DropSomeColumns(BaseEstimator, TransformerMixin):

    def __init__(self, cols):
        if not isinstance(cols, list):
            self.cols = [cols]
        else:
            self.cols = cols

    def fit(self, X: pd.DataFrame, y: pd.Series):
        # there is nothing to fit
        return self

    def transform(self, X:pd.DataFrame):
        X = X.copy()
        return X[self.cols]
Run Code Online (Sandbox Code Playgroud)

  • @Seymour我猜你无法通过使用ColumnTransformer来实现你的愿望 - 你不能使用sklearn Pipeline类来代替? (2认同)