scikit-learn: трансформер для выбора столбцов по имени - PullRequest
0 голосов
/ 02 мая 2020

Контекст

Я работаю с 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)

Ожидаемое решение

Решение Мне нужна труба дополнительный шаг трансформатора, роль которого исключительно для выбранного столбца ["a", "d"] поэтому ожидаемый результат:

array([[-1.,  1.],
       [ 1., -1.]])

1 Ответ

2 голосов
/ 02 мая 2020

Я думаю, что вы должны использовать Pipeline of sklearn и следующий класс в этом Pipeline (текущий 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...