Горячее кодирование

У меня есть CSV-файл, как это:

text short_text category
...  ...        ...

Я открыл файл и сохранил его во фрейме данных Pandas следующим образом:

filepath = 'path/data.csv'
train = pd.read_csv(filepath, header=0, delimiter=",")

Поля категорий для каждой записи содержат список категорий, который представляет собой строку, а каждая категория находится в одинарных кавычках, например:

['Adult'   'Aged'   'Aged   80 and over'   'Benzhydryl Compounds/*therapeutic use'   'Cresols/*therapeutic use'   'Double-Blind Method'   'Female'   'Humans'   'Male'   'Middle Aged'   'Muscarinic Antagonists/*therapeutic use'   '*Phenylpropanolamine'   'Tolterodine Tartrate'   'Urinary Incontinence/*drug therapy']

Я хочу использовать это для машинного обучения, используя одно горячее кодирование. Я понимаю, что могу реализовать это с помощью пакета scleit-learn sklearn.preprocessing, но не знаю, как это сделать.

Примечание: у меня нет списка всех возможных категорий.

2 ответа

Решение

В качестве альтернативы ответу piRSquared вы можете использовать sklearn.preprocessing.MultiLabelBinarizer,

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
pd.concat([
    df.drop('category', 1),
    pd.DataFrame(mlb.fit_transform(df['category']), columns=mlb.classes_),
], 1)

В моих тестах это было на несколько порядков быстрее, особенно для больших наборов данных.

Ты можешь использовать pd.value_counts помогать

df = pd.DataFrame(dict(
        text=list('ABC'),
        short_text=list('XYZ'),
        category=[list('abc'), list('def'), list('abefxy')]
    ))

df.category.apply(pd.value_counts).fillna(0).astype(int)

введите описание изображения здесь

или все вместе

pd.concat(
    [df.drop('category', 1),
     df.category.apply(pd.value_counts).fillna(0).astype(int)],
    axis=1
)

введите описание изображения здесь

Другие вопросы по тегам