在Pandas数据帧列的子集上使用Pipeline中的scikit StandardScaler

Rom*_*ler 9 python pandas scikit-learn

我想在pandas dataframe列的子集上使用sklearn.preprocessing.StandardScaler.在管道之外,这是微不足道的:

df[['A', 'B']] = scaler.fit_transform(df[['A', 'B']])
Run Code Online (Sandbox Code Playgroud)

但现在假设我在类型字符串的df中有列'C',以及下面的管道定义

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

pipeline =  Pipeline([
                ('standard', StandardScaler())
            ])

df_scaled = pipeline.fit_transform(df)
Run Code Online (Sandbox Code Playgroud)

如何告诉StandardScaler只扩展A列和B列?

我已经习惯了SparkML管道,其中要缩放的特征可以传递给缩放器组件的构造函数:

normalizer = Normalizer(inputCol="features", outputCol="features_norm", p=1.0)
Run Code Online (Sandbox Code Playgroud)

注意:要素列包含稀疏向量,其中包含Spark的VectorAssembler创建的所有数字要素列

Mar*_* V. 7

您可以查看sklearn-pandas,它提供了 Pandas DataFrame 和 sklearn 的集成,例如与 DataFrameMapper:

mapper = DataFrameMapper([
...     (list_of_columnnames, StandardScaler())
... ])
Run Code Online (Sandbox Code Playgroud)

如果你不需要外部依赖,你可以使用一个简单的自己的转换器,正如我在这里回答的那样:

class Columns(BaseEstimator, TransformerMixin):
    def __init__(self, names=None):
        self.names = names

    def fit(self, X, y=None, **fit_params):
        return self

    def transform(self, X):
        return X[self.names]

pipe =  make_pipeline(Columns(names=list_of_columnnames),StandardScaler())
Run Code Online (Sandbox Code Playgroud)


Ami*_*ory 4

在直接 sklearn 中,您需要FunctionTransformer与 一起使用FeatureUnion。也就是说,您的管道将如下所示:

pipeline =  Pipeline([
            ('scale_sum', feature_union(...))
        ])
Run Code Online (Sandbox Code Playgroud)

在功能联合中,一个函数将标准缩放器应用于某些列,另一个函数将不受影响地传递其他列。


使用Ibex(我与他人共同编写的正是为了让 sklearn 和 pandas 更好地工作),您可以将其编写如下:

from ibex.sklearn.preprocessing import StandardScaler
from ibex import trans

pipeline = (trans(StandardScaler(), in_cols=['A', 'B']) + trans(None, ['c', 'd'])) | <other pipeline steps>
Run Code Online (Sandbox Code Playgroud)