Архив метки: label encoding

Два примера Label Encoding или переводим строки в числа в pandas.

При решении задач машинного обучения, часто приходится иметь дело со строковыми параметрами. Чаще всего это категориальные фичи, например названия городов, цвета, должность итд. Некоторые библиотеки могут изначально работать со строковыми параметрами, но для большинства предварительно надо перевести буквы в цифры. Более того, это даже очень рекомендуется т.к. в числовом виде будет использоваться меньше оперативной памяти для хранения обучающей матрицы. Процесс перевода строковых фич (labels) в числовые фичи называется label encoding.

В данном посте будет предложено два практических способа label encoding (не путать с onehot encoding) для дата фреймов pandas. Таким образом у нас есть DataFrame train с категориальными фичами, которые надо преобразовать с помощью метода label encoding.

Способ 1.
Используя библиотеку sklearn.

from sklearn import preprocessing
import pandas as pd

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
cat_cols = ['city', 'color', 'position']

for col in cat_cols:
    lbl = preprocessing.LabelEncoder()
    lbl.fit(list(train[col].values.astype('str')) + list(test[col].values.astype('str')))
    print(lbl.classes_)  # взглянем на категориальные классы
    train[col] = lbl.transform(list(train[col].values.astype('str')))
    test[col] = lbl.transform(list(test[col].values.astype('str')))

Способ 2.
Этот способ основан на методе factorize из библиотеки pandas, поэтому если Вы не используете sklearn — можно «cэкономить» на импортах

import pandas as pd
# Сначала покажем классический пример
labels, uniques = pd.factorize(['b', 'b', 'a', 'c', 'b'])
print(labels)  # array([0, 0, 1, 2, 0])
print(uniques)  # ['b', 'a', 'c']

# а теперь пройдемся по всем категориальным колонкам
cat_cols = ['city', 'color', 'position']
for col in cat_cols:
    train[col], _ = pd.factorize(train[col])

Таким образом в обоих способах все строковые значения фич будут заменены на соответсвующие целочисленные значения, что позволит использовать меньше памяти и без дополнительной обработки запускать обучение в разных библиотеках.

Важное замечание, если Вы планируете использовать только линейные модели то onehot encoding сделать всё-таки придется, иначе линейная разделимость будет недостаточной. Для методов же, основанных на деревьях и градиентном спуске label encoding будет достаточно.