как применить методы предварительной обработки к нескольким столбцам одновременно в sklearn

Мой вопрос: у меня так много столбцов в моем фрейме данных pandas, и я пытаюсь применить предварительную обработку sklearn, используя сопоставитель фреймов данных из библиотеки sklearn-pandas, такой как

mapper= DataFrameMapper([
    ('gender',sklearn.preprocessing.LabelBinarizer()),
    ('gradelevel',sklearn.preprocessing.LabelEncoder()),
    ('subject',sklearn.preprocessing.LabelEncoder()),
    ('districtid',sklearn.preprocessing.LabelEncoder()),
    ('sbmRate',sklearn.preprocessing.StandardScaler()),
    ('pRate',sklearn.preprocessing.StandardScaler()),
    ('assn1',sklearn.preprocessing.StandardScaler()),
    ('assn2',sklearn.preprocessing.StandardScaler()),
    ('assn3',sklearn.preprocessing.StandardScaler()),
    ('assn4',sklearn.preprocessing.StandardScaler()),
    ('assn5',sklearn.preprocessing.StandardScaler()),
    ('attd1',sklearn.preprocessing.StandardScaler()),
    ('attd2',sklearn.preprocessing.StandardScaler()),
    ('attd3',sklearn.preprocessing.StandardScaler()),
    ('attd4',sklearn.preprocessing.StandardScaler()),
    ('attd5',sklearn.preprocessing.StandardScaler()),
    ('sbm1',sklearn.preprocessing.StandardScaler()),
    ('sbm2',sklearn.preprocessing.StandardScaler()),
    ('sbm3',sklearn.preprocessing.StandardScaler()),
    ('sbm4',sklearn.preprocessing.StandardScaler()),
    ('sbm5',sklearn.preprocessing.StandardScaler())
 ])

Мне просто интересно, есть ли еще один более краткий способ предварительной обработки многих переменных за один раз, не записывая их явно.

Еще одна вещь, которую я нашел немного раздражающей, это то, что когда я преобразовал весь фрейм данных pandas в массивы, с которыми может работать sklearn, они потеряют функции имени столбца, что очень усложняет выбор. Кто-нибудь знает, как сохранить имена столбцов в качестве ключа при изменении кадров данных pandas на массивы np?

Большое спасибо!


person MYjx    schedule 14.07.2014    source источник
comment
Я бы просто создал новый закодированный столбец и передал его в scikit, чтобы узнать, если вам нужны красивые имена столбцов, вы можете написать функцию масштабирования, которая берет столбцы и применяет соответствующий кодировщик в зависимости от типа и генерирует новое имя столбца, добавляя префикс _encoded или аналогичный   -  person EdChum    schedule 15.07.2014
comment
Привет @EdChum Большое спасибо за ответ! Но я все еще не могу пройти часть prefix_encoded. Не могли бы вы опубликовать несколько кодов об этом? Большое вам спасибо за вашу помощь! :)   -  person MYjx    schedule 15.07.2014


Ответы (1)


from sklearn.preprocessing import LabelBinarizer, LabelEncoder, StandardScaler
from sklearn_pandas import DataFrameMapper

encoders = ['gradelevel', 'subject', 'districtid']
scalars = ['sbmRate', 'pRate', 'assn1', 'assn2', 'assn3', 'assn4', 'assn5', 'attd1', 'attd2', 'attd3', 'attd4', 'attd5', 'sbm1', 'sbm2', 'sbm3', 'sbm4', 'sbm5']
mapper = DataFrameMapper(
    [('gender', LabelBinarizer())] +
    [(encoder, LabelEncoder()) for encoder in encoders] +
    [(scalar, StandardScaler()) for scalar in scalars]
)

Если вы делаете это часто, вы можете даже написать свою собственную функцию:

mapper = data_frame_mapper(binarizers=['gender'],
    encoders=['gradelevel', 'subject', 'districtid'],
    scalars=['sbmRate', 'pRate', 'assn1', 'assn2', 'assn3', 'assn4', 'assn5', 'attd1', 'attd2', 'attd3', 'attd4', 'attd5', 'sbm1', 'sbm2', 'sbm3', 'sbm4', 'sbm5'])
person U2EF1    schedule 14.07.2014
comment
Привет @ U2EF1 Большое спасибо за ответ! Но знаете ли вы, как сохранить имя столбца, когда я изменяю их в массив np? Большое спасибо!! - person MYjx; 15.07.2014
comment
также я не могу понять, что такое +\ для... Я думаю, что это своего рода разделитель для двух строк кода. Почему запятая здесь не работает? извините, я действительно новичок в мире Python. Спасибо еще раз! - person MYjx; 15.07.2014
comment
@MYjx Я не знаю, как продвигать ваши столбцы. У Numpy есть структурированные массивы, но я не уверен, что с ними сделает sklearn. И вы правы, \ просто позволяет продолжить строку, но здесь, внутри скобок, это не нужно. - person U2EF1; 16.07.2014