Горячее кодирование
У меня есть 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
)