Использование scikit StandardScaler в конвейере для подмножества столбцов данных Pandas - PullRequest
0 голосов
/ 13 мая 2018

Я хочу использовать sklearn.preprocessing.StandardScaler для подмножества столбцов панд данных.Вне конвейера это тривиально:

df[['A', 'B']] = scaler.fit_transform(df[['A', 'B']])

Но теперь предположим, что у меня есть столбец 'C' в df типа string и следующее определение конвейера

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

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

df_scaled = pipeline.fit_transform(df)

Как мне сказать StandardScalerтолько шкалы A и B?

Я привык к конвейерам SparkML, где масштабируемые объекты могут быть переданы в конструктор компонента масштабирования:

normalizer = Normalizer(inputCol="features", outputCol="features_norm", p=1.0)

Примечание. Столбец объектов содержитразреженный вектор со всеми столбцами числовых объектов, созданными Spark's VectorAssembler

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Вы можете проверить sklearn-pandas , которая предлагает интеграцию Pandas DataFrame и sklearn, например. с помощью DataFrameMapper:

mapper = DataFrameMapper([
...     (list_of_columnnames, StandardScaler())
... ])

I, если вам не нужны внешние зависимости, вы можете использовать простой собственный преобразователь, как я ответил здесь :

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())
0 голосов
/ 13 мая 2018

В прямом sklearn вам нужно использовать FunctionTransformer вместе с FeatureUnion. То есть ваш конвейер будет выглядеть так:

pipeline =  Pipeline([
            ('scale_sum', feature_union(...))
        ])

, где в объединении объектов одна функция применяет стандартный масштабер к некоторым столбцам, а другая пропускает другие столбцы без изменений.


Используя Козерог (который я написал в соавторстве для улучшения работы 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...