Получить сопоставления меток из кодировщика меток - PullRequest
0 голосов
/ 13 июня 2018

Я использую следующий код для сопоставления списка строковых меток со списком значений, закодированных в горячем виде:

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder  
labelEncoder = LabelEncoder()
targets = ["blue","green","blue","blue","green"]    
integerEncoded = labelEncoder.fit_transform(targets)

На более позднем этапе мне нужно точно знать, какие строковые метки являютсясопоставлены с целочисленными значениями.

Т.е. мне нужно что-то подобное:

integerMapping = GetIntegerMapping(labelEncoder)

Где

integerMapping["blue"]

должно возвращать значение int, которому все "синие" метки

и

integerMapping["green"]

Должно возвращать значение int, в которое отображаются все "зеленые" метки.

Как я могу получить этот integerMapping диктонар?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Существует атрибут classes_, как только кодировщик этикеток установлен.Целое число, используемое для замены значения метки, является индексом метки в этом массиве.Таким образом, вы можете получить сопоставление с:

le = LabelEncoder()
le.fit(targets)
integer_mapping = {l: i for i, l in enumerate(le.classes_)}
0 голосов
/ 13 июня 2018

Вы можете использовать LabelEncoder.classes_ и LabelEncoder.transform(), чтобы получить отношения, о которых вы просите.Следующая функция должна дать вам то, что вам нужно.

def get_integer_mapping(le):
    '''
    Return a dict mapping labels to their integer values
    from an SKlearn LabelEncoder
    le = a fitted SKlearn LabelEncoder
    '''
    res = {}
    for cl in le.classes_:
        res.update({cl:le.transform([cl])[0]})

    return res

Пример использования:

classes = ['blue', 'green']
le = LabelEncoder()
le.fit(classes)
integerMapping = get_integer_mapping(le)

integerMapping['blue']  # Returns 0
integerMapping['green']  # Returns 1

Если у вас очень большое количество классов, это может быть не очень быстро из-заЦикл for, но он должен хорошо работать для небольшого числа классов.

Обновление:

Только что рассчитал его на LabelEncoder, чтобы соответствовать 10000 классов.Вот результаты:

%timeit get_integer_mapping(le)
1 loop, best of 3: 17.1 s per loop

Это на самом деле более производительно, чем я ожидал.

...